[
  {
    "path": ".gitignore",
    "content": "# OSX leaves these everywhere on SMB shares\n._*\n\n# OSX trash\n.DS_Store\n\n# Eclipse files\n.classpath\n.project\n.settings/**\n\n# This is where the result of the go build goes\n/output/**\n/output\n/_output/**\n/_output\n\n# Emacs save files\n*~\n\\#*\\#\n.\\#*\n\n# Vim-related files\n[._]*.s[a-w][a-z]\n[._]s[a-w][a-z]\n*.un~\nSession.vim\n.netrwhist\n\n# Go test binaries\n*.test\n/hack/.test-cmd-auth\n\n# JUnit test output from ginkgo e2e tests\n/junit*.xml\n\n# Mercurial files\n**/.hg\n**/.hg*\n\n# Vagrant\n.vagrant\nnetwork_closure.sh\n\n# Compiled binaries in third_party\n/third_party/pkg\n\n# Also ignore etcd installed by hack/install-etcd.sh\n/third_party/etcd*\n\n# User cluster configs\n.kubeconfig\n\n.tags*\n\n# Web UI\nmaster/node_modules/\nmaster/npm-debug.log\nmaster/shared/config/development.json\nnpm-debug.log\n\n# Karma output\ntest_out\n\n# precommit temporary directories created by ./hack/verify-gendocs.sh and ./hack/lib/util.sh\n_tmp/\ndoc_tmp/\n\n# binaries\nkube-ui\n\n# artifacts\nmaster/npm-11278-00d1fb62/\nmaster/phantomjs/\nmaster/npm-5364-70388efc/\n.idea\n/app/\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nsudo: false\nnode_js:\n- '0.12'\n\ncache:\n  directories:\n    - master/node_modules\n\nbefore_install:\n  - export CHROME_BIN=chromium-browser\n  - export DISPLAY=:99.0\n  - sh -e /etc/init.d/xvfb start\n\ninstall:\n  # Update npm\n  - npm install -g npm@2.9.1\n  - npm --version\n  - cd master \n  - npm install\n  # todo: activate next line when E2E tests are fixed\n  # - ./node_modules/.bin/webdriver-manager update\n\nscript:\n- npm run build\n# run unit tests\n- ./node_modules/.bin/karma start karma.conf.js --singleRun=true --autoWatch=false\n# todo: fix E2E tests\n# - cd ../app && ../master/node_modules/.bin/http-server -p 8000 &\n# - cd ../master && node_modules/.bin/protractor protractor/conf.js\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your patches! Before we can take them, we have to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate Contributor License Agreement (CLA).\n\n  * If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html).\n  * If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html).\n\nFollow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests.\n\n## Contributing A Patch\n\n1. Submit an issue describing your proposed change to the repo in question.\n1. The repo owner will respond to your issue promptly.\n1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).\n1. Fork the desired repo, develop and test your code changes.\n1. Submit a pull request.\n\n## Protocols for Collaborative Development\n\nPlease read [this doc](docs/devel/collab.md) for information on how we're running development for the project.\nAlso take a look at the [development guide](docs/devel/development.md) for information on how to set up your environment, run tests, manage dependencies, etc.\n\n## Adding dependencies\n\nIf your patch depends on new packages, add that package with [`godep`](https://github.com/tools/godep).  Follow the [instructions to add a dependency](docs/devel/development.md#godep-and-dependency-management).\n\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/CONTRIBUTING.md?pixel)]()\n"
  },
  {
    "path": "Dockerfile",
    "content": "# Copyright 2015 The Kubernetes Authors. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM scratch\nMAINTAINER Tim St. Clair <stclair@google.com>\nADD kube-ui kube-ui\nEXPOSE 8080\nENTRYPOINT [\"/kube-ui\"]\n"
  },
  {
    "path": "Godeps/Godeps.json",
    "content": "{\n\t\"ImportPath\": \"k8s.io/kube-ui\",\n\t\"GoVersion\": \"go1.4.2\",\n\t\"Packages\": [\n\t\t\"./...\"\n\t],\n\t\"Deps\": [\n\t\t{\n\t\t\t\"ImportPath\": \"github.com/elazarl/go-bindata-assetfs\",\n\t\t\t\"Rev\": \"c57a80f1ab2ad67bafa83f5fd0b4c2ecbd253dd5\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "Godeps/Readme",
    "content": "This directory tree is generated automatically by godep.\n\nPlease do not edit.\n\nSee https://github.com/tools/godep for more information.\n"
  },
  {
    "path": "Godeps/_workspace/.gitignore",
    "content": "/pkg\n/bin\n"
  },
  {
    "path": "Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE",
    "content": "Copyright (c) 2014, Elazar Leibovich\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md",
    "content": "# go-bindata-assetfs\n\nServe embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`.\n\n[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs)\n\n### Installation\n\nInstall with\n\n    $ go get github.com/jteeuwen/go-bindata/...\n    $ go get github.com/elazarl/go-bindata-assetfs/...\n\n### Creating embedded data\n\nUsage is identical to [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) usage,\ninstead of running `go-bindata` run `go-bindata-assetfs`.\n\nThe tool will create a `bindata_assetfs.go` file, which contains the embedded data.\n\nA typical use case is\n\n    $ go-bindata-assetfs data/...\n\n### Using assetFS in your code\n\nThe generated file provides an `assetFS()` function that returns a `http.Filesystem`\nwrapping the embedded files. What you usually want to do is:\n\n    http.Handle(\"/\", http.FileServer(assetFS()))\n\nThis would run an HTTP server serving the embedded files.\n\n## Without running binary tool\n\nYou can always just run the `go-bindata` tool, and then\n\nuse\n\n     import \"github.com/elazarl/go-bindata-assetfs\"\n     ...\n     http.Handle(\"/\",\n        http.FileServer(\n        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: \"data\"}))\n\nto serve files embedded from the `data` directory.\n"
  },
  {
    "path": "Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go",
    "content": "package assetfs\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"time\"\n)\n\nvar (\n\tfileTimestamp = time.Now()\n)\n\n// FakeFile implements os.FileInfo interface for a given path and size\ntype FakeFile struct {\n\t// Path is the path of this file\n\tPath string\n\t// Dir marks of the path is a directory\n\tDir bool\n\t// Len is the length of the fake file, zero if it is a directory\n\tLen int64\n}\n\nfunc (f *FakeFile) Name() string {\n\t_, name := filepath.Split(f.Path)\n\treturn name\n}\n\nfunc (f *FakeFile) Mode() os.FileMode {\n\tmode := os.FileMode(0644)\n\tif f.Dir {\n\t\treturn mode | os.ModeDir\n\t}\n\treturn mode\n}\n\nfunc (f *FakeFile) ModTime() time.Time {\n\treturn fileTimestamp\n}\n\nfunc (f *FakeFile) Size() int64 {\n\treturn f.Len\n}\n\nfunc (f *FakeFile) IsDir() bool {\n\treturn f.Mode().IsDir()\n}\n\nfunc (f *FakeFile) Sys() interface{} {\n\treturn nil\n}\n\n// AssetFile implements http.File interface for a no-directory file with content\ntype AssetFile struct {\n\t*bytes.Reader\n\tio.Closer\n\tFakeFile\n}\n\nfunc NewAssetFile(name string, content []byte) *AssetFile {\n\treturn &AssetFile{\n\t\tbytes.NewReader(content),\n\t\tioutil.NopCloser(nil),\n\t\tFakeFile{name, false, int64(len(content))}}\n}\n\nfunc (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) {\n\treturn nil, errors.New(\"not a directory\")\n}\n\nfunc (f *AssetFile) Size() int64 {\n\treturn f.FakeFile.Size()\n}\n\nfunc (f *AssetFile) Stat() (os.FileInfo, error) {\n\treturn f, nil\n}\n\n// AssetDirectory implements http.File interface for a directory\ntype AssetDirectory struct {\n\tAssetFile\n\tChildrenRead int\n\tChildren     []os.FileInfo\n}\n\nfunc NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory {\n\tfileinfos := make([]os.FileInfo, 0, len(children))\n\tfor _, child := range children {\n\t\t_, err := fs.AssetDir(filepath.Join(name, child))\n\t\tfileinfos = append(fileinfos, &FakeFile{child, err == nil, 0})\n\t}\n\treturn &AssetDirectory{\n\t\tAssetFile{\n\t\t\tbytes.NewReader(nil),\n\t\t\tioutil.NopCloser(nil),\n\t\t\tFakeFile{name, true, 0},\n\t\t},\n\t\t0,\n\t\tfileinfos}\n}\n\nfunc (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) {\n\tif count <= 0 {\n\t\treturn f.Children, nil\n\t}\n\tif f.ChildrenRead+count > len(f.Children) {\n\t\tcount = len(f.Children) - f.ChildrenRead\n\t}\n\trv := f.Children[f.ChildrenRead : f.ChildrenRead+count]\n\tf.ChildrenRead += count\n\treturn rv, nil\n}\n\nfunc (f *AssetDirectory) Stat() (os.FileInfo, error) {\n\treturn f, nil\n}\n\n// AssetFS implements http.FileSystem, allowing\n// embedded files to be served from net/http package.\ntype AssetFS struct {\n\t// Asset should return content of file in path if exists\n\tAsset func(path string) ([]byte, error)\n\t// AssetDir should return list of files in the path\n\tAssetDir func(path string) ([]string, error)\n\t// Prefix would be prepended to http requests\n\tPrefix string\n}\n\nfunc (fs *AssetFS) Open(name string) (http.File, error) {\n\tname = path.Join(fs.Prefix, name)\n\tif len(name) > 0 && name[0] == '/' {\n\t\tname = name[1:]\n\t}\n\tif children, err := fs.AssetDir(name); err == nil {\n\t\treturn NewAssetDirectory(name, children, fs), nil\n\t}\n\tb, err := fs.Asset(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewAssetFile(name, b), nil\n}\n"
  },
  {
    "path": "Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go",
    "content": "// assetfs allows packages to serve static content embedded\n// with the go-bindata tool with the standard net/http package.\n//\n// See https://github.com/jteeuwen/go-bindata for more information\n// about embedding binary data with go-bindata.\n//\n// Usage example, after running\n//    $ go-bindata data/...\n// use:\n//     http.Handle(\"/\",\n//        http.FileServer(\n//        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: \"data\"}))\npackage assetfs\n"
  },
  {
    "path": "Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs/main.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nconst bindatafile = \"bindata.go\"\n\nfunc main() {\n\tif _, err := exec.LookPath(\"go-bindata\"); err != nil {\n\t\tfmt.Println(\"Cannot find go-bindata executable in path\")\n\t\tfmt.Println(\"Maybe you need: go get github.com/elazarl/go-bindata-assetfs/...\")\n\t\tos.Exit(1)\n\t}\n\tcmd := exec.Command(\"go-bindata\", os.Args[1:]...)\n\tcmd.Stdin = os.Stdin\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\tif err := cmd.Run(); err != nil {\n\t\tos.Exit(1)\n\t}\n\tin, err := os.Open(bindatafile)\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"Cannot read\", bindatafile, err)\n\t\treturn\n\t}\n\tout, err := os.Create(\"bindata_assetfs.go\")\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"Cannot write 'bindata_assetfs.go'\", err)\n\t\treturn\n\t}\n\tr := bufio.NewReader(in)\n\tdone := false\n\tfor line, isPrefix, err := r.ReadLine(); err == nil; line, isPrefix, err = r.ReadLine() {\n\t\tline = append(line, '\\n')\n\t\tif _, err := out.Write(line); err != nil {\n\t\t\tfmt.Fprintln(os.Stderr, \"Cannot write to 'bindata_assetfs.go'\", err)\n\t\t\treturn\n\t\t}\n\t\tif !done && !isPrefix && bytes.HasPrefix(line, []byte(\"import (\")) {\n\t\t\tfmt.Fprintln(out, \"\\t\\\"github.com/elazarl/go-bindata-assetfs\\\"\")\n\t\t\tdone = true\n\t\t}\n\t}\n\tfmt.Fprintln(out, `\nfunc assetFS() *assetfs.AssetFS {\n\tfor k := range _bintree.Children {\n\t\treturn &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: k}\n\t}\n\tpanic(\"unreachable\")\n}`)\n\t// Close files BEFORE remove calls (don't use defer).\n\tin.Close()\n\tout.Close()\n\tif err := os.Remove(bindatafile); err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"Cannot remove\", bindatafile, err)\n\t}\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Makefile",
    "content": "# Makefile for the Docker image gcr.io/kube-ui/kube-ui\n# MAINTAINER: Tim St. Clair <stclair@google.com>\n# If you update this image please check the tag value before pushing.\n\n.PHONY: all bindata container push clean\n\n# Keep this at dev, so no one accidentally blows away the latest published version.\nTAG = dev # current version: v5\nPREFIX = staging-k8s.gcr.io\n\nall: push\n\nbindata: data/datafile.go\n\t./build/build-ui.sh\n\nkube-ui: bindata server/kube-ui.go\n\tCGO_ENABLED=0 GOOS=linux godep go build -a -installsuffix cgo -ldflags '-w' ./server/kube-ui.go\n\ncontainer: kube-ui\n\tdocker build -t $(PREFIX)/kube-ui:$(TAG) .\n\npush: container\n\tgcloud docker push $(PREFIX)/kube-ui:$(TAG)\n\nclean:\n\trm -f kube-ui\n"
  },
  {
    "path": "README.md",
    "content": "\nJoin the UI discussion at: https://groups.google.com/forum/#!forum/kubernetes-sig-ui\n\nAlso please check out the new Dashboard for Kubernetes available at: https://github.com/kubernetes/dashboard\n\nThis codebase will be retired once the new and improved Dashboard is production ready.\n\n# Working with the Kubernetes UI\nThis document explains how to work with the Kubernetes UI. For information on how to access and use it, see [docs/ui.md](docs/ui.md).\n\n## Installing dependencies\nThere are two kinds of dependencies in the UI project: tools and frameworks. The tools help\nus manage and test the application. They are not part of the application. The frameworks, on the other hand, become part of the application, as described below.\n\n* We get the tools via `npm`, the [node package manager](https://www.npmjs.com/). \n* We get the frameworks via `bower`, a [client-side package manager](http://bower.io/).\n\nBefore you build the application for the first time, run this command from the `master` directory:\n\n```\nnpm install\n```\n\nIt creates a new directory, `master/node_modules`, which contains the tool dependencies.\n\n## Building and serving the app\n\n### Building the app for development\nTo build the application for development, run this command from the `master` directory:\n\n```\nnpm start\n```\n\nIt runs `bower install` to install and/or update the framework dependencies, and then `gulp`, a [JavaScript build system](http://gulpjs.com/), to generate a development version of the application.\n\nBower creates a new directory, `third_party/ui/bower_components`, which contains the framework dependencies. Each of them should be referenced in one of the `vendor.json` files below:\n\n* `master/vendor.base.json` - 3rd party vendor javascript files required to start the app. All of the dependencies referenced by this file are compiled into `base.js` and loaded before `app.js`.\n* `master/vendor.json` - 3rd party vendor js or css files required to make the app work, usually by lazy loading. All of the dependencies referenced by this file are compiled into `app/vendor`. (Note: some framework dependencies have been hand edited and checked into source control under `master/shared/vendor`.)\n\nThe default `gulp` target builds the application for development (e.g., without uglification of js files or minification of css files), and then starts a file watcher that rebuilds the generated files every time the source files are updated. (Note: the file watcher does not support adding or deleting files. It must be stopped and restarted to pick up additions or deletions).\n\nThe `app` directory and its contents are generated by the build. All of the other files are source or project files, such as tests, scripts, documentation and package manifests. (Note: the build output checked into source control is the production version, built with uglification and minification, as described below, so expect the build output to change if you build for development.)\n\n### Serving the app during development\n\nFor development you can serve the files locally by installing a web server as follows:\n\n```\nsudo npm install -g http-server\n```\n\nThe server can then be launched from the `app` directory as follows:\n\n```\ncd app\nhttp-server -a localhost -p 8001\n```\n\n`http-server` is convenient, since we're already using `npm`, but any web server hosting the `app` directory should work.\n\nNote that you'll need to tell the application where to find the api server by setting the value of the `k8sApiServer` configuration parameter in `master/shared/config/development.json` and then rebuilding the application. For example, for a cluster running locally at `localhost:8080`, as described [here](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/docs/getting-started-guides/locally.md), you'll want to set it as follows:\n\n```\n\"k8sApiServer\": \"http://localhost:8080/api/v1beta3\"\n```\n\n### Building the app for production\nTo build the application for production, run this command from the `master` directory:\n\n```\nnpm run build\n```\n\nLike `npm start`, it runs `bower install` to install and/or update the framework dependencies, but then it runs `gulp build` to generate a production version of the application. The `build` target builds the application for production (e.g., with uglification of js files and minification of css files), and does not run a file watcher, so that it can be used in automated build environments.\n\n### Serving the app in production\nThe app is served in production by `kube-apiserver` at:\n\n```\nhttps://<kubernetes-master>/ui/\n```\n\nwhich redirects to:\n\n```\nhttps://<kubernetes-master>/api/v1/proxy/namespaces/kube-system/services/kube-ui/\n```\n\n## Configuration\n### Configuration settings\nA json file can be used by `gulp` to automatically create angular constants. This is useful for setting per environment variables such as api endpoints.\n\n`master/shared/config/development.json` and `master/shared/config/production.json` are used for application wide configuration in development and production, respectively.\n\n* `master/shared/config/production.json` is kept under source control with default values for production.\n* `master/shared/config/development.json` is not kept under source control. Each developer can create a local version of the file by copy, paste and rename from `master/shared/config/development.example.json`, which is kept under source control with default values for development.\n\nThe configuration files for the current build environment are compiled into the intermediary `master/shared/config/generated-config.js`, which is then compiled into `app.js`.\n\n* Component configuration added to `master/components/<component name>/config/<environment>.json` is combined with the application wide configuration during the build.\n\nThe generated angular constant is named `ENV`. The shared configuration and component configurations each generate a nested object within it. For example:\n\n```\nmaster\n├── shared/config/development.json\n└── components\n    ├── dashboard/config/development.json\n    └── my_component/config/development.json\n```\ngenerates the following in `master/shared/config/generated-config.js`:\n\n```\nangular.module('kubernetesApp.config', [])\n.constant('ENV', {\n  '/': <master/shared/config/development.json>,\n  'dashboard': <master/components/dashboard/config/development.json>,\n  'my_component': <master/components/my_component/config/development.json>\n});\n```\n\n### Kubernetes server configuration\n**RECOMMENDED**: The Kubernetes api server does not enable CORS by default, so `kube-apiserver` must be started with `--cors_allowed_origins=http://<your\n  host here>` or `--cors_allowed_origins=.*`.\n\n**NOT RECOMMENDED**: If you don't want to/cannot restart the Kubernetes api server, you can start your browser with web security disabled. For example, you can [launch Chrome](http://www.chromium.org/developers/how-tos/run-chromium-with-flags) with flag `--disable-web-security`. Be careful not to visit untrusted web sites when running your browser in this mode.\n\n## Building a new visualizer or component\nSee [master/components/README.md](master/components/README.md).\n\n## Testing\nCurrently, the UI project includes both unit-testing with [Karma](http://karma-runner.github.io/0.12/index.html) and end-to-end testing with [Protractor](http://angular.github.io/protractor/#/).\n\n### Unit testing with Karma\nTo run the existing Karma tests:\n\n* Edit the Karma configuration in `master/karma.config.js`, if necessary.\n* Run the tests. The console should show the test results.\n\n```\ncd master\nnode node_modules/.bin/karma start karma.conf.js\n```\n\nTo run new Karma tests for a component, put new `*.spec.js` files under the appropriate `master/components/**/test/modules/*` directories.\n\nTo test the chrome, put new `*.spec.js` files under the appropriate `master/test/modules/*` directories.\n\n### End-to-end testing with Protractor\nTo run the existing Protractor tests:\n\n* Install the CLIs.\n\n```\nsudo npm install -g protractor\n```\n\n* Edit the test configuration in `master/protractor/conf.js`, if necessary.\n* Start the webdriver server.\n\n```\nsudo webdriver-manager start\n```\n\n* Start the application (see instructions above), running at port 8000.\n* Run the tests. The console should show the test results.\n\n```\ncd master/protractor\nprotractor conf.js\n```\n\nTo run new protractor tests for a component, put new `*.spec.js` files in the appropriate `master/components/**/protractor/*` directories.\n\nTo test the chrome, put new `*.spec.js` files under the `master/protractor/chrome` directory.\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/www/README.md?pixel)]()\n"
  },
  {
    "path": "build/build-ui.sh",
    "content": "#!/bin/bash\n\n# Copyright 2014 The Kubernetes Authors All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This script builds ui assets into a single go datafile\n\nset -o errexit\nset -o nounset\nset -o pipefail\n\nKUBE_ROOT=$(dirname \"${BASH_SOURCE}\")/..\n# source \"${KUBE_ROOT}/hack/lib/init.sh\"\n\ncd \"${KUBE_ROOT}\"\n\nif ! which go-bindata > /dev/null 2>&1 ; then\n\techo \"Cannot find go-bindata. Install with \\\"go get github.com/jteeuwen/go-bindata/...\\\"\"\n\texit 1\nfi\n\nreadonly TMP_DATAFILE=\"/tmp/datafile.go\"\nreadonly DASHBOARD_SRC=\"app/...\"\nreadonly DASHBOARD_PKG=\"data\"\n\nfunction kube::hack::build_ui() {\n  local pkg=\"$1\"\n  local src=\"$2\"\n  local output_file=\"${pkg}/datafile.go\"\n\n  go-bindata -nocompress -o \"${output_file}\" -prefix ${PWD} -pkg \"${pkg}\" \"${src}\"\n\n  local year=$(date +%Y)\n  cat hooks/boilerplate.go.txt | sed \"s/YEAR/${year}/\" > \"${TMP_DATAFILE}\"\n  echo -e \"// generated by hack/build-ui.sh; DO NOT EDIT\\n\" >> \"${TMP_DATAFILE}\"\n  cat \"${output_file}\" >> \"${TMP_DATAFILE}\"\n\n  gofmt -s -w \"${TMP_DATAFILE}\"\n\n  mv \"${TMP_DATAFILE}\" \"${output_file}\"\n\n}\n\nkube::hack::build_ui \"${DASHBOARD_PKG}\" \"${DASHBOARD_SRC}\"\n"
  },
  {
    "path": "data/datafile.go",
    "content": "/*\nCopyright 2016 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// generated by hack/build-ui.sh; DO NOT EDIT\n\n// Code generated by go-bindata.\n// sources:\n// app/assets/css/app.css\n// app/assets/img/docArrow.png\n// app/assets/img/ic_arrow_drop_down_24px.svg\n// app/assets/img/ic_arrow_drop_up_24px.svg\n// app/assets/img/ic_keyboard_arrow_left_24px.svg\n// app/assets/img/ic_keyboard_arrow_right_24px.svg\n// app/assets/img/icons/arrow-back.png\n// app/assets/img/icons/favicon.png\n// app/assets/img/icons/ic_arrow_forward_24px.svg\n// app/assets/img/icons/ic_cancel_24px.svg\n// app/assets/img/icons/ic_close_24px.svg\n// app/assets/img/icons/ic_menu.svg\n// app/assets/img/icons/ic_menu_24px.svg\n// app/assets/img/icons/list_control_down.png\n// app/assets/img/kubernetes.svg\n// app/assets/js/app.js\n// app/assets/js/base.js\n// app/components/dashboard/img/icons/ic_arrow_drop_down_18px.svg\n// app/components/dashboard/img/icons/ic_arrow_drop_down_24px.svg\n// app/components/dashboard/img/icons/ic_close_18px.svg\n// app/components/dashboard/img/icons/ic_close_24px.svg\n// app/components/dashboard/manifest.json\n// app/components/dashboard/pages/footer.html\n// app/components/dashboard/pages/header.html\n// app/components/dashboard/pages/home.html\n// app/components/dashboard/views/groups.html\n// app/components/dashboard/views/listEvents.html\n// app/components/dashboard/views/listMinions.html\n// app/components/dashboard/views/listPods.html\n// app/components/dashboard/views/listPodsCards.html\n// app/components/dashboard/views/listPodsVisualizer.html\n// app/components/dashboard/views/listReplicationControllers.html\n// app/components/dashboard/views/listServices.html\n// app/components/dashboard/views/node.html\n// app/components/dashboard/views/partials/cadvisor.html\n// app/components/dashboard/views/partials/groupBox.html\n// app/components/dashboard/views/partials/groupItem.html\n// app/components/dashboard/views/partials/podTilesByName.html\n// app/components/dashboard/views/partials/podTilesByServer.html\n// app/components/dashboard/views/pod.html\n// app/components/dashboard/views/replication.html\n// app/components/dashboard/views/service.html\n// app/index.html\n// app/vendor/angular-json-human/dist/angular-json-human.css\n// app/vendor/angular-material/angular-material.css\n// app/vendor/d3/d3.min.js\n// app/views/partials/404.html\n// app/views/partials/kubernetes-ui-menu.tmpl.html\n// app/views/partials/md-table.tmpl.html\n// app/views/partials/menu-toggle.tmpl.html\n// DO NOT EDIT!\n\npackage data\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\ntype asset struct {\n\tbytes []byte\n\tinfo  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _appAssetsCssAppCss = []byte(`.nav-back{width:80px;font-size:14px;padding-left:14px;line-height:15px;background-size:14px 14px;background-repeat:no-repeat;display:block}a{text-decoration:none}.main-fab{position:absolute;z-index:20;font-size:30px;top:100px;left:24px;transform:scale(.88,.88)}.md-breadcrumb{padding-left:16px}.md-table{min-width:100%;border-collapse:collapse}.md-table tbody tr:focus,.md-table tbody tr:hover{cursor:pointer;background-color:rgba(63,81,181,.2)}.md-table-header{border-bottom:1px solid #e6e6e6;color:#828282;text-align:left;font-size:.75em;font-weight:700;padding:16px 16px 16px 0}.md-table-header a{text-decoration:none;color:inherit}.md-table-caret{display:inline-block;vertical-align:middle}.md-table-content{font-size:.8em;padding:16px 16px 16px 0;height:72px}.md-table-td-more{max-width:72px;width:72px;padding:16px}.md-table-thumbs{max-width:104px;width:104px;padding:16px 32px}.md-table-thumbs div{overflow:hidden;width:40px;height:40px;border-radius:20px;border:1px solid rgba(0,0,0,.2);background-size:cover;box-shadow:0 8px 10px rgba(0,0,0,.3);-webkit-box-shadow:0 8px 10px rgba(0,0,0,.1)}.md-table-footer{height:40px}.md-table-count-info{line-height:40px;font-size:.75em}.md-table-footer-item{width:40px;height:40px;vertical-align:middle}.bold,.md-table-active-page{font-weight:700}.gray,.grey{color:#888}md-input-container.md-default-theme .md-input{color:#fff;border-color:#fff;margin-top:24px}.dashboard-subnav{font-size:.9em;min-height:38px;max-height:38px;background-color:#09c1d1!important}.dashboard-subnav md-select.md-default-theme:focus .md-select-label{border-bottom:none;color:#fff}.selectSubPages p{text-align:center;color:#fff}.selectSubPages .md-default-theme .md-select-label.md-placeholder{color:#fff}.selectSubPages .md-select-label{padding-top:0;font-size:1em;line-height:1em;border-bottom:none;padding-bottom:0}.selectSubPages md-select{margin-top:10px;margin-right:80px;padding:0}md-select-menu{max-height:none}.md-toolbar-tools{padding-left:8px;padding-right:8px}.md-toolbar-small{height:38px;min-height:38px}.md-toolbar-tools-small{background-color:#09c1d1}.kubernetes-ui-menu,.kubernetes-ui-menu ul{list-style:none;padding:0}.kubernetes-ui-menu li{margin:0}.kubernetes-ui-menu>li{border-top:1px solid rgba(0,0,0,.12)}.kubernetes-ui-menu .md-button{border-radius:0;color:inherit;cursor:pointer;font-weight:400;line-height:40px;margin:0;max-height:40px;overflow:hidden;padding:0 16px;text-align:left;text-decoration:none;white-space:normal;width:100%}.kubernetes-ui-menu a.md-button{display:block}.kubernetes-ui-menu button.md-button::-moz-focus-inner{padding:0}.kubernetes-ui-menu .md-button.active{color:#03a9f4}.menu-heading{color:#888;display:block;font-size:inherit;font-weight:500;line-height:40px;margin:0;padding:0 16px;text-align:left;width:100%}.kubernetes-ui-menu li.parentActive,.kubernetes-ui-menu li.parentActive .menu-toggle-list{background-color:#f6f6f6}.menu-toggle-list{background:#fff;max-height:999px;overflow:hidden;position:relative;z-index:1;-webkit-transition:.75s cubic-bezier(.35,0,.25,1);-webkit-transition-property:max-height;-moz-transition:.75s cubic-bezier(.35,0,.25,1);-moz-transition-property:max-height;transition:.75s cubic-bezier(.35,0,.25,1);transition-property:max-height}.menu-toggle-list.ng-hide{max-height:0}.kubernetes-ui-menu .menu-toggle-list a.md-button{display:block;padding:0 16px 0 32px;text-transform:none}.md-button-toggle .md-toggle-icon{background:url(../img/icons/list_control_down.png) center center no-repeat;background-size:100% auto;display:inline-block;height:24px;margin:auto 0 auto auto;speak:none;width:24px;transition:transform .3s ease-in-out;-webkit-transition:-webkit-transform .3s ease-in-out}.md-button-toggle .md-toggle-icon.toggled{transform:rotate(180deg);-webkit-transform:rotate(180deg)}.menu-icon{background:0 0;border:none;margin-right:16px;padding:0}.whiteframedemoBasicUsage md-whiteframe{background:#fff;margin:2px;padding:2px}.tabsDefaultTabs{height:100%;width:100%}.tabsDefaultTabs .remove-tab{margin-bottom:40px}.tabsDefaultTabs .home-buttons .md-button{display:block;max-height:30px}.tabsDefaultTabs .home-buttons .md-button.add-tab{margin-top:20px;max-height:30px!important}.tabsDefaultTabs .demo-tab{display:block;position:relative;background:#fff;border:0 solid #000;min-height:0;width:100%}.tabsDefaultTabs .tab0,.tabsDefaultTabs .tab1,.tabsDefaultTabs .tab2,.tabsDefaultTabs .tab3{background-color:#bbdefb}.tabsDefaultTabs .md-header{background-color:#1976D2!important}.tabsDefaultTabs md-tab{color:#90caf9!important}.tabsDefaultTabs md-tab.active,.tabsDefaultTabs md-tab:focus{color:#fff!important}.tabsDefaultTabs md-tab[disabled]{opacity:.5}.tabsDefaultTabs .md-header .md-ripple{border-color:#FFFF8D!important}.tabsDefaultTabs md-tabs-ink-bar{background-color:#FFFF8D!important}.tabsDefaultTabs .title{padding-top:8px;padding-right:8px;text-align:left;text-transform:uppercase;color:#888;margin-top:24px}.tabsDefaultTabs [layout-align]>*,.tabsDefaultTabs form>[layout]>*{margin-left:8px}.tabsDefaultTabs .long>input{width:264px}.menuBtn{background-color:transparent;border:none;height:38px;margin:16px;position:absolute;width:36px}md-toolbar h1{margin:auto}md-list .md-button{color:inherit;font-weight:500;text-align:left;width:100%}md-list .md-button.selected{color:#03a9f4}#content{overflow:hidden}#content md-content{padding-left:0;padding-right:0;padding-top:0}#content .md-button.action{background-color:transparent;border:none;height:38px;margin:8px auto 16px 0;position:absolute;top:10px;right:25px;width:36px}#content img{display:block;height:auto;max-width:500px}.content-wrapper{position:relative}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}md-toolbar h1{font-size:1.25em;font-weight:400}.menuBtn{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGcgaWQ9IkhlYWRlciI+CiAgICA8Zz4KICAgICAgICA8cmVjdCB4PSItNjE4IiB5PSItMjIzMiIgZmlsbD0ibm9uZSIgd2lkdGg9IjE0MDAiIGhlaWdodD0iMzYwMCIvPgogICAgPC9nPgo8L2c+CjxnIGlkPSJMYWJlbCI+CjwvZz4KPGcgaWQ9Ikljb24iPgogICAgPGc+CiAgICAgICAgPHJlY3QgZmlsbD0ibm9uZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+CiAgICAgICAgPHBhdGggZD0iTTMsMThoMTh2LTJIM1YxOHogTTMsMTNoMTh2LTJIM1YxM3ogTTMsNnYyaDE4VjZIM3oiIHN0eWxlPSJmaWxsOiNmM2YzZjM7Ii8+CiAgICA8L2c+CjwvZz4KPGcgaWQ9IkdyaWQiIGRpc3BsYXk9Im5vbmUiPgogICAgPGcgZGlzcGxheT0iaW5saW5lIj4KICAgIDwvZz4KPC9nPgo8L3N2Zz4=) center center no-repeat}.actionBtn{background:url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgdmlld0JveD0iMCAwIDM2IDM2Ij4NCiAgICA8cGF0aCBkPSJNMCAwaDM2djM2aC0zNnoiIGZpbGw9Im5vbmUiLz4NCiAgICA8cGF0aCBkPSJNNCAyN2gyOHYtM2gtMjh2M3ptMC04aDI4di0zaC0yOHYzem0wLTExdjNoMjh2LTNoLTI4eiIvPg0KPC9zdmc+) center center no-repeat}.kubernetes-ui-logo{background-image:url(../img/kubernetes.svg);background-size:40px 40px;width:40px;height:40px}.kubernetes-ui-text{line-height:40px;vertical-align:middle;padding:2px}md-select-menu.md-default-theme md-option:focus:not([selected]){background:#eee}md-select-menu md-option{transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),-webkit-transform .4s cubic-bezier(.25,.8,.25,1);transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),transform .4s cubic-bezier(.25,.8,.25,1)}md-select-menu md-option:not([disabled]):focus,md-select-menu md-option:not([disabled]):hover{background-color:rgba(158,158,158,.2)}.dashboard .body-wrapper{padding:25px}.dashboard [flex-align-self=end]{-webkit-align-self:flex-end;-ms-flex-align-self:end;align-self:flex-end}.dashboard .back{font-size:18px;line-height:27px;margin-bottom:30px}.dashboard .heading{font-size:18px;line-height:21px;color:#222;margin-bottom:25px}.dashboard .heading .label{color:#777}.dashboard .clear-bg{background-color:transparent}.dashboard .list-pods .pod-group{margin:25px}.dashboard .list-pods .pod-group md-grid-list{margin-top:50px;color:#fff}.dashboard .list-pods .pod-group md-grid-list figcaption{width:100%}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-header{padding-left:10px}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-header .labels{width:100%}.dashboard .list-pods .pod-group md-grid-list md-grid-tile{transition:all 700ms ease-in 50ms}.dashboard .list-pods .pod-group md-grid-list .inner-box{padding-left:10px;padding-right:10px}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-footer{background:rgba(0,0,0,.5)}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-footer .pod-title{margin-left:10px}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-footer .pod-host{text-align:right;padding-right:15px}.dashboard .list-pods .pod-group md-grid-list md-grid-tile-footer a{color:#fff}.dashboard .list-pods .pod-group md-grid-list .restarts{width:100%;text-align:right;padding-right:10px}.dashboard .list-pods .pod-group md-grid-list .restarts .restart-button,.dashboard .list-pods .pod-group md-grid-list .restarts .restart-button:focus,.dashboard .list-pods .pod-group md-grid-list .restarts .restart-button:hover,.dashboard .list-pods .pod-group md-grid-list .restarts .restart-button:not([disabled]):focus,.dashboard .list-pods .pod-group md-grid-list .restarts .restart-button:not([disabled]):hover{background-color:#ff1744;width:30px;height:30px}.dashboard .list-pods .gray{background:#f5f5f5}.dashboard .list-pods .dark-overlay{background-color:#292935;opacity:.5}.dashboard .list-pods .light-overlay{background-color:#FFF;opacity:.2}.dashboard .list-pods .color-1{background-color:#2962ff;fill:#2962ff;stroke:#2962ff}.dashboard .list-pods .color-max-1{background-color:#dce5ff;border-color:#dce5ff;fill:#dce5ff}.dashboard .list-pods md-grid-list.list-color-1 md-grid-tile.colored{background-color:#2962ff}.dashboard .list-pods .color-2{background-color:#a0f;fill:#a0f;stroke:#a0f}.dashboard .list-pods .color-max-2{background-color:#e6b3ff;border-color:#e6b3ff;fill:#e6b3ff}.dashboard .list-pods md-grid-list.list-color-2 md-grid-tile.colored{background-color:#a0f}.dashboard .list-pods .color-3{background-color:#00c853;fill:#00c853;stroke:#00c853}.dashboard .list-pods .color-max-3{background-color:#7cffb2;border-color:#7cffb2;fill:#7cffb2}.dashboard .list-pods md-grid-list.list-color-3 md-grid-tile.colored{background-color:#00c853}.dashboard .list-pods .color-4{background-color:#304ffe;fill:#304ffe;stroke:#304ffe}.dashboard .list-pods .color-max-4{background-color:#e2e6ff;border-color:#e2e6ff;fill:#e2e6ff}.dashboard .list-pods md-grid-list.list-color-4 md-grid-tile.colored{background-color:#304ffe}.dashboard .list-pods .color-5{background-color:#0091ea;fill:#0091ea;stroke:#0091ea}.dashboard .list-pods .color-max-5{background-color:#9edaff;border-color:#9edaff;fill:#9edaff}.dashboard .list-pods md-grid-list.list-color-5 md-grid-tile.colored{background-color:#0091ea}.dashboard .list-pods .color-6{background-color:#ff6d00;fill:#ff6d00;stroke:#ff6d00}.dashboard .list-pods .color-max-6{background-color:#ffd3b3;border-color:#ffd3b3;fill:#ffd3b3}.dashboard .list-pods md-grid-list.list-color-6 md-grid-tile.colored{background-color:#ff6d00}.dashboard .list-pods .color-7{background-color:#00bfa5;fill:#00bfa5;stroke:#00bfa5}.dashboard .list-pods .color-max-7{background-color:#72ffec;border-color:#72ffec;fill:#72ffec}.dashboard .list-pods md-grid-list.list-color-7 md-grid-tile.colored{background-color:#00bfa5}.dashboard .list-pods .color-8{background-color:#c51162;fill:#c51162;stroke:#c51162}.dashboard .list-pods .color-max-8{background-color:#f693bf;border-color:#f693bf;fill:#f693bf}.dashboard .list-pods md-grid-list.list-color-8 md-grid-tile.colored{background-color:#c51162}.dashboard .list-pods .color-9{background-color:#64dd17;fill:#64dd17;stroke:#64dd17}.dashboard .list-pods .color-max-9{background-color:#cbf7b0;border-color:#cbf7b0;fill:#cbf7b0}.dashboard .list-pods md-grid-list.list-color-9 md-grid-tile.colored{background-color:#64dd17}.dashboard .list-pods .color-10{background-color:#6200ea;fill:#6200ea;stroke:#6200ea}.dashboard .list-pods .color-max-10{background-color:#c69eff;border-color:#c69eff;fill:#c69eff}.dashboard .list-pods md-grid-list.list-color-10 md-grid-tile.colored{background-color:#6200ea}.dashboard .list-pods .color-11{background-color:#ffd600;fill:#ffd600;stroke:#ffd600}.dashboard .list-pods .color-max-11{background-color:#fff3b3;border-color:#fff3b3;fill:#fff3b3}.dashboard .list-pods md-grid-list.list-color-11 md-grid-tile.colored{background-color:#ffd600}.dashboard .list-pods .color-12{background-color:#00b8d4;fill:#00b8d4;stroke:#00b8d4}.dashboard .list-pods .color-max-12{background-color:#87efff;border-color:#87efff;fill:#87efff}.dashboard .list-pods md-grid-list.list-color-12 md-grid-tile.colored{background-color:#00b8d4}.dashboard .list-pods .color-13{background-color:#ffab00;fill:#ffab00;stroke:#ffab00}.dashboard .list-pods .color-max-13{background-color:#ffe6b3;border-color:#ffe6b3;fill:#ffe6b3}.dashboard .list-pods md-grid-list.list-color-13 md-grid-tile.colored{background-color:#ffab00}.dashboard .list-pods .color-14{background-color:#dd2c00;fill:#dd2c00;stroke:#dd2c00}.dashboard .list-pods .color-max-14{background-color:#ffa791;border-color:#ffa791;fill:#ffa791}.dashboard .list-pods md-grid-list.list-color-14 md-grid-tile.colored{background-color:#dd2c00}.dashboard .list-pods .color-15{background-color:#2979ff;fill:#2979ff;stroke:#2979ff}.dashboard .list-pods .color-max-15{background-color:#dce9ff;border-color:#dce9ff;fill:#dce9ff}.dashboard .list-pods md-grid-list.list-color-15 md-grid-tile.colored{background-color:#2979ff}.dashboard .list-pods .color-16{background-color:#d500f9;fill:#d500f9;stroke:#d500f9}.dashboard .list-pods .color-max-16{background-color:#f3acff;border-color:#f3acff;fill:#f3acff}.dashboard .list-pods md-grid-list.list-color-16 md-grid-tile.colored{background-color:#d500f9}.dashboard .list-pods .color-17{background-color:#00e676;fill:#00e676;stroke:#00e676}.dashboard .list-pods .color-max-17{background-color:#9affce;border-color:#9affce;fill:#9affce}.dashboard .list-pods md-grid-list.list-color-17 md-grid-tile.colored{background-color:#00e676}.dashboard .list-pods .color-18{background-color:#3d5afe;fill:#3d5afe;stroke:#3d5afe}.dashboard .list-pods .color-max-18{background-color:#eff1ff;border-color:#eff1ff;fill:#eff1ff}.dashboard .list-pods md-grid-list.list-color-18 md-grid-tile.colored{background-color:#3d5afe}.dashboard .list-pods .color-19{background-color:#00b0ff;fill:#00b0ff;stroke:#00b0ff}.dashboard .list-pods .color-max-19{background-color:#b3e7ff;border-color:#b3e7ff;fill:#b3e7ff}.dashboard .list-pods md-grid-list.list-color-19 md-grid-tile.colored{background-color:#00b0ff}.dashboard .list-pods .color-20{background-color:#ff9100;fill:#ff9100;stroke:#ff9100}.dashboard .list-pods .color-max-20{background-color:#ffdeb3;border-color:#ffdeb3;fill:#ffdeb3}.dashboard .list-pods md-grid-list.list-color-20 md-grid-tile.colored{background-color:#ff9100}.dashboard .list-pods .color-21{background-color:#1de9b6;fill:#1de9b6;stroke:#1de9b6}.dashboard .list-pods .color-max-21{background-color:#c0f9eb;border-color:#c0f9eb;fill:#c0f9eb}.dashboard .list-pods md-grid-list.list-color-21 md-grid-tile.colored{background-color:#1de9b6}.dashboard .list-pods .color-22{background-color:#f50057;fill:#f50057;stroke:#f50057}.dashboard .list-pods .color-max-22{background-color:#ffa8c7;border-color:#ffa8c7;fill:#ffa8c7}.dashboard .list-pods md-grid-list.list-color-22 md-grid-tile.colored{background-color:#f50057}.dashboard .list-pods .color-23{background-color:#76ff03;fill:#76ff03;stroke:#76ff03}.dashboard .list-pods .color-max-23{background-color:#d7ffb5;border-color:#d7ffb5;fill:#d7ffb5}.dashboard .list-pods md-grid-list.list-color-23 md-grid-tile.colored{background-color:#76ff03}.dashboard .list-pods .color-24{background-color:#651fff;fill:#651fff;stroke:#651fff}.dashboard .list-pods .color-max-24{background-color:#e0d2ff;border-color:#e0d2ff;fill:#e0d2ff}.dashboard .list-pods md-grid-list.list-color-24 md-grid-tile.colored{background-color:#651fff}.dashboard .list-pods .color-25{background-color:#ffea00;fill:#ffea00;stroke:#ffea00}.dashboard .list-pods .color-max-25{background-color:#fff9b3;border-color:#fff9b3;fill:#fff9b3}.dashboard .list-pods md-grid-list.list-color-25 md-grid-tile.colored{background-color:#ffea00}.dashboard .list-pods .color-26{background-color:#00e5ff;fill:#00e5ff;stroke:#00e5ff}.dashboard .list-pods .color-max-26{background-color:#b3f7ff;border-color:#b3f7ff;fill:#b3f7ff}.dashboard .list-pods md-grid-list.list-color-26 md-grid-tile.colored{background-color:#00e5ff}.dashboard .list-pods .color-27{background-color:#ffc400;fill:#ffc400;stroke:#ffc400}.dashboard .list-pods .color-max-27{background-color:#ffedb3;border-color:#ffedb3;fill:#ffedb3}.dashboard .list-pods md-grid-list.list-color-27 md-grid-tile.colored{background-color:#ffc400}.dashboard .list-pods .color-28{background-color:#ff3d00;fill:#ff3d00;stroke:#ff3d00}.dashboard .list-pods .color-max-28{background-color:#ffc5b3;border-color:#ffc5b3;fill:#ffc5b3}.dashboard .list-pods md-grid-list.list-color-28 md-grid-tile.colored{background-color:#ff3d00}.dashboard .list-pods .color-29{background-color:#448aff;fill:#448aff;stroke:#448aff}.dashboard .list-pods .color-max-29{background-color:#f6faff;border-color:#f6faff;fill:#f6faff}.dashboard .list-pods md-grid-list.list-color-29 md-grid-tile.colored{background-color:#448aff}.dashboard .list-pods .color-30{background-color:#e040fb;fill:#e040fb;stroke:#e040fb}.dashboard .list-pods .color-max-30{background-color:#fcefff;border-color:#fcefff;fill:#fcefff}.dashboard .list-pods md-grid-list.list-color-30 md-grid-tile.colored{background-color:#e040fb}.dashboard .list-pods .color-31{background-color:#69f0ae;fill:#69f0ae;stroke:#69f0ae}.dashboard .list-pods .color-max-31{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .list-pods md-grid-list.list-color-31 md-grid-tile.colored{background-color:#69f0ae}.dashboard .list-pods .color-32{background-color:#536dfe;fill:#536dfe;stroke:#536dfe}.dashboard .list-pods .color-max-32{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .list-pods md-grid-list.list-color-32 md-grid-tile.colored{background-color:#536dfe}.dashboard .list-pods .color-33{background-color:#40c4ff;fill:#40c4ff;stroke:#40c4ff}.dashboard .list-pods .color-max-33{background-color:#f3fbff;border-color:#f3fbff;fill:#f3fbff}.dashboard .list-pods md-grid-list.list-color-33 md-grid-tile.colored{background-color:#40c4ff}.dashboard .list-pods .color-34{background-color:#ffab40;fill:#ffab40;stroke:#ffab40}.dashboard .list-pods .color-max-34{background-color:#fffaf3;border-color:#fffaf3;fill:#fffaf3}.dashboard .list-pods md-grid-list.list-color-34 md-grid-tile.colored{background-color:#ffab40}.dashboard .list-pods .color-35{background-color:#64ffda;fill:#64ffda;stroke:#64ffda}.dashboard .list-pods .color-max-35{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .list-pods md-grid-list.list-color-35 md-grid-tile.colored{background-color:#64ffda}.dashboard .list-pods .color-36{background-color:#ff4081;fill:#ff4081;stroke:#ff4081}.dashboard .list-pods .color-max-36{background-color:#fff3f7;border-color:#fff3f7;fill:#fff3f7}.dashboard .list-pods md-grid-list.list-color-36 md-grid-tile.colored{background-color:#ff4081}.dashboard .list-pods .color-37{background-color:#b2ff59;fill:#b2ff59;stroke:#b2ff59}.dashboard .list-pods .color-max-37{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .list-pods md-grid-list.list-color-37 md-grid-tile.colored{background-color:#b2ff59}.dashboard .list-pods .color-38{background-color:#7c4dff;fill:#7c4dff;stroke:#7c4dff}.dashboard .list-pods .color-max-38{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .list-pods md-grid-list.list-color-38 md-grid-tile.colored{background-color:#7c4dff}.dashboard .list-pods .color-39{background-color:#ff0;fill:#ff0;stroke:#ff0}.dashboard .list-pods .color-max-39{background-color:#ffffb3;border-color:#ffffb3;fill:#ffffb3}.dashboard .list-pods md-grid-list.list-color-39 md-grid-tile.colored{background-color:#ff0}.dashboard .list-pods .color-40{background-color:#18ffff;fill:#18ffff;stroke:#18ffff}.dashboard .list-pods .color-max-40{background-color:#cbffff;border-color:#cbffff;fill:#cbffff}.dashboard .list-pods md-grid-list.list-color-40 md-grid-tile.colored{background-color:#18ffff}.dashboard .list-pods .color-41{background-color:#ffd740;fill:#ffd740;stroke:#ffd740}.dashboard .list-pods .color-max-41{background-color:#fffcf3;border-color:#fffcf3;fill:#fffcf3}.dashboard .list-pods md-grid-list.list-color-41 md-grid-tile.colored{background-color:#ffd740}.dashboard .list-pods .color-42{background-color:#ff6e40;fill:#ff6e40;stroke:#ff6e40}.dashboard .list-pods .color-max-42{background-color:#fff6f3;border-color:#fff6f3;fill:#fff6f3}.dashboard .list-pods md-grid-list.list-color-42 md-grid-tile.colored{background-color:#ff6e40}.dashboard .list-pods .color-warning{background-color:#ff9800!important;border-color:#ff9800!important;fill:#ff9800!important;stroke:#ff9800!important}.dashboard .list-pods .color-critical{background-color:#f44336!important;border-color:#f44336!important;fill:#f44336!important;stroke:#f44336!important}.dashboard .list-pods .status-waiting{background-color:#2e2e3b!important;border-color:#dad462!important;border-width:2px!important;border-style:solid!important}.dashboard .list-pods .status-terminated,.dashboard .list-pods .status-unknown{background-color:#ff1744!important;border-color:#e3002c!important;border-width:1px!important;border-style:solid!important}.dashboard .dash-table{min-width:100%;border-collapse:collapse}.dashboard .dash-table tbody tr:focus:not(.no-link),.dashboard .dash-table tbody tr:hover:not(.no-link){cursor:pointer;background-color:rgba(63,81,181,.2)}.dashboard .dash-table .dash-table-header{border-bottom:1px solid #e6e6e6;color:#828282;text-align:left;font-size:.75em;font-weight:700;padding:16px 16px 16px 0}.dashboard .dash-table .dash-table-header a{text-decoration:none;color:inherit}.dashboard .dash-table .dash-table-caret{display:inline-block;vertical-align:middle}.dashboard .dash-table .dash-table-content{font-size:.8em;padding:16px 16px 16px 0;height:72px}.dashboard .dash-table .dash-table-td-more{max-width:72px;width:72px;padding:16px}.dashboard .dash-table .dash-table-thumbs{max-width:104px;width:104px;padding:16px 32px}.dashboard .dash-table .dash-table-thumbs div{overflow:hidden;width:40px;height:40px;border-radius:20px;border:1px solid rgba(0,0,0,.2);background-size:cover;box-shadow:0 8px 10px rgba(0,0,0,.3);-webkit-box-shadow:0 8px 10px rgba(0,0,0,.1)}.dashboard .dash-table .dash-table-footer{height:40px}.dashboard .dash-table .dash-table-count-info{line-height:40px;font-size:.75em}.dashboard .dash-table .dash-table-footer-item{width:40px;height:40px;vertical-align:middle}.dashboard .dash-table .bold,.dashboard .dash-table .dash-table-active-page{font-weight:700}.dashboard .dash-table .grey{color:grey}.dashboard .dash-table md-input-container.md-default-theme .md-input{color:#fff;border-color:#fff;margin-top:24px}.dashboard .server-overview .dark-overlay{background-color:#292935;opacity:.5}.dashboard .server-overview .light-overlay{background-color:#FFF;opacity:.2}.dashboard .server-overview md-grid-list.list-color-1 md-grid-tile.colored{background-color:#2962ff}.dashboard .server-overview md-grid-list.list-color-2 md-grid-tile.colored{background-color:#a0f}.dashboard .server-overview md-grid-list.list-color-3 md-grid-tile.colored{background-color:#00c853}.dashboard .server-overview .color-4{background-color:#304ffe;fill:#304ffe;stroke:#304ffe}.dashboard .server-overview .color-max-4{background-color:#e2e6ff;border-color:#e2e6ff;fill:#e2e6ff}.dashboard .server-overview md-grid-list.list-color-4 md-grid-tile.colored{background-color:#304ffe}.dashboard .server-overview .color-5{background-color:#0091ea;fill:#0091ea;stroke:#0091ea}.dashboard .server-overview .color-max-5{background-color:#9edaff;border-color:#9edaff;fill:#9edaff}.dashboard .server-overview md-grid-list.list-color-5 md-grid-tile.colored{background-color:#0091ea}.dashboard .server-overview .color-6{background-color:#ff6d00;fill:#ff6d00;stroke:#ff6d00}.dashboard .server-overview .color-max-6{background-color:#ffd3b3;border-color:#ffd3b3;fill:#ffd3b3}.dashboard .server-overview md-grid-list.list-color-6 md-grid-tile.colored{background-color:#ff6d00}.dashboard .server-overview .color-7{background-color:#00bfa5;fill:#00bfa5;stroke:#00bfa5}.dashboard .server-overview .color-max-7{background-color:#72ffec;border-color:#72ffec;fill:#72ffec}.dashboard .server-overview md-grid-list.list-color-7 md-grid-tile.colored{background-color:#00bfa5}.dashboard .server-overview .color-8{background-color:#c51162;fill:#c51162;stroke:#c51162}.dashboard .server-overview .color-max-8{background-color:#f693bf;border-color:#f693bf;fill:#f693bf}.dashboard .server-overview md-grid-list.list-color-8 md-grid-tile.colored{background-color:#c51162}.dashboard .server-overview .color-9{background-color:#64dd17;fill:#64dd17;stroke:#64dd17}.dashboard .server-overview .color-max-9{background-color:#cbf7b0;border-color:#cbf7b0;fill:#cbf7b0}.dashboard .server-overview md-grid-list.list-color-9 md-grid-tile.colored{background-color:#64dd17}.dashboard .server-overview .color-10{background-color:#6200ea;fill:#6200ea;stroke:#6200ea}.dashboard .server-overview .color-max-10{background-color:#c69eff;border-color:#c69eff;fill:#c69eff}.dashboard .server-overview md-grid-list.list-color-10 md-grid-tile.colored{background-color:#6200ea}.dashboard .server-overview .color-11{background-color:#ffd600;fill:#ffd600;stroke:#ffd600}.dashboard .server-overview .color-max-11{background-color:#fff3b3;border-color:#fff3b3;fill:#fff3b3}.dashboard .server-overview md-grid-list.list-color-11 md-grid-tile.colored{background-color:#ffd600}.dashboard .server-overview .color-12{background-color:#00b8d4;fill:#00b8d4;stroke:#00b8d4}.dashboard .server-overview .color-max-12{background-color:#87efff;border-color:#87efff;fill:#87efff}.dashboard .server-overview md-grid-list.list-color-12 md-grid-tile.colored{background-color:#00b8d4}.dashboard .server-overview .color-13{background-color:#ffab00;fill:#ffab00;stroke:#ffab00}.dashboard .server-overview .color-max-13{background-color:#ffe6b3;border-color:#ffe6b3;fill:#ffe6b3}.dashboard .server-overview md-grid-list.list-color-13 md-grid-tile.colored{background-color:#ffab00}.dashboard .server-overview .color-14{background-color:#dd2c00;fill:#dd2c00;stroke:#dd2c00}.dashboard .server-overview .color-max-14{background-color:#ffa791;border-color:#ffa791;fill:#ffa791}.dashboard .server-overview md-grid-list.list-color-14 md-grid-tile.colored{background-color:#dd2c00}.dashboard .server-overview .color-15{background-color:#2979ff;fill:#2979ff;stroke:#2979ff}.dashboard .server-overview .color-max-15{background-color:#dce9ff;border-color:#dce9ff;fill:#dce9ff}.dashboard .server-overview md-grid-list.list-color-15 md-grid-tile.colored{background-color:#2979ff}.dashboard .server-overview .color-16{background-color:#d500f9;fill:#d500f9;stroke:#d500f9}.dashboard .server-overview .color-max-16{background-color:#f3acff;border-color:#f3acff;fill:#f3acff}.dashboard .server-overview md-grid-list.list-color-16 md-grid-tile.colored{background-color:#d500f9}.dashboard .server-overview .color-17{background-color:#00e676;fill:#00e676;stroke:#00e676}.dashboard .server-overview .color-max-17{background-color:#9affce;border-color:#9affce;fill:#9affce}.dashboard .server-overview md-grid-list.list-color-17 md-grid-tile.colored{background-color:#00e676}.dashboard .server-overview .color-18{background-color:#3d5afe;fill:#3d5afe;stroke:#3d5afe}.dashboard .server-overview .color-max-18{background-color:#eff1ff;border-color:#eff1ff;fill:#eff1ff}.dashboard .server-overview md-grid-list.list-color-18 md-grid-tile.colored{background-color:#3d5afe}.dashboard .server-overview .color-19{background-color:#00b0ff;fill:#00b0ff;stroke:#00b0ff}.dashboard .server-overview .color-max-19{background-color:#b3e7ff;border-color:#b3e7ff;fill:#b3e7ff}.dashboard .server-overview md-grid-list.list-color-19 md-grid-tile.colored{background-color:#00b0ff}.dashboard .server-overview .color-20{background-color:#ff9100;fill:#ff9100;stroke:#ff9100}.dashboard .server-overview .color-max-20{background-color:#ffdeb3;border-color:#ffdeb3;fill:#ffdeb3}.dashboard .server-overview md-grid-list.list-color-20 md-grid-tile.colored{background-color:#ff9100}.dashboard .server-overview .color-21{background-color:#1de9b6;fill:#1de9b6;stroke:#1de9b6}.dashboard .server-overview .color-max-21{background-color:#c0f9eb;border-color:#c0f9eb;fill:#c0f9eb}.dashboard .server-overview md-grid-list.list-color-21 md-grid-tile.colored{background-color:#1de9b6}.dashboard .server-overview .color-22{background-color:#f50057;fill:#f50057;stroke:#f50057}.dashboard .server-overview .color-max-22{background-color:#ffa8c7;border-color:#ffa8c7;fill:#ffa8c7}.dashboard .server-overview md-grid-list.list-color-22 md-grid-tile.colored{background-color:#f50057}.dashboard .server-overview .color-23{background-color:#76ff03;fill:#76ff03;stroke:#76ff03}.dashboard .server-overview .color-max-23{background-color:#d7ffb5;border-color:#d7ffb5;fill:#d7ffb5}.dashboard .server-overview md-grid-list.list-color-23 md-grid-tile.colored{background-color:#76ff03}.dashboard .server-overview .color-24{background-color:#651fff;fill:#651fff;stroke:#651fff}.dashboard .server-overview .color-max-24{background-color:#e0d2ff;border-color:#e0d2ff;fill:#e0d2ff}.dashboard .server-overview md-grid-list.list-color-24 md-grid-tile.colored{background-color:#651fff}.dashboard .server-overview .color-25{background-color:#ffea00;fill:#ffea00;stroke:#ffea00}.dashboard .server-overview .color-max-25{background-color:#fff9b3;border-color:#fff9b3;fill:#fff9b3}.dashboard .server-overview md-grid-list.list-color-25 md-grid-tile.colored{background-color:#ffea00}.dashboard .server-overview .color-26{background-color:#00e5ff;fill:#00e5ff;stroke:#00e5ff}.dashboard .server-overview .color-max-26{background-color:#b3f7ff;border-color:#b3f7ff;fill:#b3f7ff}.dashboard .server-overview md-grid-list.list-color-26 md-grid-tile.colored{background-color:#00e5ff}.dashboard .server-overview .color-27{background-color:#ffc400;fill:#ffc400;stroke:#ffc400}.dashboard .server-overview .color-max-27{background-color:#ffedb3;border-color:#ffedb3;fill:#ffedb3}.dashboard .server-overview md-grid-list.list-color-27 md-grid-tile.colored{background-color:#ffc400}.dashboard .server-overview .color-28{background-color:#ff3d00;fill:#ff3d00;stroke:#ff3d00}.dashboard .server-overview .color-max-28{background-color:#ffc5b3;border-color:#ffc5b3;fill:#ffc5b3}.dashboard .server-overview md-grid-list.list-color-28 md-grid-tile.colored{background-color:#ff3d00}.dashboard .server-overview .color-29{background-color:#448aff;fill:#448aff;stroke:#448aff}.dashboard .server-overview .color-max-29{background-color:#f6faff;border-color:#f6faff;fill:#f6faff}.dashboard .server-overview md-grid-list.list-color-29 md-grid-tile.colored{background-color:#448aff}.dashboard .server-overview .color-30{background-color:#e040fb;fill:#e040fb;stroke:#e040fb}.dashboard .server-overview .color-max-30{background-color:#fcefff;border-color:#fcefff;fill:#fcefff}.dashboard .server-overview md-grid-list.list-color-30 md-grid-tile.colored{background-color:#e040fb}.dashboard .server-overview .color-31{background-color:#69f0ae;fill:#69f0ae;stroke:#69f0ae}.dashboard .server-overview .color-max-31{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .server-overview md-grid-list.list-color-31 md-grid-tile.colored{background-color:#69f0ae}.dashboard .server-overview .color-32{background-color:#536dfe;fill:#536dfe;stroke:#536dfe}.dashboard .server-overview .color-max-32{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .server-overview md-grid-list.list-color-32 md-grid-tile.colored{background-color:#536dfe}.dashboard .server-overview .color-33{background-color:#40c4ff;fill:#40c4ff;stroke:#40c4ff}.dashboard .server-overview .color-max-33{background-color:#f3fbff;border-color:#f3fbff;fill:#f3fbff}.dashboard .server-overview md-grid-list.list-color-33 md-grid-tile.colored{background-color:#40c4ff}.dashboard .server-overview .color-34{background-color:#ffab40;fill:#ffab40;stroke:#ffab40}.dashboard .server-overview .color-max-34{background-color:#fffaf3;border-color:#fffaf3;fill:#fffaf3}.dashboard .server-overview md-grid-list.list-color-34 md-grid-tile.colored{background-color:#ffab40}.dashboard .server-overview .color-35{background-color:#64ffda;fill:#64ffda;stroke:#64ffda}.dashboard .server-overview .color-max-35{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .server-overview md-grid-list.list-color-35 md-grid-tile.colored{background-color:#64ffda}.dashboard .server-overview .color-36{background-color:#ff4081;fill:#ff4081;stroke:#ff4081}.dashboard .server-overview .color-max-36{background-color:#fff3f7;border-color:#fff3f7;fill:#fff3f7}.dashboard .server-overview md-grid-list.list-color-36 md-grid-tile.colored{background-color:#ff4081}.dashboard .server-overview .color-37{background-color:#b2ff59;fill:#b2ff59;stroke:#b2ff59}.dashboard .server-overview .color-max-37{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .server-overview md-grid-list.list-color-37 md-grid-tile.colored{background-color:#b2ff59}.dashboard .server-overview .color-38{background-color:#7c4dff;fill:#7c4dff;stroke:#7c4dff}.dashboard .server-overview .color-max-38{background-color:#fff;border-color:#fff;fill:#fff}.dashboard .server-overview md-grid-list.list-color-38 md-grid-tile.colored{background-color:#7c4dff}.dashboard .server-overview .color-39{background-color:#ff0;fill:#ff0;stroke:#ff0}.dashboard .server-overview .color-max-39{background-color:#ffffb3;border-color:#ffffb3;fill:#ffffb3}.dashboard .server-overview md-grid-list.list-color-39 md-grid-tile.colored{background-color:#ff0}.dashboard .server-overview .color-40{background-color:#18ffff;fill:#18ffff;stroke:#18ffff}.dashboard .server-overview .color-max-40{background-color:#cbffff;border-color:#cbffff;fill:#cbffff}.dashboard .server-overview md-grid-list.list-color-40 md-grid-tile.colored{background-color:#18ffff}.dashboard .server-overview .color-41{background-color:#ffd740;fill:#ffd740;stroke:#ffd740}.dashboard .server-overview .color-max-41{background-color:#fffcf3;border-color:#fffcf3;fill:#fffcf3}.dashboard .server-overview md-grid-list.list-color-41 md-grid-tile.colored{background-color:#ffd740}.dashboard .server-overview .color-42{background-color:#ff6e40;fill:#ff6e40;stroke:#ff6e40}.dashboard .server-overview .color-max-42{background-color:#fff6f3;border-color:#fff6f3;fill:#fff6f3}.dashboard .server-overview md-grid-list.list-color-42 md-grid-tile.colored{background-color:#ff6e40}.dashboard .server-overview .color-warning{background-color:#ff9800!important;border-color:#ff9800!important;fill:#ff9800!important;stroke:#ff9800!important}.dashboard .server-overview .color-critical{background-color:#f44336!important;border-color:#f44336!important;fill:#f44336!important;stroke:#f44336!important}.dashboard .server-overview .status-waiting{background-color:#2e2e3b!important;border-color:#dad462!important;border-width:2px!important;border-style:solid!important}.dashboard .server-overview .status-terminated,.dashboard .server-overview .status-unknown{background-color:#ff1744!important;border-color:#e3002c!important;border-width:1px!important;border-style:solid!important}.dashboard .server-overview .color-1{background-color:#512DA8;border-color:#512DA8;fill:#512DA8;stroke:#512DA8}.dashboard .server-overview .color-2{background-color:#9C27B0;border-color:#9C27B0;fill:#9C27B0;stroke:#9C27B0}.dashboard .server-overview .color-3{background-color:#00BCD4;border-color:#00BCD4;fill:#00BCD4;stroke:#00BCD4}.dashboard .server-overview .color-max-1{background-color:#b6a2e6;border-color:#b6a2e6;fill:#b6a2e6}.dashboard .server-overview .color-max-2{background-color:#dfa0ea;border-color:#dfa0ea;fill:#dfa0ea}.dashboard .server-overview .color-max-3{background-color:#87f1ff;border-color:#87f1ff;fill:#87f1ff}.dashboard .server-overview .color-max-warning{background-color:#ffd699!important;border-color:#ffd699!important;fill:#ffd699!important}.dashboard .server-overview .color-max-critical{background-color:#fccbc7!important;border-color:#fccbc7!important;fill:#fccbc7!important}.dashboard .server-overview .max_tick_arc{stroke:#FFF!important}.dashboard .server-overview .concentricchart .bg-circle{background:#F9F9F9;fill:#F9F9F9;stroke:#FFF;stroke-width:1px}.dashboard .server-overview .concentricchart text{font-size:12px;font-family:Roboto,sans-serif}.dashboard .server-overview .concentricchart .value_group{fill:#fff}.dashboard .server-overview .concentricchart .legend_group rect{opacity:.8}.dashboard .server-overview svg.legend{height:auto}.dashboard .server-overview svg.legend text{font-size:12px;font-family:Roboto,sans-serif}.dashboard .server-overview svg.legend .hostName{font-size:16px}.dashboard .server-overview .minion-name{text-align:center;vertical-align:bottom;width:100%}.dashboard .server-overview .chart_area{width:325px;height:auto}.dashboard .groups{font-size:13px}.dashboard .groups .header{line-height:21px}.dashboard .groups .header a{padding-left:5px;padding-right:5px}.dashboard .groups .header .selector-area .filter-text{font-size:13px;margin-left:10px}.dashboard .groups .header .selector-area .cancel-button{width:18px;height:18px;padding:0}.dashboard .groups .header .selector-area .cancel-button:focus,.dashboard .groups .header .selector-area .cancel-button:hover{background-color:none!important}.dashboard .groups .header .selector-area .cancel-icon{width:15px;height:15px;fill:#777}.dashboard .groups .select-group-by{min-width:110px;margin-left:10px;margin-right:40px}.dashboard .groups .select-group-by .md-select-label{padding-top:6px;font-size:13px}.dashboard .groups .group-item{padding-top:20px}.dashboard .groups .group-item .filter-button{height:18px;width:18px}.dashboard .groups .group-item .filter-button .filter-icon{width:18px;height:18px}.dashboard .groups .icon-area{min-width:34px}.dashboard .groups .icon-area .group-icon{border-radius:21px;width:21px;height:21px}.dashboard .groups .group-main-area .subtype{line-height:21px}.dashboard .groups md-divider{margin-top:40px;margin-bottom:30px}.dashboard .groups .group-name{padding-top:10px}.dashboard .groups .selectFilter{padding-top:10px;margin-right:30px}.dashboard .groups .selectFilter .md-select-label{border-bottom:none!important;width:17px;min-width:17px;padding-right:0}.dashboard .groups md-select-menu{min-height:40px;max-height:40px}.dashboard .groups .group-link-area{padding-left:15px;padding-bottom:15px}.dashboard .groups .group-link-area button{line-height:12px}.dashboard .groups .group-type-circle{width:21px;height:21px}.dashboard .groups md-select{margin-top:0}.dashboard .detail{color:#222}.dashboard .detail .back{font-size:18px;line-height:27px;margin-bottom:30px}.dashboard .detail .heading{font-size:18px;line-height:21px;color:#222;margin-bottom:25px}.dashboard .detail .heading .label{color:#777}.dashboard .detail td.name{font-size:14px;color:#222;line-height:24px}.dashboard .detail td.value{margin-left:50px;font-size:14px;color:#888;line-height:24px}.dashboard .detail .containerTable td{padding-right:20px}.dashboard .align-top tbody{vertical-align:top}`)\n\nfunc appAssetsCssAppCssBytes() ([]byte, error) {\n\treturn _appAssetsCssAppCss, nil\n}\n\nfunc appAssetsCssAppCss() (*asset, error) {\n\tbytes, err := appAssetsCssAppCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/css/app.css\", size: 39868, mode: os.FileMode(420), modTime: time.Unix(1454116418, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgDocarrowPng = []byte(\"\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00!\\x00\\x00\\x00\\\"\\b\\x06\\x00\\x00\\x00\\xd1p\\xb0\\xc1\\x00\\x00\\x00\\x04sBIT\\b\\b\\b\\b|\\bd\\x88\\x00\\x00\\x00\\tpHYs\\x00\\x00\\x15\\xfd\\x00\\x00\\x15\\xfd\\x01\\xcdpQa\\x00\\x00\\x00\\x1ctEXtSoftware\\x00Adobe Fireworks CS6\\u8f32\\x8c\\x00\\x00\\x00\\xefIDATX\\x85\\xd5\\xd71\\x0e\\xc20\\f\\x05\\u0406\\xebq\\x0568\\x01\\x8c\\x1c\\x80\\xeep\\x1aV\\x18Y`\\x05\\xc1\\x19\\x10e\\x81\\xe13\\x05UU\\xab\\xd8\\xf1\\xb7\\xa2~\\xc9K\\x87\\xf4)\\x8e\\xea4\\x00\\xa8JgR\\x1aPUcB\\x84\\x10\\xfeU\\xef.X\\xac\\x8eh?KU2\\x00\\x92\\x15\\xb3\\u065e\\x01\\x00\\xaf\\xe6\\x83\\xf9\\xf2 >L\\xc9\\xf5\\xa5\\x88\\b\\x88\\xd1@(\\x88u}B_\\xa4\\x10\\nb:\\xdb\\xe3\\xf6xfCh\\xed\\xb0@h\\b\\v\\x84\\x8a\\u0205\\xd0\\x119\\x10\\x17\\x84\\x16\\xe2\\x86\\xd0@\\\\\\x11R\\x88;\\x82\\x01\\xa1 \\xac\\x10\\xea(\\x1f\\xf2&')\\xab\\x1d\\xd7{\\xff.4\\xef\\xaf\\u007f;\\xac\\x003B\\x02\\x90\\xec\\xb6\\xe9c%\\x01\\xb8!4\\x00\\x17\\x84\\x16@G\\xe4\\x00\\xa8\\x88\\\\\\x00\\ra\\x01\\xd0\\x10C\\x17]\\t\\x80\\u068e\\xee\\x95_\\n\\xa0\\\"\\xda\\x10\\r\\x80\\x8e\\x88\\x10\\r@\\x82\\b\\u0757\\x94\\xc8x\\xfe\\u02bd\\xf3\\x03\\xba\\v\\x18\\x94\\x12\\x8b\\x872\\x00\\x00\\x00\\x00IEND\\xaeB`\\x82\")\n\nfunc appAssetsImgDocarrowPngBytes() ([]byte, error) {\n\treturn _appAssetsImgDocarrowPng, nil\n}\n\nfunc appAssetsImgDocarrowPng() (*asset, error) {\n\tbytes, err := appAssetsImgDocarrowPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/docArrow.png\", size: 373, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIc_arrow_drop_down_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n    <path d=\"M7 10l5 5 5-5z\"/>\n    <path d=\"M0 0h24v24h-24z\" fill=\"none\"/>\n</svg>\n`)\n\nfunc appAssetsImgIc_arrow_drop_down_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIc_arrow_drop_down_24pxSvg, nil\n}\n\nfunc appAssetsImgIc_arrow_drop_down_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIc_arrow_drop_down_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/ic_arrow_drop_down_24px.svg\", size: 166, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIc_arrow_drop_up_24pxSvg = []byte(`<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"24px\"\n\t height=\"24px\" viewBox=\"0 0 24 24\" enable-background=\"new 0 0 24 24\" xml:space=\"preserve\">\n<g id=\"Header\">\n\t<g>\n\t\t<rect x=\"-618\" y=\"-952\" fill=\"none\" width=\"1400\" height=\"3600\"/>\n\t</g>\n</g>\n<g id=\"Label\">\n</g>\n<g id=\"Icon\">\n\t<g>\n\t\t<g>\n\t\t\t<polygon points=\"7,14 12,9 17,14 \t\t\t\"/>\n\t\t</g>\n\t\t<rect fill=\"none\" width=\"24\" height=\"24\"/>\n\t</g>\n</g>\n<g id=\"Grid\" display=\"none\">\n\t<g display=\"inline\">\n\t</g>\n</g>\n</svg>\n`)\n\nfunc appAssetsImgIc_arrow_drop_up_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIc_arrow_drop_up_24pxSvg, nil\n}\n\nfunc appAssetsImgIc_arrow_drop_up_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIc_arrow_drop_up_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/ic_arrow_drop_up_24px.svg\", size: 795, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIc_keyboard_arrow_left_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/></svg>`)\n\nfunc appAssetsImgIc_keyboard_arrow_left_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIc_keyboard_arrow_left_24pxSvg, nil\n}\n\nfunc appAssetsImgIc_keyboard_arrow_left_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIc_keyboard_arrow_left_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/ic_keyboard_arrow_left_24px.svg\", size: 151, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIc_keyboard_arrow_right_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/></svg>`)\n\nfunc appAssetsImgIc_keyboard_arrow_right_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIc_keyboard_arrow_right_24pxSvg, nil\n}\n\nfunc appAssetsImgIc_keyboard_arrow_right_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIc_keyboard_arrow_right_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/ic_keyboard_arrow_right_24px.svg\", size: 149, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsArrowBackPng = []byte(\"\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\x80\\x00\\x00\\x00\\x80\\b\\x06\\x00\\x00\\x00\\xc3>a\\xcb\\x00\\x00\\x00\\x06bKGD\\x00\\xff\\x00\\xff\\x00\\xff\\xa0\\xbd\\xa7\\x93\\x00\\x00\\x020IDATx\\x9c\\xed\\xddIn\\x13q\\x10F\\xf1\\u05c4\\x05\\xd7\\xe0f\\t\\xc3\\x166\\x1c\\xc0\\x10\\xa60\\xc5!\\x90\\x046\\x84Ab\\xba\\v7r`aY2\\x02B\\xecj\\xf7_\\xd5\\xf5~\\x92\\x97\\x91Jz_za\\xc96H\\x92$I\\x92$I\\x92$I\\x92$I\\x92$I\\x92\\xa4\\xac\\xb6Z\\x1f\\x90\\xdc\\x1ep\\x15\\xf8\\xd1\\xfa\\x10\\r\\xab\\x03\\xde\\x00?\\x813\\xe0V\\xdbs4\\xa4\\xe5\\xf8\\x8b\\x97#(\\xa2\\x03N\\xf8=\\xbe#(\\xa2\\x03\\xa6\\xfc=\\xfe\\xf2\\bn\\xb7:P\\x9bs\\x91\\xf8\\x8e`\\xa4V\\x89\\xef\\bF\\xa6\\x03\\xf6Y-\\xbe#\\x18\\x91\\x87\\xac\\x17\\u007f\\xf1:\\x1a\\xfed\\xf5e\\xdd\\xff\\xfc\\xc5k\\xca\\xfc\\t\\xa2\\x84\\xa2\\xf1\\x0f0~Z\\xc6/,\\x1a\\xff%\\xc6O\\xeb\\x05\\xc6/+\\x1a\\xff\\x10\\xe3\\xa7e\\xfc\\u008c_\\xd8sb\\xf1_a\\xfc\\xb4\\x8c_X4\\xfek\\x8c\\x9f\\x96\\xf1\\v3~a\\u03c8\\xc5?\\xc2\\xf8i\\x19\\xbf0\\xe3\\x17\\x16\\x8d\\u007f\\x8c\\xf1\\xd3z\\x8a\\xf1\\u02ca\\xc6?\\xc1\\xf8iE\\xe3\\x9f\\x02\\x97\\x86>Z\\xfd0~aO0~Y\\xd1\\xf8\\xef1~Z}\\xc4\\xf7;\\x12\\x922~a{\\xc4\\xe2\\u007f\\xc0\\xf8i\\x19\\xbf\\xb0h\\xfc\\x8f\\x18?-\\xe3\\x17\\xf6\\x18\\xe3\\x975!\\x16\\xff\\x13\\xc6\\xff\\xa7\\fo\\x80\\\\\\t\\xfe\\xfd\\x8c\\xf9\\x10\\x94\\u0604\\xd8S\\xe0;py\\xe8\\xa3\\u056f\\t\\x8e\\xa0\\xbc\\t\\xb1\\x11|\\xc3\\x11\\xa4w\\x17GP\\x9e#\\x90#\\x90#\\x10p\\x0fGP^t\\x04_q\\x04\\xe99\\x029\\x02\\xc1.\\x8e\\xa0<G G G \\xe0>\\x8e\\xa0<G\\xa0\\xf0\\b\\xbe\\xe0\\b\\xd2s\\x04r\\x04\\x82\\a8\\x82\\xf2\\x1c\\x81\\x1c\\x81\\xe2#\\xf8\\x8c#H/\\xfa\\x03\\x91\\x8e`\\x04\\xfa\\x18\\x81\\x1fAK\\xce\\x11\\xc8\\x11\\b\\x1e\\x11\\x1b\\xc1)9>x\\xabsDG\\xf0\\x0eG\\x90Z\\xc7\\xfc\\xeb\\xe2##\\xf0\\xe7\\xe3G`\\xdd'\\xc1\\f\\xd8\\x1e\\xfe\\\\m\\u00aa_Qc\\xfc\\x11\\xba\\xe8\\bf\\xc0N\\xa3\\x1b\\xb5A\\x1d0\\xe5\\xff\\xf1\\xaf\\xb5:P\\x9bw\\xde\\bf\\xc0\\xf5v\\xa7i(\\x1dp\\xc0\\x9f\\xf1o\\xb4<J\\xc3Z\\x1e\\xc1\\x19p\\xb3\\xed9j\\xa1\\x03\\xde\\x02wZ\\x1f\\\"I\\x92$I\\x92$I\\x92$I\\x92$I\\x92$I\\x92j\\xfa\\x05\\xe7\\xe1x\\xb9\\xc1\\tI\\xe0\\x00\\x00\\x00\\x00IEND\\xaeB`\\x82\")\n\nfunc appAssetsImgIconsArrowBackPngBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsArrowBackPng, nil\n}\n\nfunc appAssetsImgIconsArrowBackPng() (*asset, error) {\n\tbytes, err := appAssetsImgIconsArrowBackPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/arrow-back.png\", size: 635, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsFaviconPng = []byte(\"\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x10\\b\\x06\\x00\\x00\\x00\\x1f\\xf3\\xffa\\x00\\x00\\x00\\x19tEXtSoftware\\x00Adobe ImageReadyq\\xc9e<\\x00\\x00\\x03!iTXtXML:com.adobe.xmp\\x00\\x00\\x00\\x00\\x00<?xpacket begin=\\\"\\ufeff\\\" id=\\\"W5M0MpCehiHzreSzNTczkc9d\\\"?> <x:xmpmeta xmlns:x=\\\"adobe:ns:meta/\\\" x:xmptk=\\\"Adobe XMP Core 5.5-c014 79.151481, 2013/03/13-12:09:15        \\\"> <rdf:RDF xmlns:rdf=\\\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\\\"> <rdf:Description rdf:about=\\\"\\\" xmlns:xmpMM=\\\"http://ns.adobe.com/xap/1.0/mm/\\\" xmlns:stRef=\\\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\\\" xmlns:xmp=\\\"http://ns.adobe.com/xap/1.0/\\\" xmpMM:DocumentID=\\\"xmp.did:756CA584644F11E4939EE4369DBF39D4\\\" xmpMM:InstanceID=\\\"xmp.iid:756CA583644F11E4939EE4369DBF39D4\\\" xmp:CreatorTool=\\\"Adobe Photoshop CC (Windows)\\\"> <xmpMM:DerivedFrom stRef:instanceID=\\\"xmp.iid:62F2AD71555711E48EAC88F7A4D19BF1\\\" stRef:documentID=\\\"xmp.did:62F2AD72555711E48EAC88F7A4D19BF1\\\"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end=\\\"r\\\"?>\\xf7#U\\x14\\x00\\x00\\x02\\xf4IDATx\\xda|SkHSa\\x18~\\xce\\u0659\\xd3m\\xce\\xcd\\xcdL\\x99I\\xf7D\\xa2?QXYBBZ\\x19i\\xa8\\xe4\\r\\xaa\\x95\\x18*\\x95B\\xa4T&\\bQZa\\x96\\x81\\x05I\\x14R\\x96\\x81H\\x17B\\xbbHY\\x16d\\x14\\xa5\\xa2&\\xe4e\\xe66\\xdd\\u0699\\xbb\\x9c\\xad\\xef\\x9cyL\\xff\\xf4\\xfd\\xfa.\\xcf\\xf3\\xbc\\xcfy\\xde\\xf7P\\x98\\xb7|>\\x9f\\xba\\u007f\\xd4}\\xd1h\\xf1&5<\\xb5\\xe9\\xbf\\x0e\\xbb\\x85\\xfb\\xd8%R\\x18\\x92\\x94\\xa3a!\\x92\\xe71Q\\xd2R\\x8a\\xa2L\\\"\\x87\\x9a%\\ua18c\\x9e\\x9a\\x91I.\\xf1z\\x9b-\\xb2\\xf7\\x97\\x9f\\xa8\\x92\\xd3\\b`\\x80I\\xabW8\\xaf\\xd6Kq$Yi\\x8c\\xd0H\\xda\\u027e\\x98\\bMR&+\\x1778\\xeeyx\\xa1y:b`\\xcc3\\xdf\\x106\\xc5\\xc8\\x10\\xa9\\x95\\xa0\\xb9\\x93]p\\xbfl1\\x83\\x924\\xd5D\\xb8F\\x92N\\xf5\\x8d\\xb8\\x9e\\x1c\\xbclJb\\x9d\\xbe\\x05\\xa0\\xd8h)\\xf6m\\x96#(\\x80B\\xd3k\\x16=\\x83\\xae\\x05\\xef\\xfc\\xfd\\x8d\\\"\\xed\\v\\xc6\\xe6\\xf0\\xe9Er}a(\\xeaZm0\\xecPb\\xdd\\xd2\\x00\\x98\\xff\\xf8\\xadW\\x1f\\u0480wW\\xd7j\\xc5\\xf1T\\x15\\xf2\\xaf\\x9a\\xe0p\\xf9`c\\xbdzz\\xcc\\xcciE\\xd5\\xf2\\xc6)\\xd4\\x15\\x84B\\xafc\\xb0\\xeb\\xec\\x04\\xda{f\\xd0\\xf5\\u0749\\xdd\\x15\\x13$\\x0f\\n7\\x8fiQF0\\x1e\\u038f\\x1f1q:\\xa6\\xeb\\x87S'\\n\\x90\\x94A\\x1c\\x91\\xe0(T\\xe6\\xaa!\\x93R\\xc2\\xfe\\\\\\x8e\\x1a\\xc1$\\xd0q3G\\xc4%0Z\\xfc\\n\\xdd}N-\\xf3y\\xc0%\\x15\\x056\\xac\\n@\\xdb\\a\\a\\x1et\\xdaq\\xfb\\x84\\x0er\\x19E:\\x04\\xc1\\xae\\xe1\\x8a\\t)\\x1b\\x83\\x84`?\\xf5\\xfb\\xf3\\xe8\\x19rS\\u0328\\x99\\x9b\\v\\x86\\xaf\\x12\\x1d\\u01a0\\\"[\\x8dp\\xb5\\x04\\x8f\\u07f1\\u012e\\x0f\\xe9\\xf1\\n\\x9c\\xca\\b\\x81\\xc7\\xeb\\u00f4\\xdd;\\x87\\xff=\\u0341\\x11\\xfb}\\xfe\\x80ZH\\x96'\\xde{i\\x17B\\xcb\\u06ee\\x10\\x80w;\\xec\\xe0\\ve%(0E\\x82\\xad1hp\\xa9\\xc5\\xcag\\xe0\\x17\\xb0\\xb2^\\x1c\\xbdf\\x16,7\\x97\\x87\\xe1}\\xaf\\v\\xfb\\x13\\xe4h\\xebv\\x80#\\x0e\\xb4*\\x1a-oY\\xe4'+q\\xb8\\xd62\\x97\\x01\\xbf\\x98\\x8cx9{\\xff\\r+\\xe7\\x0f|;\\xab\\x9a\\xa6Q[\\xa0Ap\\x10\\x8d\\xbc\\xeaIp\\xc4q\\xd3I\\x1d\\u05af\\x94\\tU\\xe7\\x93\\xf7\\xc6\\u025d\\xd4O\\xa3\\xfb\\xd9\\xe9;S\\x89\\u07c6\\u0774\\xf8@D\\x91\\xb9U\\x01\\x9dJ\\x02\\x8a\\f\\xfb\\x04\\xf9V\\xbe\\x9d\\u054f\\xacs\\xe45QRT\\xe6\\xa8;\\x98\\xe8ELjY\\x9a\\xac\\xb7\\xb0\\x81\\xd3[f\\ag\\xdb\\xda@\\xe4\\x92\\xea\\xe2\\x80\\xf1\\\"\\xb7\\xc8\\f\\u0424\\x84\\xd7\\xeb\\xcf\\xecLV\\xc8\\xe0\\xf2\\b&\\x85&?\\x04\\xfb\\xf1nmiU\\xb6\\xc2L\\xd3\\xff\\x06j\\xfeh\\xf3\\xad,i\\xb0\\bd\\x1eS\\x95\\xab\\xb4\\x90\\xb0w\\x12\\xae\\x9d\\x12A#&O\\xe6\\xab/3\\xf5\\u0126\\x06\\xffY\\xc5{\\x82m[b\\x03\\x8bVDJ\\x1b\\xf9\\xf3_\\x01\\x06\\x00\\xf19?q\\xaaE\\xa0\\xa4\\x00\\x00\\x00\\x00IEND\\xaeB`\\x82\")\n\nfunc appAssetsImgIconsFaviconPngBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsFaviconPng, nil\n}\n\nfunc appAssetsImgIconsFaviconPng() (*asset, error) {\n\tbytes, err := appAssetsImgIconsFaviconPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/favicon.png\", size: 1663, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsIc_arrow_forward_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\"/></svg>`)\n\nfunc appAssetsImgIconsIc_arrow_forward_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsIc_arrow_forward_24pxSvg, nil\n}\n\nfunc appAssetsImgIconsIc_arrow_forward_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIconsIc_arrow_forward_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/ic_arrow_forward_24px.svg\", size: 158, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsIc_cancel_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z\"/></svg>`)\n\nfunc appAssetsImgIconsIc_cancel_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsIc_cancel_24pxSvg, nil\n}\n\nfunc appAssetsImgIconsIc_cancel_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIconsIc_cancel_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/ic_cancel_24px.svg\", size: 276, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsIc_close_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/></svg>`)\n\nfunc appAssetsImgIconsIc_close_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsIc_close_24pxSvg, nil\n}\n\nfunc appAssetsImgIconsIc_close_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIconsIc_close_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/ic_close_24px.svg\", size: 202, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsIc_menuSvg = []byte(`<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\n<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 10 10\" style=\"enable-background:new 0 0 10 10;\" xml:space=\"preserve\">\n\t<g>\n\t\t<path style=\"fill:#010002;\" d=\"M9.5,4.5h-9C0.224,4.5,0,4.724,0,5s0.224,0.5,0.5,0.5h9C9.775,5.5,10,5.276,10,5\n\t\t\tS9.775,4.5,9.5,4.5z\"/>\n\t\t<path style=\"fill:#010002;\" d=\"M0.5,2.5h9C9.775,2.5,10,2.276,10,2S9.775,1.5,9.5,1.5h-9C0.224,1.5,0,1.724,0,2\n\t\t\tS0.224,2.5,0.5,2.5z\"/>\n\t\t<path style=\"fill:#010002;\" d=\"M9.5,7.5h-9C0.224,7.5,0,7.725,0,8s0.224,0.5,0.5,0.5h9C9.775,8.5,10,8.275,10,8\n\t\t\tS9.775,7.5,9.5,7.5z\"/>\n\t</g>\n</svg>\n`)\n\nfunc appAssetsImgIconsIc_menuSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsIc_menuSvg, nil\n}\n\nfunc appAssetsImgIconsIc_menuSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIconsIc_menuSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/ic_menu.svg\", size: 791, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsIc_menu_24pxSvg = []byte(`<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"24px\"\n     height=\"24px\" viewBox=\"0 0 24 24\" enable-background=\"new 0 0 24 24\" xml:space=\"preserve\">\n<g id=\"Header\">\n    <g>\n        <rect x=\"-618\" y=\"-2232\" fill=\"none\" width=\"1400\" height=\"3600\"/>\n    </g>\n</g>\n<g id=\"Label\">\n</g>\n<g id=\"Icon\">\n    <g>\n        <rect fill=\"none\" width=\"24\" height=\"24\"/>\n        <path d=\"M3,18h18v-2H3V18z M3,13h18v-2H3V13z M3,6v2h18V6H3z\" style=\"fill:#f3f3f3;\"/>\n    </g>\n</g>\n<g id=\"Grid\" display=\"none\">\n    <g display=\"inline\">\n    </g>\n</g>\n</svg>\n`)\n\nfunc appAssetsImgIconsIc_menu_24pxSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsIc_menu_24pxSvg, nil\n}\n\nfunc appAssetsImgIconsIc_menu_24pxSvg() (*asset, error) {\n\tbytes, err := appAssetsImgIconsIc_menu_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/ic_menu_24px.svg\", size: 841, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgIconsList_control_downPng = []byte(\"\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x000\\x00\\x00\\x000\\b\\x03\\x00\\x00\\x00`\\xdc\\t\\xb5\\x00\\x00\\x00\\x19tEXtSoftware\\x00Adobe ImageReadyq\\xc9e<\\x00\\x00\\x00'PLTE\\xa8\\xa8\\xa8\\xfc\\xfc\\xfc\\xc0\\xc0\\xc0\\xb6\\xb6\\xb6\\xf7\\xf7\\xf7\\xaa\\xaa\\xaa\\xf6\\xf6\\xf6\\xe6\\xe6\\xe6\\xe8\\xe8\\u8d75\\xb5\\xc3\\xc3\\xc3\\xe5\\xe5\\xe5\\xff\\xff\\xffZLu\\xde\\x00\\x00\\x00\\rtRNS\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00=\\xe8\\\"\\x86\\x00\\x00\\x00\\x8bIDATx\\xda\\xec\\xd4I\\x12\\x80 \\fD\\xd1\\x04\\x04\\x9c\\xee\\u007f^\\u02c1\\xd2`\\xb7\\x96k\\xc3\\xd2\\xfao\\xa1\\t\\xca\\xfc\\xf1\\x88\\x03\\a\\xbf\\x01}\\xd7\\x06\\xb9\\u007f\\x02S\\x8a\\x8d\\xc8C*\\x1c\\x94$bE\\x1eD\\xac0`\\x14\\xb1\\\"\\xc7\\xf5\\xc9H\\x81\\x06+\\xba\\xad\\x0f\\xca\\xdf\\xc1\\n\\u0537_\\xe9*`\\u007f\\x9b\\xc3)p\\u007f\\x1f\\\\\\x15\\xa4\\a\\x93>\\x04\\xe9\\xd1j\\xec\\x82\\xf4p\\x97\\xaa@=^\\xbe]\\xc0\\x9el\\xeb*p\\xcf\\xd6[\\x03\\xe9\\xe9}P\\xf5\\x9f\\x80\\x03\\a\\xafg\\x11`\\x00\\xb0\\xe4e\\a\\x17\\x87\\xea}\\x00\\x00\\x00\\x00IEND\\xaeB`\\x82\")\n\nfunc appAssetsImgIconsList_control_downPngBytes() ([]byte, error) {\n\treturn _appAssetsImgIconsList_control_downPng, nil\n}\n\nfunc appAssetsImgIconsList_control_downPng() (*asset, error) {\n\tbytes, err := appAssetsImgIconsList_control_downPngBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/icons/list_control_down.png\", size: 309, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsImgKubernetesSvg = []byte(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<svg width=\"140px\" height=\"139px\" viewBox=\"0 0 140 139\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n  <path d=\"M69.564453,0.890625 C67.679438,0.97633863 65.83265,1.45183502 64.140625,2.2871094 L64.150425,2.2714844 L19.492222,24.177734 C15.776058,26.000423 13.087287,29.410414 12.181675,33.449219 L1.1484375,82.683594 C0.25354487,86.675977 1.1961448,90.859257 3.7167969,94.082031 L34.617188,133.57031 C37.204703,136.87615 41.169115,138.80794 45.367188,138.80859 L94.929688,138.81459 C99.128112,138.81501 103.09331,136.88391 105.68164,133.57826 L136.58984,94.097796 C139.11186,90.875671 140.05591,86.692328 139.16211,82.699359 L128.13867,33.462891 C127.23402,29.423742 124.54596,26.013013 120.83008,24.189453 L76.177734,2.2734375 C74.123956,1.26576975 71.849913,0.79027587 69.564453,0.890625 L69.564453,0.890625 Z\" fill=\"#FFFFFF\"></path>\n  <path d=\"M69.785156,5.9277344 C68.596708,5.9813144 67.432255,6.2805743 66.365234,6.8066406 L66.371134,6.7988306 L21.712931,28.705081 C19.369578,29.854918 17.674286,32.00564 17.103556,34.552737 L6.0683594,83.785156 C5.504042,86.303482 6.0990134,88.942143 7.6894531,90.974609 L38.587891,130.46289 C40.219821,132.54737 42.719874,133.76535 45.367188,133.76562 L94.931641,133.77162 C97.578956,133.77135 100.079009,132.55338 101.71094,130.46889 L132.61914,90.990374 C134.20958,88.957907 134.80455,86.319246 134.24023,83.800921 L123.2168,34.564453 C122.6465,32.017743 120.95198,29.867093 118.60938,28.716797 L73.957031,6.8007812 C72.661541,6.1647578 71.22697,5.8645457 69.785156,5.9277344 L69.785156,5.9277344 Z\" fill=\"#336EE5\"></path>\n  <path d=\"M70.158203,22.609375 C68.693809,22.609375 67.509033,23.95463 67.490234,25.621094 L67.486328,25.621094 C67.487016,25.861935 67.475646,26.208085 67.484375,26.439453 C67.519875,27.411433 67.725984,28.156904 67.849609,29.052734 C68.074983,30.968571 68.264312,32.557063 68.148438,34.033203 C68.042186,34.772109 67.626171,35.064535 67.279297,35.40625 L67.345703,35.451172 L67.275391,35.451172 L67.275391,35.455078 L67.208984,36.648438 C58.699449,37.421316 50.808823,41.403848 45.007812,47.625 L44.009766,46.898438 L43.964844,46.955078 L43.972656,46.871094 C43.495282,46.936971 43.014968,47.090461 42.386719,46.714844 C41.190848,45.887846 40.100492,44.745117 38.78125,43.369141 C38.178242,42.711651 37.740935,42.081769 37.023438,41.447266 C36.866687,41.309245 36.631678,41.126067 36.451172,40.980469 C36.443613,40.974161 36.437316,40.967191 36.429688,40.960938 C35.147441,39.910367 33.360321,40.0198 32.439453,41.205078 C31.527048,42.380511 31.812064,44.16996 33.066406,45.224609 L33.064453,45.228516 C33.248323,45.378891 33.50537,45.605709 33.6875,45.744141 C34.448628,46.321756 35.145669,46.619167 35.904297,47.078125 C37.502293,48.092354 38.829491,48.929643 39.880859,49.943359 C40.376858,50.488741 40.338814,51.005958 40.382812,51.498047 L40.457031,51.472656 L40.414062,51.529297 L41.300781,52.34375 C38.981079,55.873171 37.23995,59.878341 36.261719,64.253906 C35.291509,68.592614 35.15021,72.93213 35.71875,77.101562 L34.681641,77.408203 L34.697266,77.474609 L34.640625,77.419922 C34.393376,77.844336 34.208378,78.327212 33.53125,78.597656 C32.156134,79.042104 30.606646,79.207233 28.738281,79.408203 C27.861034,79.483198 27.107482,79.439514 26.177734,79.621094 C25.967973,79.661512 25.672514,79.741581 25.447266,79.794922 C25.443964,79.795686 25.440802,79.7961 25.4375,79.796875 C25.434011,79.797691 25.431218,79.799955 25.427734,79.800781 C25.419505,79.802709 25.408389,79.804799 25.400391,79.806641 L25.400391,79.808594 C23.823377,80.19742 22.811243,81.68559 23.136719,83.152344 C23.462521,84.618785 25.002575,85.507142 26.587891,85.15625 L26.587891,85.158203 C26.599278,85.155524 26.615088,85.153125 26.626953,85.150391 C26.631045,85.149431 26.634588,85.147459 26.638672,85.146484 C26.864586,85.094713 27.164032,85.034947 27.369141,84.978516 C28.282888,84.727334 28.943998,84.354858 29.765625,84.03125 C31.534121,83.379283 32.998915,82.836501 34.425781,82.625 C35.150409,82.56593 35.520136,82.917596 35.921875,83.189453 L35.949219,83.113281 L35.964844,83.183594 L37.03125,82.998047 C39.605936,91.246292 45.067458,98.389215 52.492188,102.85938 L52.046875,103.96289 L52.111328,103.99414 L52.029297,104.00586 C52.197542,104.46842 52.451249,104.91582 52.234375,105.62891 C51.714876,107.01143 50.8732,108.35796 49.861328,109.98438 C49.371579,110.73613 48.870608,111.3141 48.427734,112.17383 C48.330344,112.36321 48.209485,112.64157 48.111328,112.85547 C48.107725,112.863 48.103166,112.86938 48.099609,112.87695 C48.095681,112.88534 48.093699,112.89394 48.089844,112.90234 C48.087972,112.90637 48.085834,112.91205 48.083984,112.91602 L48.085938,112.91602 C47.40097,114.42514 47.900428,116.16537 49.21875,116.81836 C50.548871,117.47649 52.203768,116.77883 52.916016,115.26172 C52.91995,115.25333 52.921921,115.24473 52.925781,115.23633 C53.02742,115.02423 53.164417,114.75327 53.248047,114.55859 C53.626421,113.66636 53.753782,112.90269 54.019531,112.04102 C54.626529,110.21405 55.127221,108.70063 55.855469,107.42188 C56.263218,106.80303 56.761002,106.72716 57.21875,106.57422 L57.175781,106.50195 L57.240234,106.5332 L57.820312,105.45703 C59.279187,106.01887 60.786912,106.49484 62.349609,106.85938 C69.289342,108.47785 76.223872,107.82482 82.423828,105.39453 L83.060547,106.57812 L83.123047,106.54688 L83.082031,106.61719 C83.539779,106.77051 84.037813,106.84797 84.445312,107.4668 C85.173436,108.74441 85.674627,110.25896 86.28125,112.08594 C86.547374,112.94761 86.67361,113.71282 87.052734,114.60352 C87.135308,114.79955 87.272056,115.06752 87.373047,115.2793 C87.376902,115.2877 87.378886,115.2963 87.382812,115.30469 C88.09406,116.82295 89.750582,117.52154 91.080078,116.86328 C92.399875,116.21158 92.900929,114.47045 92.214844,112.96094 L92.216797,112.95898 C92.212007,112.94874 92.20611,112.9345 92.201172,112.92383 C92.200152,112.92165 92.198289,112.92014 92.197266,112.91797 C92.097824,112.70281 91.972439,112.41327 91.873047,112.21875 C91.430548,111.35862 90.929451,110.78092 90.439453,110.0293 C89.427455,108.40317 88.58578,107.0552 88.066406,105.67383 C87.849532,104.96074 88.102109,104.51449 88.271484,104.05078 L88.191406,104.03906 L88.255859,104.00781 L87.751953,102.75391 C94.885105,98.433344 100.514721,91.548722 103.20703,83.046875 L104.34961,83.246094 L104.36523,83.177734 L104.39258,83.253906 C104.79508,82.981665 105.16405,82.62843 105.88867,82.6875 C107.31516,82.899001 108.77997,83.441782 110.54883,84.09375 C111.37046,84.417358 112.03081,84.791017 112.94531,85.042969 C113.15137,85.098644 113.45395,85.160732 113.67969,85.212891 C113.68234,85.21352 113.68484,85.21422 113.6875,85.214844 C113.69016,85.21547 113.69265,85.216178 113.69531,85.216797 C113.70411,85.218846 113.71609,85.220642 113.72461,85.222656 L113.72461,85.220703 C115.30963,85.574117 116.85106,84.68396 117.17773,83.216797 C117.5032,81.75119 116.49071,80.262994 114.91406,79.873047 L114.91406,79.871094 C114.90306,79.868505 114.88838,79.864067 114.87695,79.861328 C114.87365,79.860551 114.87049,79.860141 114.86719,79.859375 C114.64143,79.805066 114.34542,79.726689 114.13672,79.685547 C113.20586,79.504737 112.45342,79.545569 111.57617,79.470703 C109.7078,79.268962 108.15808,79.104989 106.7832,78.660156 C106.10509,78.389969 105.92278,77.908918 105.67578,77.484375 L105.61719,77.541016 L105.63281,77.472656 L104.54883,77.150391 C105.81818,68.221389 103.69598,59.45007 99.085938,52.347656 L99.919922,51.580078 L99.876953,51.525391 L99.953125,51.550781 C99.99675,51.058563 99.957001,50.541477 100.453125,49.996094 C101.504,48.982379 102.83132,48.144575 104.42969,47.130859 C105.18869,46.672543 105.88537,46.374233 106.64648,45.796875 C106.8146,45.669733 107.03986,45.470697 107.21875,45.322266 C107.22551,45.316815 107.2335,45.314108 107.24023,45.308594 C108.52261,44.258023 108.81553,42.445045 107.89453,41.259766 C106.98249,40.083783 105.21899,39.970689 103.93945,40.992188 L103.9375,40.990234 C103.75362,41.141636 103.48363,41.347442 103.3125,41.5 C102.59501,42.134118 102.15686,42.765696 101.55273,43.423828 C100.234996,44.799034 99.143138,45.940579 97.947266,46.767578 C97.319018,47.143708 96.838576,46.989705 96.361328,46.923828 L96.369141,47.003906 L96.326172,46.949219 L95.417969,47.611328 C90.871424,42.674999 84.900337,39.013547 77.949219,37.392578 C76.33103,37.015067 74.713896,36.769878 73.105469,36.632812 L73.041016,35.455078 L73.041016,35.451172 L72.970703,35.451172 L73.037109,35.40625 C72.690235,35.064535 72.274344,34.772109 72.167969,34.033203 C72.052094,32.557063 72.239845,30.968571 72.464844,29.052734 C72.588844,28.156904 72.796281,27.411433 72.832031,26.439453 C72.84076,26.208085 72.829514,25.861935 72.830078,25.621094 L72.826172,25.621094 C72.80646,23.955428 71.622757,22.610521 70.158203,22.609375 L70.158203,22.609375 Z M73.501953,43.830078 C74.442204,43.947675 75.386211,44.113788 76.330078,44.333984 C81.549591,45.551151 86.083352,48.217305 89.625,51.828125 L78.119141,60.203125 L78.095703,60.191406 C77.706579,60.483038 77.226529,60.654297 76.707031,60.654297 C75.439284,60.654297 74.408969,59.62693 74.355469,58.337891 L74.298828,58.310547 L73.501953,43.830078 L73.501953,43.830078 Z M66.8125,43.837891 L66.013672,58.285156 L66.001953,58.291016 C65.981453,58.78606 65.81178,59.278861 65.488281,59.695312 C64.698158,60.713394 63.27156,60.900719 62.257812,60.140625 L62.216797,60.160156 L50.775391,51.826172 C55.08706,47.449717 60.722164,44.609096 66.8125,43.837891 L66.8125,43.837891 Z M46.615234,57.228516 L57.050781,66.820312 L57.044922,66.847656 C57.408796,67.172676 57.677719,67.614939 57.792969,68.134766 C58.074593,69.404543 57.32781,70.665429 56.117188,71.005859 L56.105469,71.058594 L42.640625,75.048828 C42.352667,72.040886 42.518719,68.93035 43.216797,65.808594 C43.915022,62.685476 45.081605,59.808054 46.615234,57.228516 L46.615234,57.228516 Z M93.769531,57.232422 C96.851248,62.438943 98.312826,68.673365 97.626953,75.097656 L84.234375,71.125 L84.224609,71.078125 C83.759736,70.947141 83.329733,70.669176 83.005859,70.251953 C82.216486,69.234642 82.354861,67.762405 83.302734,66.916016 L83.291016,66.859375 L93.769531,57.232422 L93.769531,57.232422 Z M68.058594,67.533203 L72.259766,67.533203 L74.945312,70.976562 L73.974609,75.330078 L70.160156,77.208984 L66.345703,75.332031 L65.375,70.976562 L68.058594,67.533203 L68.058594,67.533203 Z M58.345703,79.349609 C58.70919,79.339282 59.08083,79.416193 59.431641,79.589844 C59.554043,79.650391 59.664377,79.724576 59.771484,79.802734 L59.771484,79.925781 L60.085938,80.080078 C60.738857,80.764053 60.958553,81.803391 60.572266,82.726562 L60.589844,82.75 L55.193359,96.148438 C50.016365,92.739684 46.1366,87.648057 44.101562,81.767578 L57.960938,79.357422 L57.986328,79.388672 C58.104765,79.366199 58.224541,79.353052 58.345703,79.349609 L58.345703,79.349609 Z M81.904297,79.40625 C82.055953,79.404147 82.209001,79.418067 82.363281,79.447266 L82.384766,79.419922 L96.111328,81.810547 C93.985653,87.866972 90.034121,92.797189 85.068359,96.089844 L79.732422,82.832031 L79.771484,82.78125 C79.58086,82.326915 79.52475,81.806936 79.640625,81.287109 C79.887484,80.176167 80.842701,79.420971 81.904297,79.40625 L81.904297,79.40625 Z M70.025391,85.224609 C70.918397,85.170809 71.796516,85.646772 72.240234,86.5 L72.240234,86.494141 L72.246094,86.494141 L79.035156,99.101562 C74.341871,100.754225 69.160794,101.12885 63.96875,99.917969 C63.033715,99.69985 62.119901,99.435009 61.230469,99.126953 L68.035156,86.496094 L68.087891,86.496094 C68.31564,86.059993 68.674829,85.692087 69.142578,85.460938 C69.427827,85.319776 69.727722,85.242543 70.025391,85.224609 L70.025391,85.224609 Z\" fill=\"#FFFFFF\"></path>\n</svg>`)\n\nfunc appAssetsImgKubernetesSvgBytes() ([]byte, error) {\n\treturn _appAssetsImgKubernetesSvg, nil\n}\n\nfunc appAssetsImgKubernetesSvg() (*asset, error) {\n\tbytes, err := appAssetsImgKubernetesSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/img/kubernetes.svg\", size: 11663, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsJsAppJs = []byte(`function ReplicationController(){}function ServiceController(){}var componentNamespaces=[\"kubernetesApp.components.dashboard\"],app=angular.module(\"kubernetesApp\",[\"ngRoute\",\"ngMaterial\",\"ngLodash\",\"door3.css\",\"kubernetesApp.config\",\"kubernetesApp.services\",\"angular.filter\"].concat(componentNamespaces));app.factory(\"menu\",[\"$location\",\"$rootScope\",\"sections\",\"$route\",function(e,t,a,n){function r(){var e=n.current.originalPath,t=function(t,a){(e===a.url||e===a.url+\"/\")&&(o.selectSection(t),o.selectPage(t,a))};a.forEach(function(e){e.children?e.children.forEach(function(e){e.pages&&e.pages.forEach(function(a){t(e,a)})}):e.pages?e.pages.forEach(function(a){t(e,a)}):\"link\"===e.type&&t(e,e)})}var o;return t.$on(\"$locationChangeSuccess\",r),o={sections:a,setSections:function(e){this.sections=e},selectSection:function(e){o.openedSection=e},toggleSelectSection:function(e){o.openedSection=o.openedSection===e?null:e},isSectionSelected:function(e){return o.openedSection===e},selectPage:function(e,t){o.currentSection=e,o.currentPage=t},isPageSelected:function(e){return o.currentPage===e}}}]),angular.module(\"kubernetesApp.config\",[]),angular.module(\"kubernetesApp.services\",[\"kubernetesApp.config\"]),app.config([\"$routeProvider\",function(e){e.when(\"/404\",{templateUrl:\"views/partials/404.html\"}).otherwise({redirectTo:\"/404\"})}]).config([\"$routeProvider\",\"manifestRoutes\",function(e,t){angular.forEach(t,function(t){var a={templateUrl:t.templateUrl};t.controller&&(a.controller=t.controller),t.css&&(a.css=t.css),e.when(t.url,a)})}]),app.value(\"sections\",[{name:\"Dashboard\",url:\"/dashboard\",type:\"link\",templateUrl:\"/components/dashboard/pages/home.html\"},{name:\"Dashboard\",type:\"heading\",children:[{name:\"Dashboard\",type:\"toggle\",url:\"/dashboard\",templateUrl:\"/components/dashboard/pages/home.html\",pages:[{name:\"Pods\",url:\"/dashboard/pods\",templateUrl:\"/components/dashboard/views/listPods.html\",type:\"link\"},{name:\"Pod Visualizer\",url:\"/dashboard/visualpods\",templateUrl:\"/components/dashboard/views/listPodsVisualizer.html\",type:\"link\"},{name:\"Services\",url:\"/dashboard/services\",templateUrl:\"/components/dashboard/views/listServices.html\",type:\"link\"},{name:\"Replication Controllers\",url:\"/dashboard/replicationcontrollers\",templateUrl:\"/components/dashboard/views/listReplicationControllers.html\",type:\"link\"},{name:\"Events\",url:\"/dashboard/events\",templateUrl:\"/components/dashboard/views/listEvents.html\",type:\"link\"},{name:\"Nodes\",url:\"/dashboard/nodes\",templateUrl:\"/components/dashboard/views/listMinions.html\",type:\"link\"},{name:\"Replication Controller\",url:\"/dashboard/replicationcontrollers/:replicationControllerId\",templateUrl:\"/components/dashboard/views/replication.html\",type:\"link\"},{name:\"Service\",url:\"/dashboard/services/:serviceId\",templateUrl:\"/components/dashboard/views/service.html\",type:\"link\"},{name:\"Node\",url:\"/dashboard/nodes/:nodeId\",templateUrl:\"/components/dashboard/views/node.html\",type:\"link\"},{name:\"Explore\",url:\"/dashboard/groups/:grouping*?/selector/:selector*?\",templateUrl:\"/components/dashboard/views/groups.html\",type:\"link\"},{name:\"Pod\",url:\"/dashboard/pods/:podId\",templateUrl:\"/components/dashboard/views/pod.html\",type:\"link\"}]}]},{name:\"Graph\",url:\"/graph\",type:\"link\",templateUrl:\"/components/graph/pages/home.html\"},{name:\"Graph\",url:\"/graph/inspect\",type:\"link\",templateUrl:\"/components/graph/pages/inspect.html\",css:\"/components/graph/css/show-details-table.css\"},{name:\"Graph\",type:\"heading\",children:[{name:\"Graph\",type:\"toggle\",url:\"/graph\",templateUrl:\"/components/graph/pages/home.html\",pages:[{name:\"Test\",url:\"/graph/test\",type:\"link\",templateUrl:\"/components/graph/pages/home.html\"}]}]}]),app.directive(\"includeReplace\",function(){\"use strict\";return{require:\"ngInclude\",restrict:\"A\",link:function(e,t,a){t.replaceWith(t.children())}}}).directive(\"compile\",[\"$compile\",function(e){\"use strict\";return function(t,a,n){t.$watch(function(e){return e.$eval(n.compile)},function(n){a.html(n),e(a.contents())(t)})}}]).directive(\"kubernetesUiMenu\",function(){\"use strict\";return{templateUrl:\"views/partials/kubernetes-ui-menu.tmpl.html\"}}).directive(\"menuToggle\",function(){\"use strict\";return{scope:{section:\"=\"},templateUrl:\"views/partials/menu-toggle.tmpl.html\",link:function(e,t){var a=t.parent().controller();e.isOpen=function(){return a.isOpen(e.section)},e.toggle=function(){a.toggleOpen(e.section)};var n=t[0].parentNode.parentNode.parentNode;if(n.classList.contains(\"parent-list-item\")){var r=n.querySelector(\"h2\");t[0].firstChild.setAttribute(\"aria-describedby\",r.id)}}}}),app.filter(\"startFrom\",function(){\"use strict\";return function(e,t){return e.slice(t)}}).filter(\"nospace\",function(){\"use strict\";return function(e){return e?e.replace(/ /g,\"\"):\"\"}}),app.run([\"$route\",angular.noop]).run([\"lodash\",function(e){window._=e}]),app.service(\"SidebarService\",[\"$rootScope\",function(e){var t=this;t.sidebarItems=[],t.clearSidebarItems=function(){t.sidebarItems=[]},t.renderSidebar=function(){var a=\"\";t.sidebarItems.forEach(function(e){a+=e.Html}),a&&(e.sidenavLeft='<div layout=\"column\">'+a+\"</div>\")},t.addSidebarItem=function(e){t.sidebarItems.push(e),t.sidebarItems.sort(function(e,t){return e.order>t.order?1:t.order>e.order?-1:0})}}]),app.value(\"tabs\",[{component:\"dashboard\",title:\"Dashboard\"}]),app.constant(\"manifestRoutes\",[{description:\"Dashboard visualization.\",url:\"/dashboard/\",templateUrl:\"components/dashboard/pages/home.html\"},{description:\"Pods\",url:\"/dashboard/pods\",templateUrl:\"components/dashboard/views/listPods.html\"},{description:\"Services\",url:\"/dashboard/services\",templateUrl:\"components/dashboard/views/listServices.html\"},{description:\"Replication Controllers\",url:\"/dashboard/replicationcontrollers\",templateUrl:\"components/dashboard/views/listReplicationControllers.html\"},{description:\"Events\",url:\"/dashboard/events\",templateUrl:\"components/dashboard/views/listEvents.html\"},{description:\"Nodes\",url:\"/dashboard/nodes\",templateUrl:\"components/dashboard/views/listMinions.html\"},{description:\"Replication Controller\",url:\"/dashboard/replicationcontrollers/:namespaceId/:replicationControllerId\",templateUrl:\"components/dashboard/views/replication.html\"},{description:\"Service\",url:\"/dashboard/services/:namespaceId/:serviceId\",templateUrl:\"components/dashboard/views/service.html\"},{description:\"Node\",url:\"/dashboard/nodes/:nodeId\",templateUrl:\"components/dashboard/views/node.html\"},{description:\"Explore\",url:\"/dashboard/groups/:grouping*?/selector/:selector*?\",templateUrl:\"components/dashboard/views/groups.html\"},{description:\"Pod\",url:\"/dashboard/pods/:namespaceId/:podId\",templateUrl:\"components/dashboard/views/pod.html\"}]),angular.module(\"kubernetesApp.config\",[]).constant(\"ENV\",{\"/\":{k8sApiServer:\"/api/v1\",k8sDataService:\"/cluster-insight\",k8sDataServicePortName:\":cluster-insight\",k8sDataServiceEndpoint:\"/cluster\",k8sDataPollMinIntervalSec:10,k8sDataPollMaxIntervalSec:120,k8sDataPollErrorThreshold:5,cAdvisorProxy:\"\",cAdvisorPort:\"4194\"}}).constant(\"ngConstant\",!0),app.controller(\"PageCtrl\",[\"$scope\",\"$timeout\",\"$mdSidenav\",\"menu\",\"$rootScope\",function(e,t,a,n,r){function o(){return v}function s(){e.showKubernetesUiMenu=!e.showKubernetesUiMenu}function i(){t(function(){a(\"left\").close()})}function c(){t(function(){v=!a(\"left\").isOpen(),a(\"left\").toggle()})}function l(){return $location.path()}function u(e){n.selectPage(null,null),$location.path(\"/\")}function d(){e.closeMenu(),h.focus()}function p(e){return n.isPageSelected(e)}function m(e){var t=!1,a=n.openedSection;return a===e?t=!0:e.children&&e.children.forEach(function(e){e===a&&(t=!0)}),t}function f(e){return n.isSectionSelected(e)}function g(e){n.toggleSelectSection(e)}e.menu=n,e.path=l,e.goHome=u,e.openMenu=c,r.openMenu=c,e.closeMenu=i,e.isSectionSelected=m,r.$on(\"$locationChangeSuccess\",d),this.isOpen=f,this.isSelected=p,this.toggleOpen=g,this.shouldLockOpen=o,e.toggleKubernetesUiMenu=s;var h=document.querySelector(\"[role='main']\"),v=(document.querySelector(\"[role='kubernetes-ui-menu']\"),!1);e.showKubernetesUiMenu=!1}]).filter(\"humanizeDoc\",function(){return function(e){return e?\"directive\"===e.type?e.name.replace(/([A-Z])/g,function(e){return\"-\"+e.toLowerCase()}):e.label||e.name:void 0}}),app.controller(\"TabCtrl\",[\"$scope\",\"$location\",\"tabs\",function(e,t,a){e.tabs=a,e.switchTab=function(e){var n=t.path(),r=a[e];if(r){var o=\"/%s\".format(r.component);-1==n.indexOf(o)&&t.path(o)}}}]),function(){\"use strict\";angular.module(\"kubernetesApp.services\").service(\"cAdvisorService\",[\"$http\",\"$q\",\"ENV\",\"k8sApi\",function(e,t,a,n){function r(a){var n=m(a)+\"machine\",r=t.defer();return e.get(n).success(function(e){r.resolve(e)}).error(function(e,t){r.reject(\"There was an error\")}),r.promise}function o(a,n){n=\"undefined\"==typeof n?\"/\":n;var r=m(a)+\"containers\"+n,o=t.defer(),s={num_stats:10,num_samples:0};return e.post(r,s).success(function(e){o.resolve(e)}).error(function(){o.reject(\"There was an error\")}),o.promise}function s(e,t,a){var n;for(n=a.pop();a.length&&e>=t;n=a.pop())e/=t;return[e,n]}function i(e){var t=s(e,1e3,[\"TB\",\"GB\",\"MB\",\"KB\",\"Bytes\"]);return t[0].toFixed(2)+\" \"+t[1]}function c(e,t){return e.stats.length>0&&e.stats[0][t]}function l(e,t){var a=new Date(e),n=new Date(t);return 1e6*(a.getTime()-n.getTime())}function u(e,t){var a=t.stats[t.stats.length-1],n=0;if(t.spec.has_cpu&&t.stats.length>=2){var r=t.stats[t.stats.length-2],o=a.cpu.usage.total-r.cpu.usage.total,s=l(a.timestamp,r.timestamp);n=Math.round(o/s/e.num_cores*100),n>100&&(n=100)}return{cpuPercentUsage:n}}function d(e,t){var a=t.stats[t.stats.length-1];if(a.filesystem){for(var n=[],r=0;r<a.filesystem.length;r++){var o=a.filesystem[r],s=(Math.floor(100*o.usage/o.capacity),{device:o.device,filesystemNumber:r+1,usage:o.usage,usageDescription:i(o.usage),capacity:o.capacity,capacityDescription:i(o.capacity),totalUsage:Math.floor(100*o.usage/o.capacity)});n.push(s)}return n}}function p(e,t){if(!t.spec.has_memory||c(t,\"memory\")){for(var a=[],n=0;n<t.stats.length;n++){var r=t.stats[n],o=[];o.push(r.timestamp),o.push(r.memory.usage/f),o.push(r.memory.working_set/f),a.push(o)}var s=e.memory_capacity;t.spec.memory.limit&&t.spec.memory.limit<s&&(s=t.spec.memory.limit);var r=t.stats[t.stats.length-1],l={current:{memoryUsage:r.memory.usage,workingMemoryUsage:r.memory.working_set,memoryLimit:s,memoryUsageDescription:i(r.memory.usage),workingMemoryUsageDescription:i(r.memory.working_set),memoryLimitDescription:i(s)},historical:a};return l}}var m=function(e){var t=a[\"/\"].cAdvisorPort||\"8081\",r=a[\"/\"].cAdvisorProxy||n.getUrlBase()+\"/proxy/nodes/\";return r+e+\":\"+t+\"/api/v1.0/\"};this.getMachineInfo=r,this.getContainerInfo=o,this.getDataForMinion=function(e,a){var n,s,i=t.defer();if(a){t.all([r(e),o(e)]).then(function(e){n=e[0],s=e[1];var t=p(n,s),a=u(n,s),r=d(n,s);i.resolve({memoryData:t,cpuData:a,filesystemData:r,machineData:n,containerData:s})},function(e){i.reject(e)})}else i.resolve({memoryData:{current:{memoryUsage:0,workingMemoryUsage:0,memoryLimit:1,memoryUsageDescription:\"-\",memoryLimitDescription:\"-\"},historical:{}},cpuData:{cpuPercentUsage:\"\"},filesystemData:[],machineData:{},containerData:{}});return i.promise};var f=1048576}])}(),function(){\"use strict\";angular.module(\"kubernetesApp.services\").provider(\"k8sApi\",function(){var e=\"\",t=void 0;this.setUrlBase=function(t){e=t},this.setNamespace=function(e){t=e},this.getNamespace=function(){return t};var a=function(e,t,a){var n=t;return void 0!==a&&(n+=\"/\"+a),e.get(n)};this.$get=[\"$http\",\"$q\",function(n,r){var o={};return o.getUrlBase=function(){return e},o.getNamespacedUrlBase=function(a){var n=a||t;return n?e+\"/namespaces/\"+n:e},o.getPods=function(e,t){return a(n,o.getNamespacedUrlBase(t)+\"/pods\",e)},o.getNodes=function(t){return a(n,e+\"/nodes\",t)},o.getMinions=o.getNodes,o.getServices=function(e,t){return a(n,o.getNamespacedUrlBase(t)+\"/services\",e)},o.getReplicationControllers=function(e,t){return a(n,o.getNamespacedUrlBase(t)+\"/replicationcontrollers\",e)},o.getEvents=function(e){return a(n,o.getNamespacedUrlBase()+\"/events\",e)},o}]}).config([\"k8sApiProvider\",\"ENV\",function(e,t){if(t&&t[\"/\"]&&t[\"/\"].k8sApiServer){var a=t[\"/\"].k8sApiServer;if(\"/\"==a[0]){var n=window.location.pathname.lastIndexOf(a);-1!=n&&(a=window.location.pathname.substr(0,n+a.length))}e.setUrlBase(a)}}])}(),function(){\"use strict\";var e=function(e){var t=!1;this.setUseSampleData=function(e){t=e};var a=[];this.setSampleDataFiles=function(e){a=e};var n=\"/api/v1/proxy/namespaces/default/services\",r=void 0,o=\"/cluster-insight\";this.setDataService=function(e){r=e},this.getDataService=function(){return r||o};var s=this.getDataService,i=void 0,c=\":cluster-insight\";this.setDataServicePortName=function(e){i=e},this.getDataServicePortName=function(){return i||c};var l=this.getDataServicePortName,u=void 0,d=\"/cluster\";this.setDataServiceEndpoint=function(e){u=e},this.getDataServiceEndpoint=function(){return u||d};var p=this.getDataServiceEndpoint,m=void 0,f=10;this.setPollMinIntervalSec=function(e){m=e},this.getPollMinIntervalSec=function(){return m||f};var g=this.getPollMinIntervalSec,h=void 0,v=120;this.setPollMaxIntervalSec=function(e){h=e},this.getPollMaxIntervalSec=function(){return h||v};var b=this.getPollMaxIntervalSec,y=void 0,k=5;this.setPollErrorThreshold=function(e){y=e},this.getPollErrorThreshold=function(){return y||k};var S=this.getPollErrorThreshold;this.$get=function(r,o){var i={data:void 0,sequenceNumber:0,useSampleData:t},c=0,u=void 0,d=g(),m=d,f=function(){d=g(),m=d},h=function(){c++,c%S()===0&&console.log(\"Error: \"+c+\" consecutive polling errors for \"+s()+\".\");var e=m;m=d,d+=e,d>b()&&f()},v=function(t){var a=function(t){if(t.resources){var a=function(e){return e.id};t.resources=e.chain(t.resources).sortBy(a).uniq(!0,a).value()}if(t.relations){var n=function(e){return e.source+e.target};t.relations=e.chain(t.relations).sortBy(n).uniq(!0,n).value()}};a(t);var n=JSON.stringify(t),r=\"\";i.data&&(r=JSON.stringify(i.data)),n!==r&&(i.data=t,i.sequenceNumber++),c=0,f()},y=0,k=function(){var e=\"\";return a.length>0&&(e=a[y%a.length],++y),e},P=function(){return n+s()+l()+p()},D=function(e,t){var a=i.useSampleData?k():P();a&&$.getJSON(a).done(function(a,n,r){return a&&a.success?(delete a.success,delete a.timestamp,v(a),e.$apply(),void(u=t?o(function(){D(e,!0)},1e3*d):void 0)):(h(),void(u=t?o(function(){D(e,!0)},1e3*d):void 0))}).fail(function(a,n,r){h(),u=t?o(function(){D(e,!0)},1e3*d):void 0})},x=function(){return u?!0:!1},A=function(e){f(),u||(i.data=void 0,D(e,!0))},w=function(){u&&(o.cancel(u),u=void 0)},C=function(e){w(),f(),i.data=void 0,D(e,!1)};return{k8sdatamodel:i,isPolling:x,refresh:C,start:A,stop:w}}};angular.module(\"kubernetesApp.services\").provider(\"pollK8sDataService\",[\"lodash\",e]).config([\"pollK8sDataServiceProvider\",\"ENV\",function(e,t){t&&t[\"/\"]&&(t[\"/\"].k8sDataService&&e.setDataService(t[\"/\"].k8sDataService),t[\"/\"].k8sDataServicePortName&&e.setDataServicePortName(t[\"/\"].k8sDataServicePortName),t[\"/\"].k8sDataServiceEndpoint&&e.setDataServiceEndpoint(t[\"/\"].k8sDataServiceEndpoint),t[\"/\"].k8sDataPollIntervalMinSec&&e.setPollIntervalSec(t[\"/\"].k8sDataPollIntervalMinSec),t[\"/\"].k8sDataPollIntervalMaxSec&&e.setPollIntervalSec(t[\"/\"].k8sDataPollIntervalMaxSec),t[\"/\"].k8sDataPollErrorThreshold&&e.setPollErrorThreshold(t[\"/\"].k8sDataPollErrorThreshold))}])}(),app.controller(\"cAdvisorController\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"lodash\",\"cAdvisorService\",\"$q\",\"$interval\",function(e,t,a,n,r,o,s){function i(e,t){var a=\"color-\"+(e+1);return t&&t>=90?a+=\" color-critical\":t&&t>=80&&(a+=\" color-warning\"),a}function c(e,t){var a=\"color-max-\"+(e+1);return t&&t>=90?a+=\" color-max-critical\":t&&t>=80&&(a+=\" color-max-warning\"),a}function l(t,a,n,r){void 0===e.maxDataByById[t]&&(e.maxDataByById[t]={});var o=a.current,s=n,l=[];(void 0===e.maxDataByById[t].cpu||e.maxDataByById[t].cpu<s.cpuPercentUsage)&&(e.maxDataByById[t].cpu=s.cpuPercentUsage),l.push({maxValue:e.maxDataByById[t].cpu,maxTickClassNames:i(0,e.maxDataByById[t].cpu),maxClassNames:c(0,e.maxDataByById[t].cpu)});var u=Math.floor(100*o.memoryUsage/o.memoryLimit);(void 0===e.maxDataByById[t].mem||e.maxDataByById[t].mem<u)&&(e.maxDataByById[t].mem=u),l.push({maxValue:e.maxDataByById[t].mem,maxTickClassNames:i(1,e.maxDataByById[t].mem),maxClassNames:c(1,e.maxDataByById[t].mem)});for(var d=0;d<r.length;d++){var p=r[d],m=\"FS #\"+p.filesystemNumber;(void 0===e.maxDataByById[t][m]||e.maxDataByById[t][m]<p.totalUsage)&&(e.maxDataByById[t][m]=p.totalUsage),l.push({maxValue:e.maxDataByById[t][m],maxTickClassNames:i(2+d,e.maxDataByById[t][m]),maxClassNames:c(2+d,e.maxDataByById[t][m])})}return l}function u(e,t,a,n,r,o){var s=e.current,c=t,l=[];l.push({label:\"CPU\",stats:c.cpuPercentUsage+\"% / \"+o+\" CPU\",value:c.cpuPercentUsage,classNames:i(0,c.cpuPercentUsage),maxData:n[0],hostName:r});var u=Math.floor(100*s.memoryUsage/s.memoryLimit);l.push({label:\"Memory\",stats:s.memoryUsageDescription+\" / \"+s.memoryLimitDescription,value:u,classNames:i(1,u),maxData:n[1],hostName:r});for(var d=0;d<a.length;d++){var p=a[d];l.push({label:\"Filesystem #\"+p.filesystemNumber,stats:p.usageDescription+\" / \"+p.capacityDescription,value:p.totalUsage,classNames:i(2+d,p.totalUsage),maxData:n[2+d],hostName:r})}var m=[],f={segments:l};return m.push(f),m}e.k8sApi=a,e.activeMinionDataById={},e.maxDataByById={},e.getData=function(){e.loading=!0,a.getMinions().success(angular.bind(this,function(t){e.minions=t;var a=n.map(t.items,function(e){var t=e.status.conditions.filter(function(e){return\"Ready\"===e.type})[0];return r.getDataForMinion(e.metadata.name,t&&\"True\"===t.status)[\"catch\"](function(e){return null})});o.all(a).then(function(a){n.each(a,function(a,n){if(a){var r=t.items[n],o=l(r.metadata.name,a.memoryData,a.cpuData,a.filesystemData);r.status.addresses?hostname=r.status.addresses[0].address:hostname=r.metadata.name,cpu=r.status.capacity?r.status.capacity.cpu:\"-\",e.activeMinionDataById[r.metadata.name]=u(a.memoryData,a.cpuData,a.filesystemData,o,hostname,cpu)}})},function(){e.loading=!1}),e.loading=!1}))[\"finally\"](function(){e.loading=!1})};var d=s(e.getData,3e3);e.$on(\"$destroy\",function(){angular.isDefined(d)&&(s.cancel(d),d=void 0)}),e.getData()}]),app.controller(\"DashboardCtrl\",[\"$scope\",function(e){}]),app.controller(\"GroupCtrl\",[\"$scope\",\"$route\",\"$interval\",\"$routeParams\",\"k8sApi\",\"$rootScope\",\"$location\",\"lodash\",function(e,t,a,n,r,o,s,i){\"use strict\";function c(){return[{name:\"Type\",value:\"type\"},{name:\"Name\",value:\"name\"}]}function l(){var t=e.groups,a=c(),n=i.map(t.items,function(e){return i.map(e,function(e){return i.keys(e.metadata.labels)})});return n=i.reject(i.uniq(i.flattenDeep(n)),function(e){return\"name\"==e||\"type\"==e||\"\"==e}),n=i.map(n,function(e){return{name:e,value:e}}),a=a.concat(n)}e.doTheBack=function(){window.history.back()},e.capitalize=function(e){return i.capitalize(e)},o.doTheBack=e.doTheBack,e.resetGroupLayout=function(e){delete e.settings},e.handlePath=function(e){var t=e.split(\"/\");t=t.slice(1),0!==t.length&&this.handleGroups(t.slice(1))},e.getState=function(e){return Object.keys(e)[0]},e.clearSelector=function(e){s.path(\"/dashboard/groups/\"+e+\"/selector/\")},e.changeGroupBy=function(){var t=e.selectedGroupBy,a=i.clone(s.search());e.routeParams.grouping!=t&&s.path(\"/dashboard/groups/\"+t+\"/selector/\").search(a)},e.createBarrier=function(e,t){var a=e,n=angular.bind(this,function(e){a--,0===a&&t&&t()});return n},e.handleGroups=function(t,a){e.groupBy=t,e.loading=!0,e.selector=a;var o=[],s=\"\";if(a&&a.length>0){e.selectorPieces=a.split(\",\");for(var i=[],c=[],u=0;u<e.selectorPieces.length;u++){var d=e.selectorPieces[u];if(\"$\"==d[0])c.push(d.slice(2));else if(0===d.indexOf(\"type=\")){var p=d.split(\"=\");p.length>1&&(s=p[1])}else i.push(d)}i.length>0&&o.push(\"labels=\"+encodeURI(i.join(\",\"))),c.length>0&&o.push(\"fields=\"+encodeURI(c.join(\",\")))}var m=\"?\"+o.join(\"&\"),f=[],g=s.length>0?1:3,h=e.createBarrier(g,function(){e.groups=e.groupData(f,0),e.loading=!1,e.groupByOptions=l(),e.selectedGroupBy=n.grouping});(\"\"===s||\"pod\"==s)&&r.getPods(m).success(function(t){e.addLabel(\"type\",\"pod\",t.items);for(var a=0;t.items&&a<t.items.length;++a)t.items[a].metadata.labels.host=t.items[a].spec.host,f.push(t.items[a]);h()}).error(e.handleError),(\"\"===s||\"service\"==s)&&r.getServices(m).success(function(t){e.addLabel(\"type\",\"service\",t.items);for(var a=0;t.items&&a<t.items.length;++a)f.push(t.items[a]);h()}).error(e.handleError),(\"\"===s||\"replicationController\"==s)&&r.getReplicationControllers(m).success(angular.bind(this,function(t){e.addLabel(\"type\",\"replicationController\",t.items);for(var a=0;t.items&&a<t.items.length;++a)f.push(t.items[a]);h()})).error(e.handleError)},e.addLabel=function(e,t,a){if(a)for(var n=0;n<a.length;n++)a[n].metadata.labels||(a[n].metadata.labels=[]),a[n].metadata.labels[e]=t},e.groupData=function(t,a){for(var n={items:{},kind:\"grouping\"},r=0;r<t.length;r++){s=t[r].metadata.labels[e.groupBy[a]],s||(s=\"\");var o=n.items[s];o||(o=[],n.items[s]=o),o.push(t[r])}if(a+1<e.groupBy.length)for(var s in n.items)n.items[s]=e.groupData(n.items[s],a+1);return n},e.getGroupColor=function(e){return\"pod\"===e?\"#6193F0\":\"replicationController\"===e?\"#E008FE\":\"service\"===e?\"#7C43FF\":void 0};var u=n.grouping;u||(u=\"\"),e.routeParams=n,e.route=t,e.handleGroups(u.split(\"/\"),n.selector),e.handleError=function(e,t,a,n){console.log(\"Error (\"+t+\"): \"+e),$scope_.loading=!1},e.changeFilterBy=function(t){var a=(e.selectedGroupBy,i.clone(s.search()));e.routeParams.selector!=t&&s.path(\"/dashboard/groups/\"+e.routeParams.grouping+\"/selector/\"+t).search(a)}}]),angular.module(\"kubernetesApp.components.dashboard\",[]).controller(\"HeaderCtrl\",[\"$scope\",\"$location\",function(e,t){\"use strict\";e.$watch(\"Pages\",function(e,a){\"undefined\"!=typeof e&&t.path(e)}),e.subPages=[{category:\"dashboard\",name:\"Explore\",value:\"/dashboard/groups/type/selector/\"},{category:\"dashboard\",name:\"Pods\",value:\"/dashboard/pods\"},{category:\"dashboard\",name:\"Nodes\",value:\"/dashboard/nodes\"},{category:\"dashboard\",name:\"Replication Controllers\",value:\"/dashboard/replicationcontrollers\"},{category:\"dashboard\",name:\"Services\",value:\"/dashboard/services\"},{category:\"dashboard\",name:\"Events\",value:\"/dashboard/events\"}]}]),app.controller(\"ListEventsCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"$location\",\"$filter\",function(e,t,a,n,r){\"use strict\";function o(){e.loading=!0,a.getEvents().success(function(t){e.loading=!1;t.items.forEach(function(t){var a=\"\";t.source&&(a=t.source.component+\" \"+t.source.host),e.content.push({firstSeen:r(\"date\")(t.firstTimestamp,\"medium\"),lastSeen:r(\"date\")(t.lastTimestamp,\"medium\"),count:t.count,name:t.involvedObject.name,kind:t.involvedObject.kind,subObject:t.involvedObject.fieldPath,reason:t.reason,source:a,message:t.message})})}).error(e.handleError)}e.getData=o,e.loading=!0,e.k8sApi=a,e.pods=null,e.groupedPods=null,e.serverView=!1,e.headers=[{name:\"First Seen\",field:\"firstSeen\"},{name:\"Last Seen\",field:\"lastSeen\"},{name:\"Count\",field:\"count\"},{name:\"Name\",field:\"name\"},{name:\"Kind\",field:\"kind\"},{name:\"SubObject\",field:\"subObject\"},{name:\"Reason\",field:\"reason\"},{name:\"Source\",field:\"source\"},{name:\"Message\",field:\"message\"}],e.sortable=[\"firstSeen\",\"lastSeen\",\"count\",\"name\",\"kind\",\"subObject\",\"reason\",\"source\"],e.count=10,e.content=[],o()}]),app.controller(\"ListMinionsCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"$location\",function(e,t,a,n){\"use strict\";function r(){e.loading=!0,a.getMinions().success(function(t){e.loading=!1;t.items.forEach(function(t){var a=\"\";t.status.conditions&&Object.keys(t.status.conditions).forEach(function(e){\"True\"==t.status.conditions[e].status&&(a+=t.status.conditions[e].type)}),e.content.push({name:t.metadata.name,addresses:_.map(t.status.addresses,function(e){return e.address}).join(\", \"),status:a})})}).error(e.handleError)}e.getData=r,e.loading=!0,e.k8sApi=a,e.pods=null,e.groupedPods=null,e.serverView=!1,e.headers=[{name:\"Name\",field:\"name\"},{name:\"Addresses\",field:\"addresses\"},{name:\"Status\",field:\"status\"}],e.custom={name:\"\",status:\"grey\",ip:\"grey\"},e.sortable=[\"name\",\"status\",\"ip\"],e.thumbs=\"thumb\",e.count=10,e.go=function(e){n.path(\"/dashboard/nodes/\"+e.name)},e.content=[],r()}]),app.controller(\"ListPodsCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"lodash\",\"$location\",function(e,t,a,n,r){function o(t,a,n,r){console.log(\"Error (\"+a+\"): \"+t),e.loading=!1}function s(e){return c.has(e.metadata.labels,\"name\")?e.metadata.labels.name:e.metadata.name}function i(){e.loading=!0,a.getPods().success(angular.bind(this,function(t){e.loading=!1;var a=function(e){return\",\"==e.substring(0,1)?e.substring(1):e};t.items.forEach(function(t){var n=\"\",r=\"\",o=\"\",s=\"\";t.spec&&Object.keys(t.spec.containers).forEach(function(e){n+=\", \"+t.spec.containers[e].name,r+=\", \"+t.spec.containers[e].image}),t.metadata.labels&&Object.keys(t.metadata.labels).forEach(function(e){\"name\"==e&&(o+=\", \"+t.metadata.labels[e]),\"uses\"==e&&(s+=\", \"+t.metadata.labels[e])}),e.content.push({pod:t.metadata.name,ip:t.status.podIP,containers:a(n),images:a(r),host:t.spec.host,labels:a(o)+\":\"+a(s),status:t.status.phase,namespace:t.metadata.namespace})})})).error(angular.bind(this,o))}var c=n;e.getData=i,e.loading=!0,e.k8sApi=a,e.pods=null,e.groupedPods=null,e.serverView=!1,e.headers=[{name:\"Pod\",field:\"pod\"},{name:\"IP\",field:\"ip\"},{name:\"Status\",field:\"status\"},{name:\"Containers\",field:\"containers\"},{name:\"Images\",field:\"images\"},{name:\"Namespace\",field:\"namespace\"},{name:\"Host\",field:\"host\"},{name:\"Labels\",field:\"labels\"}],e.custom={pod:\"\",ip:\"grey\",containers:\"grey\",images:\"grey\",host:\"grey\",labels:\"grey\",status:\"grey\"},e.sortable=[\"pod\",\"ip\",\"status\"],e.count=10,e.go=function(e){r.path(\"/dashboard/pods/\"+e.namespace+\"/\"+e.pod)};var l=[];e.content=[],e.getPodRestarts=function(e){var t=null,a=c.first(e.spec.containers);return a&&(t=e.status.containerStatuses[a.name].restartCount),t},e.otherLabels=function(e){return c.omit(e,\"name\")},e.podStatusClass=function(e){var t=e.status.phase.toLowerCase();return\"running\"==t||\"succeeded\"==t?null:\"status-\"+t},e.podIndexFromName=function(e){var t=s(e);return c.indexOf(l,t)+1},i()}]),app.controller(\"ListReplicationControllersCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"$location\",function(e,t,a,n){\"use strict\";function r(){e.loading=!0,a.getReplicationControllers().success(function(t){e.loading=!1;t.items.forEach(function(t){var a=\"\",n=\"\";t.spec.template.spec.containers&&Object.keys(t.spec.template.spec.containers).forEach(function(e){a+=t.spec.template.spec.containers[e].name,n+=t.spec.template.spec.containers[e].image});var r=\"\";t.spec.selector&&(r=_.map(t.spec.selector,function(e,t){return t+\"=\"+e}).join(\", \")),e.content.push({controller:t.metadata.name,containers:a,images:n,selector:r,replicas:t.status.replicas,namespace:t.metadata.namespace})})}).error(e.handleError)}e.getData=r,e.loading=!0,e.k8sApi=a,e.pods=null,e.groupedPods=null,e.serverView=!1,e.headers=[{name:\"Controller\",field:\"controller\"},{name:\"Containers\",field:\"containers\"},{name:\"Images\",field:\"images\"},{name:\"Selector\",field:\"selector\"},{name:\"Replicas\",field:\"replicas\"},{name:\"Namespace\",field:\"namespace\"}],e.custom={controller:\"\",containers:\"grey\",images:\"grey\",selector:\"grey\",replicas:\"grey\",namespace:\"grey\"},e.sortable=[\"controller\",\"containers\",\"images\",\"namespace\"],e.thumbs=\"thumb\",e.count=10,e.go=function(e){n.path(\"/dashboard/replicationcontrollers/\"+e.namespace+\"/\"+e.controller)},e.content=[],r()}]),app.controller(\"ListServicesCtrl\",[\"$scope\",\"$interval\",\"$routeParams\",\"k8sApi\",\"$rootScope\",\"$location\",function(e,t,a,n,r,o){\"use strict\";e.doTheBack=function(){window.history.back()},e.headers=[{name:\"Name\",field:\"name\"},{name:\"Labels\",field:\"labels\"},{name:\"Selector\",field:\"selector\"},{name:\"IP\",field:\"ip\"},{name:\"Namespace\",field:\"namespace\"}],e.custom={name:\"\",ip:\"grey\",selector:\"grey\",port:\"grey\",labels:\"grey\",namespace:\"grey\"},e.sortable=[\"name\",\"ip\",\"port\",\"namespace\"],e.count=10,e.go=function(e){o.path(\"/dashboard/services/\"+e.namespace+\"/\"+e.name)},e.content=[],r.doTheBack=e.doTheBack,e.handleError=function(e,t,a,n){console.log(\"Error (\"+t+\"): \"+e),$scope_.loading=!1},e.getData=function(){e.loading=!0,n.getServices().success(angular.bind(this,function(t){e.services=t,e.loading=!1;t.items.constructor===Array&&t.items.forEach(function(t){var a=\"\";t.metadata.labels&&(a=_.map(t.metadata.labels,function(e,t){return t+\"=\"+e}).join(\", \"));var n=\"\";t.spec.selector&&(n=_.map(t.spec.selector,function(e,t){return t+\"=\"+e}).join(\", \"));var r=\"\";t.spec.ports&&(r=_.map(t.spec.ports,function(e){var t=\"\";return e.name&&(t=e.name+\": \"),t+=e.port}).join(\", \")),e.content.push({name:t.metadata.name,ip:t.spec.portalIP,port:r,selector:n,labels:a,namespace:t.metadata.namespace})})})).error(e.handleError)},e.getData()}]),app.controller(\"NodeCtrl\",[\"$scope\",\"$interval\",\"$routeParams\",\"k8sApi\",\"$rootScope\",function(e,t,a,n,r){\"use strict\";e.doTheBack=function(){window.history.back()},r.doTheBack=e.doTheBack,e.handleError=function(e,t,a,n){console.log(\"Error (\"+t+\"): \"+e),$scope_.loading=!1},e.handleNode=function(t){e.loading=!0,n.getNodes(t).success(angular.bind(this,function(t){e.node=t,e.loading=!1})).error(e.handleError)},e.handleNode(a.nodeId)}]),app.controller(\"PodCtrl\",[\"$scope\",\"$interval\",\"$routeParams\",\"k8sApi\",\"$rootScope\",function(e,t,a,n,r){\"use strict\";e.doTheBack=function(){window.history.back()},r.doTheBack=e.doTheBack,e.handleError=function(e,t,a,n){console.log(\"Error (\"+t+\"): \"+e),$scope_.loading=!1},e.handlePod=function(t,a){e.loading=!0,n.getPods(t,a).success(angular.bind(this,function(t){e.pod=t,e.loading=!1})).error(e.handleError)},e.handlePod(a.podId,a.namespaceId)}]),ReplicationController.prototype.getData=function(e,t){this.scope.loading=!0,this.k8sApi.getReplicationControllers(e,t).success(angular.bind(this,function(e){this.scope.replicationController=e,this.scope.loading=!1})).error(angular.bind(this,this.handleError))},ReplicationController.prototype.handleError=function(e,t,a,n){console.log(\"error (\"+t+\"): \"+e),this.scope.loading=!1},app.controller(\"ReplicationControllerCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",function(e,t,a){e.controller=new ReplicationController,e.controller.k8sApi=a,e.controller.scope=e,e.controller.getData(t.replicationControllerId,t.namespaceId),e.doTheBack=function(){window.history.back()},e.getSelectorUrlFragment=function(e){return _.map(e,function(e,t){return t+\"=\"+e}).join(\",\")}}]),ServiceController.prototype.getData=function(e,t){this.scope.loading=!0,this.k8sApi.getServices(e,t).success(angular.bind(this,function(e){this.scope.service=e,this.scope.loading=!1})).error(angular.bind(this,this.handleError))},ServiceController.prototype.handleError=function(e,t,a,n){console.log(\"Error (\"+t+\"): \"+e),this.scope.loading=!1},app.controller(\"ServiceCtrl\",[\"$scope\",\"$routeParams\",\"k8sApi\",\"$location\",function(e,t,a,n){e.controller=new ServiceController,e.controller.k8sApi=a,e.controller.scope=e,e.controller.getData(t.serviceId,t.namespaceId),e.doTheBack=function(){window.history.back()},e.go=function(e){n.path(\"/dashboard/services/\"+e.metadata.name)},e.getSelectorUrlFragment=function(e){return _.map(e,function(e,t){return t+\"=\"+e}).join(\",\")}}]),function(){\"use strict\";angular.module(\"kubernetesApp.components.dashboard\").directive(\"d3MinionBarGauge\",[\"d3DashboardService\",function(e){return{restrict:\"E\",scope:{data:\"=\",thickness:\"@\",graphWidth:\"@\",graphHeight:\"@\"},link:function(t,a,n){var r=function(e){function n(e,a){return null===a||void 0===a?t.render(e):s(a,e)}function r(e){var t=e.data,a=c(t);o(a,e.width,e.height)}function o(t,n,r){v=e.select(a[0]).append(\"svg\").attr(\"width\",\"100%\"),b=e.select(a[0]).append(\"svg\").attr(\"width\",\"100%\");var o=v.attr(\"class\",\"chart\").attr(\"width\",n).attr(\"height\",r-25).append(\"svg:g\").attr(\"class\",\"concentricchart\").attr(\"transform\",\"translate(\"+n/2+\",\"+r/4+\")\");b.attr(\"class\",\"legend\").attr(\"width\",n);y=Math.min(n,r)/2;var s=(b.append(\"text\").attr(\"class\",\"hostName\").attr(\"transform\",\"translate(\"+(n-120)/2+\",15)\"),b.append(\"svg:g\").attr(\"class\",\"label_legend_area\").attr(\"transform\",\"translate(\"+(n-215)/2+\",35)\"));s.append(\"svg:g\").attr(\"class\",\"legend_group\"),\ns.append(\"svg:g\").attr(\"class\",\"label_group\").attr(\"transform\",\"translate(25,11)\"),s.append(\"svg:g\").attr(\"class\",\"stats_group\").attr(\"transform\",\"translate(115,11)\"),o.append(\"svg:g\").attr(\"class\",\"path_group\").attr(\"transform\",\"translate(0,\"+r/4+\")\"),o.append(\"svg:g\").attr(\"class\",\"value_group\").attr(\"transform\",\"translate(\"+-(.205*n)+\",\"+-(.1*r)+\")\");l(o,t)}function s(e,t){if(void 0!==t&&null!==t){var a=jQuery.extend(!0,{},t),n=jQuery.extend(!0,{},e),r=c(a);k=c(n),i(r)}}function i(e){l(null,e)}function c(e){var t=(2*Math.PI*y,[]);return $.each(e[0].segments,function(t,a){function n(e){var t=200;e>t&&(e=t);var a=e,n=a/t,r=4*n*Math.PI,o=r,s=2*Math.PI,i=s+o;return{startAngle:s,endAngle:i}}var r=n(a.value);e[0].segments[t].startAngle=r.startAngle,e[0].segments[t].endAngle=r.endAngle;var o=a.maxData,s=n(o.maxValue+.2);e[0].segments[t].maxTickStartAngle=s.startAngle,e[0].segments[t].maxTickEndAngle=s.endAngle;var i=n(o.maxValue);e[0].segments[t].maxArcStartAngle=i.startAngle,e[0].segments[t].maxArcEndAngle=i.endAngle,e[0].segments[t].index=t}),t.push(e[0].segments),t[0]}function l(e,a){var n=v,r=750;$.each(a,function(e,t){void 0!==k[e]?a[e].previousEndAngle=k[e].endAngle:a[e].previousEndAngle=0});var o=parseInt(t.thickness,10),s=parseInt(t.graphWidth,10)/3,i=v.select(\".path_group\"),c=i.selectAll(\".arc_group\").data(a),l=c.enter().append(\"g\").attr(\"class\",\"arc_group\");l.append(\"path\").attr(\"class\",\"bg-circle\").attr(\"d\",h(o,s)),l.append(\"path\").attr(\"class\",function(e,t){return\"max_tick_arc \"+e.maxData.maxTickClassNames}),l.append(\"path\").attr(\"class\",function(e,t){return\"max_bg_arc \"+e.maxData.maxClassNames}),l.append(\"path\").attr(\"class\",function(e,t){return\"value_arc \"+e.classNames});var f=c.select(\".max_tick_arc\");f.transition().attr(\"class\",function(e,t){return\"max_tick_arc \"+e.maxData.maxTickClassNames}).attr(\"d\",function(e){var t=d(o,s);return t.startAngle(e.maxTickStartAngle),t.endAngle(e.maxTickEndAngle),t(e)});var g=c.select(\".max_bg_arc\");g.transition().attr(\"class\",function(e,t){return\"max_bg_arc \"+e.maxData.maxClassNames}).attr(\"d\",function(e){var t=d(o,s);return t.startAngle(e.maxArcStartAngle),t.endAngle(e.maxArcEndAngle),t(e)});var b=c.select(\".value_arc\");b.transition().ease(\"exp\").attr(\"class\",function(e,t){return\"value_arc \"+e.classNames}).duration(r).attrTween(\"d\",function(e){return u(e,o,s)}),c.exit().select(\".value_arc\").transition().ease(\"exp\").duration(r).attrTween(\"d\",function(e){return u(e,o,s)}).remove(),p(n,a,s,o),m(n,a)}function u(t,a,n){var r=JSON.parse(JSON.stringify(t));r.endAngle=t.previousEndAngle;var o=e.interpolate(r,t);return function(e){return g(a,n)(o(e))}}function d(t,a){var n=e.svg.arc().innerRadius(function(e){return f(a,e.index)}).outerRadius(function(e){return f(a+t,e.index)});return n}function p(e,t,a,n){v.select(\".value_group\").selectAll(\"*\").remove();var r=(t.length,e.select(\".value_group\")),o=r.selectAll(\"text.value\").data(t);o.enter().append(\"svg:text\").attr(\"class\",\"value\").attr(\"dx\",function(e,t){return 68}).attr(\"dy\",function(e,t){return(n+3)*t}).attr(\"text-anchor\",function(e){return\"start\"}).text(function(e){return e.value}),o.transition().duration(300).attrTween(\"d\",function(e){return u(e,n,a)}),o.exit().remove()}function m(e,t){var a=b;a.select(\".label_group\").selectAll(\"*\").remove(),a.select(\".legend_group\").selectAll(\"*\").remove(),a.select(\".stats_group\").selectAll(\"*\").remove();var n=a.select(\".hostName\"),r=a.select(\".label_group\"),o=a.select(\".stats_group\");n.text(t[0].hostName),n=a.selectAll(\"text.hostName\").data(t),n.attr(\"text-anchor\",function(e){return\"start\"}).text(function(e){return e.hostName}),n.exit().remove();var s=r.selectAll(\"text.labels\").data(t);s.enter().append(\"svg:text\").attr(\"class\",\"labels\").attr(\"dy\",function(e,t){return 19*t}).attr(\"text-anchor\",function(e){return\"start\"}).text(function(e){return e.label}),s.exit().remove();var i=o.selectAll(\"text.stats\").data(t);i.enter().append(\"svg:text\").attr(\"class\",\"stats\").attr(\"dy\",function(e,t){return 19*t}).attr(\"text-anchor\",function(e){return\"start\"}).text(function(e){return e.stats}),i.exit().remove();var c=a.select(\".legend_group\"),l=c.selectAll(\"rect\").data(t);l.enter().append(\"svg:rect\").attr(\"x\",2).attr(\"y\",function(e,t){return 19*t}).attr(\"width\",13).attr(\"height\",13).attr(\"class\",function(e,t){return\"rect \"+e.classNames}),l.exit().remove()}function f(e,t){return e-20*t}function g(t,a){var n=e.svg.arc().innerRadius(function(e){return f(a,e.index)}).outerRadius(function(e){return f(a+t,e.index)}).startAngle(function(e,t){return e.startAngle}).endAngle(function(e,t){return e.endAngle});return n}function h(t,a){var n=e.svg.arc().innerRadius(function(e){return f(a,e.index)}).outerRadius(function(e){return f(a+t,e.index)}).startAngle(0).endAngle(function(){return 2*Math.PI});return n}var v=e.select(\"svg.chart\"),b=e.select(\"svg.legend\");window.onresize=function(){return t.$apply()},t.$watch(function(){return angular.element(window)[0].innerWidth},function(){return t.render(t.data)}),t.$watch(\"data\",function(e,t){return n(e,t)},!0);var y=100,k=[];t.render=function(n){if(void 0!==n&&null!==n){e.select(a[0]).select(\"svg.chart\").remove(),e.select(a[0]).select(\"svg.legend\").remove();var o=($(a[0]),t.graphWidth),s=t.graphHeight,i={data:n,width:o,height:s};r(i)}}};e.d3().then(r)}}}])}(),function(){\"use strict\";angular.module(\"kubernetesApp.components.dashboard\").directive(\"dashboardHeader\",function(){return{restrict:\"A\",replace:!0,scope:{user:\"=\"},templateUrl:\"components/dashboard/pages/header.html\",controller:[\"$scope\",\"$filter\",\"$location\",\"menu\",\"$rootScope\",function(e,t,a,n,r){e.menu=n,e.$watch(\"page\",function(e,t){\"undefined\"!=typeof e&&a.path(e)}),e.subpages=[{category:\"dashboard\",name:\"Explore\",value:\"/dashboard/groups/type/selector/\",id:\"groupsView\"},{category:\"dashboard\",name:\"Pods\",value:\"/dashboard/pods\",id:\"podsView\"},{category:\"dashboard\",name:\"Nodes\",value:\"/dashboard/nodes\",id:\"minionsView\"},{category:\"dashboard\",name:\"Replication Controllers\",value:\"/dashboard/replicationcontrollers\",id:\"rcView\"},{category:\"dashboard\",name:\"Services\",value:\"/dashboard/services\",id:\"servicesView\"},{category:\"dashboard\",name:\"Events\",value:\"/dashboard/events\",id:\"eventsView\"}]}]}}).directive(\"dashboardFooter\",function(){return{restrict:\"A\",replace:!0,templateUrl:\"components/dashboard/pages/footer.html\",controller:[\"$scope\",\"$filter\",function(e,t){}]}}).directive(\"mdTable\",function(){return{restrict:\"E\",scope:{headers:\"=\",content:\"=\",sortable:\"=\",filters:\"=\",customClass:\"=customClass\",thumbs:\"=\",count:\"=\",doSelect:\"&onSelect\"},transclude:!0,controller:[\"$scope\",\"$filter\",\"$window\",\"$location\",function(e,t,a,n){var r=t(\"orderBy\");e.currentPage=0,e.nbOfPages=function(){return Math.ceil(e.content.length/e.count)},e.handleSort=function(t){return e.sortable.indexOf(t)>-1?!0:!1},e.order=function(t,a){e.content=r(e.content,t,a),e.predicate=t},e.order(e.sortable[0],!1),e.getNumber=function(e){return new Array(e)},e.goToPage=function(t){e.currentPage=t},e.showMore=function(){return angular.isDefined(e.moreClick)}}],templateUrl:\"views/partials/md-table.tmpl.html\"}})}(),angular.module(\"kubernetesApp.components.dashboard\").factory(\"d3DashboardService\",[\"$document\",\"$q\",\"$rootScope\",function(e,t,a){function n(){a.$apply(function(){r.resolve(window.d3)})}var r=t.defer(),o=e[0].createElement(\"script\");o.type=\"text/javascript\",o.async=!0,o.src=\"vendor/d3/d3.min.js\",o.onreadystatechange=function(){\"complete\"==this.readyState&&n()},o.onload=n;var s=e[0].getElementsByTagName(\"body\")[0];return s.appendChild(o),{d3:function(){return r.promise}}}]),function(){\"use strict\";function e(e){var t={kind:\"Pod\",apiVersion:\"v1\",metadata:{name:\"redis-master-c0r1n\",generateName:\"redis-master-\",namespace:\"default\",selfLink:\"/api/v1/namespaces/default/pods/redis-master-c0r1n\",uid:\"f12ddfaf-ff77-11e4-8f2d-080027213276\",resourceVersion:\"39\",creationTimestamp:\"2015-05-21T05:12:14Z\",labels:{name:\"redis-master\"},annotations:{\"kubernetes.io/created-by\":'{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicationController\",\"namespace\":\"default\",\"name\":\"redis-master\",\"uid\":\"f12969e0-ff77-11e4-8f2d-080027213276\",\"apiVersion\":\"v1\",\"resourceVersion\":\"26\"}}'}},spec:{volumes:[{name:\"default-token-zb4rq\",secret:{secretName:\"default-token-zb4rq\"}}],containers:[{name:\"master\",image:\"redis\",ports:[{containerPort:6379,protocol:\"TCP\"}],resources:{},volumeMounts:[{name:\"default-token-zb4rq\",readOnly:!0,mountPath:\"/var/run/secrets/kubernetes.io/serviceaccount\"}],terminationMessagePath:\"/dev/termination-log\",imagePullPolicy:\"IfNotPresent\",capabilities:{},securityContext:{capabilities:{},privileged:!1}}],restartPolicy:\"Always\",dnsPolicy:\"ClusterFirst\",serviceAccount:\"default\",host:\"127.0.0.1\"},status:{phase:\"Running\",Condition:[{type:\"Ready\",status:\"True\"}],hostIP:\"127.0.0.1\",podIP:\"172.17.0.1\",startTime:\"2015-05-21T05:12:14Z\",containerStatuses:[{name:\"master\",state:{running:{startedAt:\"2015-05-21T05:12:14Z\"}},lastState:{},ready:!0,restartCount:0,image:\"redis\",imageID:\"docker://95af5842ddb9b03f7c6ec7601e65924cec516fcedd7e590ae31660057085cf67\",containerID:\"docker://ae2a1e0a91a8b1015191a0b8e2ce8c55a86fb1a9a2b1e8e3b29430c9d93c8c09\"}]}};return{loadAll:function(){return e.when(t)}}}angular.module(\"pods\",[]).service(\"podService\",[\"$q\",e])}(),function(){\"use strict\";function e(e){var t={kind:\"List\",apiVersion:\"v1\",metadata:{},items:[{kind:\"ReplicationController\",apiVersion:\"v1\",metadata:{name:\"redis-master\",namespace:\"default\",selfLink:\"/api/v1/namespaces/default/replicationcontrollers/redis-master\",uid:\"f12969e0-ff77-11e4-8f2d-080027213276\",resourceVersion:\"28\",creationTimestamp:\"2015-05-21T05:12:14Z\",labels:{name:\"redis-master\"}},spec:{replicas:1,selector:{name:\"redis-master\"},template:{metadata:{creationTimestamp:null,labels:{name:\"redis-master\"}},spec:{containers:[{name:\"master\",image:\"redis\",ports:[{containerPort:6379,protocol:\"TCP\"}],resources:{},terminationMessagePath:\"/dev/termination-log\",imagePullPolicy:\"IfNotPresent\",capabilities:{},securityContext:{capabilities:{},privileged:!1}}],restartPolicy:\"Always\",dnsPolicy:\"ClusterFirst\",serviceAccount:\"\"}}},status:{replicas:1}}]};return{loadAll:function(){return e.when(t)}}}angular.module(\"replicationControllers\",[]).service(\"replicationControllerService\",[\"$q\",e])}(),function(){\"use strict\";function e(e){var t={kind:\"List\",apiVersion:\"v1\",metadata:{},items:[{kind:\"Service\",apiVersion:\"v1\",metadata:{name:\"kubernetes\",namespace:\"default\",selfLink:\"/api/v1/namespaces/default/services/kubernetes\",resourceVersion:\"6\",creationTimestamp:null,labels:{component:\"apiserver\",provider:\"kubernetes\"}},spec:{ports:[{protocol:\"TCP\",port:443,targetPort:443}],portalIP:\"10.0.0.2\",sessionAffinity:\"None\"},status:{}},{kind:\"Service\",apiVersion:\"v1\",metadata:{name:\"kubernetes-ro\",namespace:\"default\",selfLink:\"/api/v1/namespaces/default/services/kubernetes-ro\",resourceVersion:\"8\",creationTimestamp:null,labels:{component:\"apiserver\",provider:\"kubernetes\"}},spec:{ports:[{protocol:\"TCP\",port:80,targetPort:80}],portalIP:\"10.0.0.1\",sessionAffinity:\"None\"},status:{}},{kind:\"Service\",apiVersion:\"v1\",metadata:{name:\"redis-master\",namespace:\"default\",selfLink:\"/api/v1/namespaces/default/services/redis-master\",uid:\"a6fde246-ff78-11e4-8f2d-080027213276\",resourceVersion:\"72\",creationTimestamp:\"2015-05-21T05:17:19Z\",labels:{name:\"redis-master\"}},spec:{ports:[{protocol:\"TCP\",port:6379,targetPort:6379}],selector:{name:\"redis-master\"},portalIP:\"10.0.0.124\",sessionAffinity:\"None\"},status:{}}]};return{loadAll:function(){return e.when(t)}}}angular.module(\"services\",[]).service(\"serviceService\",[\"$q\",e])}();`)\n\nfunc appAssetsJsAppJsBytes() ([]byte, error) {\n\treturn _appAssetsJsAppJs, nil\n}\n\nfunc appAssetsJsAppJs() (*asset, error) {\n\tbytes, err := appAssetsJsAppJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/js/app.js\", size: 43636, mode: os.FileMode(420), modTime: time.Unix(1454116418, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appAssetsJsBaseJs = []byte(`!function(e,t){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=Z.type(e);return\"function\"===n||Z.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(Z.isFunction(t))return Z.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return Z.grep(e,function(e){return e===t!==n});if(\"string\"==typeof t){if(ae.test(t))return Z.filter(t,e,n);t=Z.filter(t,e)}return Z.grep(e,function(e){return U.call(t,e)>=0!==n})}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function o(e){var t=he[e]={};return Z.each(e.match(de)||[],function(e,n){t[n]=!0}),t}function s(){J.removeEventListener(\"DOMContentLoaded\",s,!1),e.removeEventListener(\"load\",s,!1),Z.ready()}function a(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=Z.expando+a.uid++}function u(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(be,\"-$1\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=\"true\"===n?!0:\"false\"===n?!1:\"null\"===n?null:+n+\"\"===n?+n:xe.test(n)?Z.parseJSON(n):n}catch(i){}ye.set(e,t,n)}else n=void 0;return n}function l(){return!0}function c(){return!1}function f(){try{return J.activeElement}catch(e){}}function p(e,t){return Z.nodeName(e,\"table\")&&Z.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\")):e}function d(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function h(e){var t=Pe.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function g(e,t){for(var n=0,r=e.length;r>n;n++)ve.set(e[n],\"globalEval\",!t||ve.get(t[n],\"globalEval\"))}function m(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(ve.hasData(e)&&(o=ve.access(e),s=ve.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)Z.event.add(t,i,l[i][n])}ye.hasData(e)&&(a=ye.access(e),u=Z.extend({},a),ye.set(t,u))}}function v(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):e.querySelectorAll?e.querySelectorAll(t||\"*\"):[];return void 0===t||t&&Z.nodeName(e,t)?Z.merge([e],n):n}function y(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&Ne.test(e.type)?t.checked=e.checked:(\"input\"===n||\"textarea\"===n)&&(t.defaultValue=e.defaultValue)}function x(t,n){var r,i=Z(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:Z.css(i[0],\"display\");return i.detach(),o}function b(e){var t=J,n=$e[e];return n||(n=x(e,t),\"none\"!==n&&n||(We=(We||Z(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(t.documentElement),t=We[0].contentDocument,t.write(),t.close(),n=x(e,t),We.detach()),$e[e]=n),n}function w(e,t,n){var r,i,o,s,a=e.style;return n=n||_e(e),n&&(s=n.getPropertyValue(t)||n[t]),n&&(\"\"!==s||Z.contains(e.ownerDocument,e)||(s=Z.style(e,t)),Be.test(s)&&Ie.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o)),void 0!==s?s+\"\":s}function T(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function C(e,t){if(t in e)return t;for(var n=t[0].toUpperCase()+t.slice(1),r=t,i=Ge.length;i--;)if(t=Ge[i]+n,t in e)return t;return r}function N(e,t,n){var r=Xe.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||\"px\"):t}function k(e,t,n,r,i){for(var o=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0,s=0;4>o;o+=2)\"margin\"===n&&(s+=Z.css(e,n+Te[o],!0,i)),r?(\"content\"===n&&(s-=Z.css(e,\"padding\"+Te[o],!0,i)),\"margin\"!==n&&(s-=Z.css(e,\"border\"+Te[o]+\"Width\",!0,i))):(s+=Z.css(e,\"padding\"+Te[o],!0,i),\"padding\"!==n&&(s+=Z.css(e,\"border\"+Te[o]+\"Width\",!0,i)));return s}function E(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=_e(e),s=\"border-box\"===Z.css(e,\"boxSizing\",!1,o);if(0>=i||null==i){if(i=w(e,t,o),(0>i||null==i)&&(i=e.style[t]),Be.test(i))return i;r=s&&(Q.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(s?\"border\":\"content\"),r,o)+\"px\"}function S(e,t){for(var n,r,i,o=[],s=0,a=e.length;a>s;s++)r=e[s],r.style&&(o[s]=ve.get(r,\"olddisplay\"),n=r.style.display,t?(o[s]||\"none\"!==n||(r.style.display=\"\"),\"\"===r.style.display&&Ce(r)&&(o[s]=ve.access(r,\"olddisplay\",b(r.nodeName)))):(i=Ce(r),\"none\"===n&&i||ve.set(r,\"olddisplay\",i?n:Z.css(r,\"display\"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&\"none\"!==r.style.display&&\"\"!==r.style.display||(r.style.display=t?o[s]||\"\":\"none\"));return e}function D(e,t,n,r,i){return new D.prototype.init(e,t,n,r,i)}function j(){return setTimeout(function(){Qe=void 0}),Qe=Z.now()}function A(e,t){var n,r=0,i={height:e};for(t=t?1:0;4>r;r+=2-t)n=Te[r],i[\"margin\"+n]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function L(e,t,n){for(var r,i=(nt[t]||[]).concat(nt[\"*\"]),o=0,s=i.length;s>o;o++)if(r=i[o].call(n,t,e))return r}function q(e,t,n){var r,i,o,s,a,u,l,c,f=this,p={},d=e.style,h=e.nodeType&&Ce(e),g=ve.get(e,\"fxshow\");n.queue||(a=Z._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,f.always(function(){f.always(function(){a.unqueued--,Z.queue(e,\"fx\").length||a.empty.fire()})})),1===e.nodeType&&(\"height\"in t||\"width\"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=Z.css(e,\"display\"),c=\"none\"===l?ve.get(e,\"olddisplay\")||b(e.nodeName):l,\"inline\"===c&&\"none\"===Z.css(e,\"float\")&&(d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Ke.exec(i)){if(delete t[r],o=o||\"toggle\"===i,i===(h?\"hide\":\"show\")){if(\"show\"!==i||!g||void 0===g[r])continue;h=!0}p[r]=g&&g[r]||Z.style(e,r)}else l=void 0;if(Z.isEmptyObject(p))\"inline\"===(\"none\"===l?b(e.nodeName):l)&&(d.display=l);else{g?\"hidden\"in g&&(h=g.hidden):g=ve.access(e,\"fxshow\",{}),o&&(g.hidden=!h),h?Z(e).show():f.done(function(){Z(e).hide()}),f.done(function(){var t;ve.remove(e,\"fxshow\");for(t in p)Z.style(e,t,p[t])});for(r in p)s=L(h?g[r]:0,r,f),r in g||(g[r]=s.start,h&&(s.end=s.start,s.start=\"width\"===r||\"height\"===r?1:0))}}function H(e,t){var n,r,i,o,s;for(n in e)if(r=Z.camelCase(n),i=t[r],o=e[n],Z.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=Z.cssHooks[r],s&&\"expand\"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function O(e,t,n){var r,i,o=0,s=tt.length,a=Z.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Qe||j(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:Z.extend({},t),opts:Z.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Qe||j(),duration:n.duration,tweens:[],createTween:function(t,n){var r=Z.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(H(c,l.opts.specialEasing);s>o;o++)if(r=tt[o].call(l,e,c,l.opts))return r;return Z.map(c,L,l),Z.isFunction(l.opts.start)&&l.opts.start.call(e,l),Z.fx.timer(Z.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function F(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(de)||[];if(Z.isFunction(n))for(;r=o[i++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function P(e,t,n,r){function i(a){var u;return o[a]=!0,Z.each(e[a]||[],function(e,a){var l=a(t,n,r);return\"string\"!=typeof l||s||o[l]?s?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},s=e===xt;return i(t.dataTypes[0])||!o[\"*\"]&&i(\"*\")}function R(e,t){var n,r,i=Z.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&Z.extend(!0,e,r),e}function M(e,t,n){for(var r,i,o,s,a=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):void 0}function W(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(s=l[u+\" \"+o]||l[\"* \"+o],!s)for(i in l)if(a=i.split(\" \"),a[1]===o&&(s=l[u+\" \"+a[0]]||l[\"* \"+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e[\"throws\"])t=s(t);else try{t=s(t)}catch(f){return{state:\"parsererror\",error:s?f:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}function $(e,t,n,r){var i;if(Z.isArray(t))Z.each(t,function(t,i){n||Nt.test(e)?r(e,i):$(e+\"[\"+(\"object\"==typeof i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==Z.type(t))r(e,t);else for(i in t)$(e+\"[\"+i+\"]\",t[i],n,r)}function I(e){return Z.isWindow(e)?e:9===e.nodeType&&e.defaultView}var B=[],_=B.slice,z=B.concat,X=B.push,U=B.indexOf,V={},Y=V.toString,G=V.hasOwnProperty,Q={},J=e.document,K=\"2.1.3\",Z=function(e,t){return new Z.fn.init(e,t)},ee=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,te=/^-ms-/,ne=/-([\\da-z])/gi,re=function(e,t){return t.toUpperCase()};Z.fn=Z.prototype={jquery:K,constructor:Z,selector:\"\",length:0,toArray:function(){return _.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:_.call(this)},pushStack:function(e){var t=Z.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return Z.each(this,e,t)},map:function(e){return this.pushStack(Z.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(_.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:X,sort:B.sort,splice:B.splice},Z.extend=Z.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for(\"boolean\"==typeof s&&(l=s,s=arguments[a]||{},a++),\"object\"==typeof s||Z.isFunction(s)||(s={}),a===u&&(s=this,a--);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(Z.isPlainObject(r)||(i=Z.isArray(r)))?(i?(i=!1,o=n&&Z.isArray(n)?n:[]):o=n&&Z.isPlainObject(n)?n:{},s[t]=Z.extend(l,o,r)):void 0!==r&&(s[t]=r));return s},Z.extend({expando:\"jQuery\"+(K+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===Z.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!Z.isArray(e)&&e-parseFloat(e)+1>=0},isPlainObject:function(e){return\"object\"!==Z.type(e)||e.nodeType||Z.isWindow(e)?!1:e.constructor&&!G.call(e.constructor.prototype,\"isPrototypeOf\")?!1:!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?V[Y.call(e)]||\"object\":typeof e},globalEval:function(e){var t,n=eval;e=Z.trim(e),e&&(1===e.indexOf(\"use strict\")?(t=J.createElement(\"script\"),t.text=e,J.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(te,\"ms-\").replace(ne,re)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,s=e.length,a=n(e);if(r){if(a)for(;s>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(a)for(;s>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ee,\"\")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?Z.merge(r,\"string\"==typeof e?[e]:e):X.call(r,e)),r},inArray:function(e,t,n){return null==t?-1:U.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,s=e.length,a=!n;s>o;o++)r=!t(e[o],o),r!==a&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,s=e.length,a=n(e),u=[];if(a)for(;s>o;o++)i=t(e[o],o,r),null!=i&&u.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&u.push(i);return z.apply([],u)},guid:1,proxy:function(e,t){var n,r,i;return\"string\"==typeof t&&(n=e[t],t=e,e=n),Z.isFunction(e)?(r=_.call(arguments,2),i=function(){return e.apply(t||this,r.concat(_.call(arguments)))},i.guid=e.guid=e.guid||Z.guid++,i):void 0},now:Date.now,support:Q}),Z.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(e,t){V[\"[object \"+t+\"]\"]=t.toLowerCase()});var ie=function(e){function t(e,t,n,r){var i,o,s,a,u,l,f,d,h,g;if((t?t.ownerDocument||t:$)!==q&&L(t),t=t||q,n=n||[],a=t.nodeType,\"string\"!=typeof e||!e||1!==a&&9!==a&&11!==a)return n;if(!r&&O){if(11!==a&&(i=ye.exec(e)))if(s=i[1]){if(9===a){if(o=t.getElementById(s),!o||!o.parentNode)return n;if(o.id===s)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(s))&&M(t,o)&&o.id===s)return n.push(o),n}else{if(i[2])return K.apply(n,t.getElementsByTagName(e)),n;if((s=i[3])&&w.getElementsByClassName)return K.apply(n,t.getElementsByClassName(s)),n}if(w.qsa&&(!F||!F.test(e))){if(d=f=W,h=t,g=1!==a&&e,1===a&&\"object\"!==t.nodeName.toLowerCase()){for(l=k(e),(f=t.getAttribute(\"id\"))?d=f.replace(be,\"\\\\$&\"):t.setAttribute(\"id\",d),d=\"[id='\"+d+\"'] \",u=l.length;u--;)l[u]=d+p(l[u]);h=xe.test(e)&&c(t.parentNode)||t,g=l.join(\",\")}if(g)try{return K.apply(n,h.querySelectorAll(g)),n}catch(m){}finally{f||t.removeAttribute(\"id\")}}}return S(e.replace(ue,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>T.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[W]=!0,e}function i(e){var t=q.createElement(\"div\");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split(\"|\"),r=e.length;r--;)T.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function f(){}function p(e){for(var t=0,n=e.length,r=\"\";n>t;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,i=n&&\"parentNode\"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,s){var a,u,l=[I,o];if(s){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,s))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(u=t[W]||(t[W]={}),(a=u[r])&&a[0]===I&&a[1]===o)return l[2]=a[2];if(u[r]=l,l[2]=e(t,n,s))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,s=[],a=0,u=e.length,l=null!=t;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function v(e,t,n,i,o,s){return i&&!i[W]&&(i=v(i)),o&&!o[W]&&(o=v(o,s)),r(function(r,s,a,u){var l,c,f,p=[],d=[],h=s.length,v=r||g(t||\"*\",a.nodeType?[a]:a,[]),y=!e||!r&&t?v:m(v,p,e,a,u),x=n?o||(r?e:h||i)?[]:s:y;if(n&&n(y,x,a,u),i)for(l=m(x,d),i(l,[],a,u),c=l.length;c--;)(f=l[c])&&(x[d[c]]=!(y[d[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(y[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):p[c])>-1&&(r[l]=!(s[l]=f))}}else x=m(x===s?x.splice(h,x.length):x),o?o(null,s,x,u):K.apply(s,x)})}function y(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],s=o||T.relative[\" \"],a=o?1:0,u=d(function(e){return e===t},s,!0),l=d(function(e){return ee(t,e)>-1},s,!0),c=[function(e,n,r){var i=!o&&(r||n!==D)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];i>a;a++)if(n=T.relative[e[a].type])c=[d(h(c),n)];else{if(n=T.filter[e[a].type].apply(null,e[a].matches),n[W]){for(r=++a;i>r&&!T.relative[e[r].type];r++);return v(a>1&&h(c),a>1&&p(e.slice(0,a-1).concat({value:\" \"===e[a-2].type?\"*\":\"\"})).replace(ue,\"$1\"),n,r>a&&y(e.slice(a,r)),i>r&&y(e=e.slice(r)),i>r&&p(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,s=function(r,s,a,u,l){var c,f,p,d=0,h=\"0\",g=r&&[],v=[],y=D,x=r||o&&T.find.TAG(\"*\",l),b=I+=null==y?1:Math.random()||.1,w=x.length;for(l&&(D=s!==q&&s);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0;p=e[f++];)if(p(c,s,a)){u.push(c);break}l&&(I=b)}i&&((c=!p&&c)&&d--,r&&g.push(c))}if(d+=h,i&&h!==d){for(f=0;p=n[f++];)p(g,v,s,a);if(r){if(d>0)for(;h--;)g[h]||v[h]||(v[h]=Q.call(u));v=m(v)}K.apply(u,v),l&&!r&&v.length>0&&d+n.length>1&&t.uniqueSort(u)}return l&&(I=b,D=y),g};return i?r(s):s}var b,w,T,C,N,k,E,S,D,j,A,L,q,H,O,F,P,R,M,W=\"sizzle\"+1*new Date,$=e.document,I=0,B=0,_=n(),z=n(),X=n(),U=function(e,t){return e===t&&(A=!0),0},V=1<<31,Y={}.hasOwnProperty,G=[],Q=G.pop,J=G.push,K=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;r>n;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",ie=re.replace(\"w\",\"w#\"),oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+ie+\"))|)\"+ne+\"*\\\\]\",se=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",ae=new RegExp(ne+\"+\",\"g\"),ue=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),le=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),ce=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),fe=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),pe=new RegExp(se),de=new RegExp(\"^\"+ie+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+se),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},ge=/^(?:input|select|textarea|button)$/i,me=/^h\\d$/i,ve=/^[^{]+\\{\\s*\\[native \\w/,ye=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,xe=/[+~]/,be=/'|\\\\/g,we=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),Te=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Ce=function(){L()};try{K.apply(G=Z.call($.childNodes),$.childNodes),G[$.childNodes.length].nodeType}catch(Ne){K={apply:G.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},N=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?\"HTML\"!==t.nodeName:!1},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:$;return r!==q&&9===r.nodeType&&r.documentElement?(q=r,H=r.documentElement,n=r.defaultView,n&&n!==n.top&&(n.addEventListener?n.addEventListener(\"unload\",Ce,!1):n.attachEvent&&n.attachEvent(\"onunload\",Ce)),O=!N(r),w.attributes=i(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),w.getElementsByTagName=i(function(e){return e.appendChild(r.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),w.getElementsByClassName=ve.test(r.getElementsByClassName),w.getById=i(function(e){return H.appendChild(e).id=W,!r.getElementsByName||!r.getElementsByName(W).length}),w.getById?(T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&O){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},T.filter.ID=function(e){var t=e.replace(we,Te);return function(e){return e.getAttribute(\"id\")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(we,Te);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){return O?t.getElementsByClassName(e):void 0},P=[],F=[],(w.qsa=ve.test(r.querySelectorAll))&&(i(function(e){H.appendChild(e).innerHTML=\"<a id='\"+W+\"'></a><select id='\"+W+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&F.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||F.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+W+\"-]\").length||F.push(\"~=\"),e.querySelectorAll(\":checked\").length||F.push(\":checked\"),e.querySelectorAll(\"a#\"+W+\"+*\").length||F.push(\".#.+[+~]\")}),i(function(e){var t=r.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&F.push(\"name\"+ne+\"*[*^$|!~]?=\"),e.querySelectorAll(\":enabled\").length||F.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),F.push(\",.*:\")})),(w.matchesSelector=ve.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&i(function(e){w.disconnectedMatch=R.call(e,\"div\"),R.call(e,\"[s!='']:x\"),P.push(\"!=\",se)}),F=F.length&&new RegExp(F.join(\"|\")),P=P.length&&new RegExp(P.join(\"|\")),t=ve.test(H.compareDocumentPosition),M=t||ve.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return A=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===r||e.ownerDocument===$&&M($,e)?-1:t===r||t.ownerDocument===$&&M($,t)?1:j?ee(j,e)-ee(j,t):0:4&n?-1:1)}:function(e,t){if(e===t)return A=!0,0;var n,i=0,o=e.parentNode,a=t.parentNode,u=[e],l=[t];if(!o||!a)return e===r?-1:t===r?1:o?-1:a?1:j?ee(j,e)-ee(j,t):0;if(o===a)return s(e,t);for(n=e;n=n.parentNode;)u.unshift(n);for(n=t;n=n.parentNode;)l.unshift(n);for(;u[i]===l[i];)i++;return i?s(u[i],l[i]):u[i]===$?-1:l[i]===$?1:0},r):q},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==q&&L(e),n=n.replace(fe,\"='$1']\"),!(!w.matchesSelector||!O||P&&P.test(n)||F&&F.test(n)))try{var r=R.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,q,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==q&&L(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==q&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!O):void 0;return void 0!==r?r:w.attributes||!O?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!w.detectDuplicates,j=!w.sortStable&&e.slice(0),e.sort(U),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return j=null,e},C=t.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(we,Te),e[3]=(e[3]||e[4]||e[5]||\"\").replace(we,Te),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&pe.test(n)&&(t=k(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(we,Te).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=_[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&_(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?\"!=\"===n:n?(o+=\"\",\"=\"===n?o===r:\"!=\"===n?o!==r:\"^=\"===n?r&&0===o.indexOf(r):\"*=\"===n?r&&o.indexOf(r)>-1:\"$=\"===n?r&&o.slice(-r.length)===r:\"~=\"===n?(\" \"+o.replace(ae,\" \")+\" \").indexOf(r)>-1:\"|=\"===n?o===r||o.slice(0,r.length+1)===r+\"-\":!1):!0}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a;if(m){if(o){for(;g;){for(f=t;f=f[g];)if(a?f.nodeName.toLowerCase()===v:1===f.nodeType)return!1;h=g=\"only\"===e&&!h&&\"nextSibling\"}return!0}if(h=[s?m.firstChild:m.lastChild],s&&y){for(c=m[W]||(m[W]={}),l=c[e]||[],d=l[0]===I&&l[1],p=l[0]===I&&l[2],f=d&&m.childNodes[d];f=++d&&f&&f[g]||(p=d=0)||h.pop();)if(1===f.nodeType&&++p&&f===t){c[e]=[I,d,p];break}}else if(y&&(l=(t[W]||(t[W]={}))[e])&&l[0]===I)p=l[1];else for(;(f=++d&&f&&f[g]||(p=d=0)||h.pop())&&((a?f.nodeName.toLowerCase()!==v:1!==f.nodeType)||!++p||(y&&((f[W]||(f[W]={}))[e]=[I,p]),f!==t)););return p-=i,p===r||p%r===0&&p/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return o[W]?o(n):o.length>1?(i=[e,e,\"\",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=ee(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=E(e.replace(ue,\"$1\"));return i[W]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(we,Te),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(we,Te).toLowerCase(),function(t){var n;do if(n=O?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===q.activeElement&&(!q.hasFocus||q.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return me.test(e.nodeName)},input:function(e){return ge.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[0>n?n+t:n]}),even:l(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=0>n?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=a(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,k=t.tokenize=function(e,n){var r,i,o,s,a,u,l,c=z[e+\" \"];if(c)return n?0:c.slice(0);for(a=e,u=[],l=T.preFilter;a;){(!r||(i=le.exec(a)))&&(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),r=!1,(i=ce.exec(a))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ue,\" \")}),a=a.slice(r.length));for(s in T.filter)!(i=he[s].exec(a))||l[s]&&!(i=l[s](i))||(r=i.shift(),o.push({value:r,type:s,matches:i}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):z(e,u).slice(0)},E=t.compile=function(e,t){var n,r=[],i=[],o=X[e+\" \"];if(!o){for(t||(t=k(e)),n=t.length;n--;)o=y(t[n]),o[W]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,s,a,u,l=\"function\"==typeof e&&e,f=!r&&k(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&\"ID\"===(s=o[0]).type&&w.getById&&9===t.nodeType&&O&&T.relative[o[1].type]){if(t=(T.find.ID(s.matches[0].replace(we,Te),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=he.needsContext.test(e)?0:o.length;i--&&(s=o[i],!T.relative[a=s.type]);)if((u=T.find[a])&&(r=u(s.matches[0].replace(we,Te),xe.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return K.apply(n,r),n;break}}return(l||E(e,f))(r,t,!O,n,xe.test(e)&&c(t.parentNode)||t),n},w.sortStable=W.split(\"\").sort(U).join(\"\")===W,w.detectDuplicates=!!A,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(q.createElement(\"div\"))}),i(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||o(\"type|href|height|width\",function(e,t,n){return n?void 0:e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||o(\"value\",function(e,t,n){return n||\"input\"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute(\"disabled\")})||o(te,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);Z.find=ie,Z.expr=ie.selectors,Z.expr[\":\"]=Z.expr.pseudos,Z.unique=ie.uniqueSort,Z.text=ie.getText,Z.isXMLDoc=ie.isXML,Z.contains=ie.contains;var oe=Z.expr.match.needsContext,se=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,ae=/^.[^:#\\[\\.,]*$/;Z.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?Z.find.matchesSelector(r,e)?[r]:[]:Z.find.matches(e,Z.grep(t,function(e){return 1===e.nodeType}))},Z.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if(\"string\"!=typeof e)return this.pushStack(Z(e).filter(function(){\nfor(t=0;n>t;t++)if(Z.contains(i[t],this))return!0}));for(t=0;n>t;t++)Z.find(e,i[t],r);return r=this.pushStack(n>1?Z.unique(r):r),r.selector=this.selector?this.selector+\" \"+e:e,r},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,\"string\"==typeof e&&oe.test(e)?Z(e):e||[],!1).length}});var ue,le=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,ce=Z.fn.init=function(e,t){var n,r;if(!e)return this;if(\"string\"==typeof e){if(n=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:le.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||ue).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof Z?t[0]:t,Z.merge(this,Z.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:J,!0)),se.test(n[1])&&Z.isPlainObject(t))for(n in t)Z.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}return r=J.getElementById(n[2]),r&&r.parentNode&&(this.length=1,this[0]=r),this.context=J,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):Z.isFunction(e)?\"undefined\"!=typeof ue.ready?ue.ready(e):e(Z):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),Z.makeArray(e,this))};ce.prototype=Z.fn,ue=Z(J);var fe=/^(?:parents|prev(?:Until|All))/,pe={children:!0,contents:!0,next:!0,prev:!0};Z.extend({dir:function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&Z(e).is(n))break;r.push(e)}return r},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),Z.fn.extend({has:function(e){var t=Z(e,this),n=t.length;return this.filter(function(){for(var e=0;n>e;e++)if(Z.contains(this,t[e]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],s=oe.test(e)||\"string\"!=typeof e?Z(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&Z.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?Z.unique(o):o)},index:function(e){return e?\"string\"==typeof e?U.call(Z(e),this[0]):U.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(Z.unique(Z.merge(this.get(),Z(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),Z.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return Z.dir(e,\"parentNode\")},parentsUntil:function(e,t,n){return Z.dir(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return Z.dir(e,\"nextSibling\")},prevAll:function(e){return Z.dir(e,\"previousSibling\")},nextUntil:function(e,t,n){return Z.dir(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return Z.dir(e,\"previousSibling\",n)},siblings:function(e){return Z.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return Z.sibling(e.firstChild)},contents:function(e){return e.contentDocument||Z.merge([],e.childNodes)}},function(e,t){Z.fn[e]=function(n,r){var i=Z.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=Z.filter(r,i)),this.length>1&&(pe[e]||Z.unique(i),fe.test(e)&&i.reverse()),this.pushStack(i)}});var de=/\\S+/g,he={};Z.Callbacks=function(e){e=\"string\"==typeof e?he[e]||o(e):Z.extend({},e);var t,n,r,i,s,a,u=[],l=!e.once&&[],c=function(o){for(t=e.memory&&o,n=!0,a=i||0,i=0,s=u.length,r=!0;u&&s>a;a++)if(u[a].apply(o[0],o[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,u&&(l?l.length&&c(l.shift()):t?u=[]:f.disable())},f={add:function(){if(u){var n=u.length;!function o(t){Z.each(t,function(t,n){var r=Z.type(n);\"function\"===r?e.unique&&f.has(n)||u.push(n):n&&n.length&&\"string\"!==r&&o(n)})}(arguments),r?s=u.length:t&&(i=n,c(t))}return this},remove:function(){return u&&Z.each(arguments,function(e,t){for(var n;(n=Z.inArray(t,u,n))>-1;)u.splice(n,1),r&&(s>=n&&s--,a>=n&&a--)}),this},has:function(e){return e?Z.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],s=0,this},disable:function(){return u=l=t=void 0,this},disabled:function(){return!u},lock:function(){return l=void 0,t||f.disable(),this},locked:function(){return!l},fireWith:function(e,t){return!u||n&&!l||(t=t||[],t=[e,t.slice?t.slice():t],r?l.push(t):c(t)),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!n}};return f},Z.extend({Deferred:function(e){var t=[[\"resolve\",\"done\",Z.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",Z.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",Z.Callbacks(\"memory\")]],n=\"pending\",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return Z.Deferred(function(n){Z.each(t,function(t,o){var s=Z.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&Z.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o[0]+\"With\"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?Z.extend(e,r):r}},i={};return r.pipe=r.then,Z.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+\"With\"](this===i?r:this,arguments),this},i[o[0]+\"With\"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=_.call(arguments),s=o.length,a=1!==s||e&&Z.isFunction(e.promise)?s:0,u=1===a?e:Z.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?_.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);s>i;i++)o[i]&&Z.isFunction(o[i].promise)?o[i].promise().done(l(i,r,o)).fail(u.reject).progress(l(i,n,t)):--a;return a||u.resolveWith(r,o),u.promise()}});var ge;Z.fn.ready=function(e){return Z.ready.promise().done(e),this},Z.extend({isReady:!1,readyWait:1,holdReady:function(e){e?Z.readyWait++:Z.ready(!0)},ready:function(e){(e===!0?--Z.readyWait:Z.isReady)||(Z.isReady=!0,e!==!0&&--Z.readyWait>0||(ge.resolveWith(J,[Z]),Z.fn.triggerHandler&&(Z(J).triggerHandler(\"ready\"),Z(J).off(\"ready\"))))}}),Z.ready.promise=function(t){return ge||(ge=Z.Deferred(),\"complete\"===J.readyState?setTimeout(Z.ready):(J.addEventListener(\"DOMContentLoaded\",s,!1),e.addEventListener(\"load\",s,!1))),ge.promise(t)},Z.ready.promise();var me=Z.access=function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if(\"object\"===Z.type(n)){i=!0;for(a in n)Z.access(e,t,a,n[a],!0,o,s)}else if(void 0!==r&&(i=!0,Z.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(Z(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o};Z.acceptData=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType},a.uid=1,a.accepts=Z.acceptData,a.prototype={key:function(e){if(!a.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=a.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,Z.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if(\"string\"==typeof t)o[t]=n;else if(Z.isEmptyObject(o))Z.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return void 0===t?n:n[t]},access:function(e,t,n){var r;return void 0===t||t&&\"string\"==typeof t&&void 0===n?(r=this.get(e,t),void 0!==r?r:this.get(e,Z.camelCase(t))):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(void 0===t)this.cache[o]={};else{Z.isArray(t)?r=t.concat(t.map(Z.camelCase)):(i=Z.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(de)||[])),n=r.length;for(;n--;)delete s[r[n]]}},hasData:function(e){return!Z.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}};var ve=new a,ye=new a,xe=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,be=/([A-Z])/g;Z.extend({hasData:function(e){return ye.hasData(e)||ve.hasData(e)},data:function(e,t,n){return ye.access(e,t,n)},removeData:function(e,t){ye.remove(e,t)},_data:function(e,t,n){return ve.access(e,t,n)},_removeData:function(e,t){ve.remove(e,t)}}),Z.fn.extend({data:function(e,t){var n,r,i,o=this[0],s=o&&o.attributes;if(void 0===e){if(this.length&&(i=ye.get(o),1===o.nodeType&&!ve.get(o,\"hasDataAttrs\"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf(\"data-\")&&(r=Z.camelCase(r.slice(5)),u(o,r,i[r])));ve.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof e?this.each(function(){ye.set(this,e)}):me(this,function(t){var n,r=Z.camelCase(e);if(o&&void 0===t){if(n=ye.get(o,e),void 0!==n)return n;if(n=ye.get(o,r),void 0!==n)return n;if(n=u(o,r,void 0),void 0!==n)return n}else this.each(function(){var n=ye.get(this,r);ye.set(this,r,t),-1!==e.indexOf(\"-\")&&void 0!==n&&ye.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){ye.remove(this,e)})}}),Z.extend({queue:function(e,t,n){var r;return e?(t=(t||\"fx\")+\"queue\",r=ve.get(e,t),n&&(!r||Z.isArray(n)?r=ve.access(e,t,Z.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||\"fx\";var n=Z.queue(e,t),r=n.length,i=n.shift(),o=Z._queueHooks(e,t),s=function(){Z.dequeue(e,t)};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return ve.get(e,n)||ve.access(e,n,{empty:Z.Callbacks(\"once memory\").add(function(){ve.remove(e,[t+\"queue\",n])})})}}),Z.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?Z.queue(this[0],e):void 0===t?this:this.each(function(){var n=Z.queue(this,e,t);Z._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&Z.dequeue(this,e)})},dequeue:function(e){return this.each(function(){Z.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=Z.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";s--;)n=ve.get(o[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var we=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,Te=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Ce=function(e,t){return e=t||e,\"none\"===Z.css(e,\"display\")||!Z.contains(e.ownerDocument,e)},Ne=/^(?:checkbox|radio)$/i;!function(){var e=J.createDocumentFragment(),t=e.appendChild(J.createElement(\"div\")),n=J.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),Q.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",Q.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var ke=\"undefined\";Q.focusinBubbles=\"onfocusin\"in e;var Ee=/^key/,Se=/^(?:mouse|pointer|contextmenu)|click/,De=/^(?:focusinfocus|focusoutblur)$/,je=/^([^.]*)(?:\\.(.+)|)$/;Z.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,m=ve.get(e);if(m)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=Z.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return typeof Z!==ke&&Z.event.triggered!==t.type?Z.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(de)||[\"\"],l=t.length;l--;)a=je.exec(t[l])||[],d=g=a[1],h=(a[2]||\"\").split(\".\").sort(),d&&(f=Z.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=Z.event.special[d]||{},c=Z.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&Z.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||(p=u[d]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,h,s)!==!1||e.addEventListener&&e.addEventListener(d,s,!1)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),Z.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,m=ve.hasData(e)&&ve.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(de)||[\"\"],l=t.length;l--;)if(a=je.exec(t[l])||[],d=g=a[1],h=(a[2]||\"\").split(\".\").sort(),d){for(f=Z.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],a=a[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));s&&!p.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||Z.removeEvent(e,d,m.handle),delete u[d])}else for(d in u)Z.event.remove(e,d+t[l],n,r,!0);Z.isEmptyObject(u)&&(delete m.handle,ve.remove(e,\"events\"))}},trigger:function(t,n,r,i){var o,s,a,u,l,c,f,p=[r||J],d=G.call(t,\"type\")?t.type:t,h=G.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=a=r=r||J,3!==r.nodeType&&8!==r.nodeType&&!De.test(d+Z.event.triggered)&&(d.indexOf(\".\")>=0&&(h=d.split(\".\"),d=h.shift(),h.sort()),l=d.indexOf(\":\")<0&&\"on\"+d,t=t[Z.expando]?t:new Z.Event(d,\"object\"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join(\".\"),t.namespace_re=t.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:Z.makeArray(n,[t]),f=Z.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!Z.isWindow(r)){for(u=f.delegateType||d,De.test(u+d)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||J)&&p.push(a.defaultView||a.parentWindow||e)}for(o=0;(s=p[o++])&&!t.isPropagationStopped();)t.type=o>1?u:f.bindType||d,c=(ve.get(s,\"events\")||{})[t.type]&&ve.get(s,\"handle\"),c&&c.apply(s,n),c=l&&s[l],c&&c.apply&&Z.acceptData(s)&&(t.result=c.apply(s,n),t.result===!1&&t.preventDefault());return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!Z.acceptData(r)||l&&Z.isFunction(r[d])&&!Z.isWindow(r)&&(a=r[l],a&&(r[l]=null),Z.event.triggered=d,r[d](),Z.event.triggered=void 0,a&&(r[l]=a)),t.result}},dispatch:function(e){e=Z.event.fix(e);var t,n,r,i,o,s=[],a=_.call(arguments),u=(ve.get(this,\"events\")||{})[e.type]||[],l=Z.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(s=Z.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((Z.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||\"click\"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||\"click\"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+\" \",void 0===r[i]&&(r[i]=o.needsContext?Z(i,this).index(u)>=0:Z.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a<t.length&&s.push({elem:this,handlers:t.slice(a)}),s},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(e,t){var n,r,i,o=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||J,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},fix:function(e){if(e[Z.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=Se.test(i)?this.mouseHooks:Ee.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new Z.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=J),3===e.target.nodeType&&(e.target=e.target.parentNode),s.filter?s.filter(e,o):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==f()&&this.focus?(this.focus(),!1):void 0},delegateType:\"focusin\"},blur:{trigger:function(){return this===f()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&Z.nodeName(this,\"input\")?(this.click(),!1):void 0},_default:function(e){return Z.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=Z.extend(new Z.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?Z.event.trigger(i,null,t):Z.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},Z.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},Z.Event=function(e,t){return this instanceof Z.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?l:c):this.type=e,t&&Z.extend(this,t),this.timeStamp=e&&e.timeStamp||Z.now(),void(this[Z.expando]=!0)):new Z.Event(e,t)},Z.Event.prototype={isDefaultPrevented:c,isPropagationStopped:c,isImmediatePropagationStopped:c,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=l,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=l,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=l,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},Z.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){Z.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!Z.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),Q.focusinBubbles||Z.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){Z.event.simulate(t,e.target,Z.event.fix(e),!0)};Z.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=ve.access(r,t);i||r.addEventListener(e,n,!0),ve.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=ve.access(r,t)-1;i?ve.access(r,t,i):(r.removeEventListener(e,n,!0),ve.remove(r,t))}}}),Z.fn.extend({on:function(e,t,n,r,i){var o,s;if(\"object\"==typeof e){\"string\"!=typeof t&&(n=n||t,t=void 0);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=void 0):null==r&&(\"string\"==typeof t?(r=n,n=void 0):(r=n,n=t,t=void 0)),r===!1)r=c;else if(!r)return this;return 1===i&&(o=r,r=function(e){return Z().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=Z.guid++)),this.each(function(){Z.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,Z(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||\"function\"==typeof t)&&(n=t,t=void 0),n===!1&&(n=c),this.each(function(){Z.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){Z.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?Z.event.trigger(e,t,n,!0):void 0}});var Ae=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,Le=/<([\\w:]+)/,qe=/<|&#?\\w+;/,He=/<(?:script|style|link)/i,Oe=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Fe=/^$|\\/(?:java|ecma)script/i,Pe=/^true\\/(.*)/,Re=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,Me={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Me.optgroup=Me.option,Me.tbody=Me.tfoot=Me.colgroup=Me.caption=Me.thead,Me.th=Me.td,Z.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=Z.contains(e.ownerDocument,e);if(!(Q.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||Z.isXMLDoc(e)))for(s=v(a),o=v(e),r=0,i=o.length;i>r;r++)y(o[r],s[r]);if(t)if(n)for(o=o||v(e),s=s||v(a),r=0,i=o.length;i>r;r++)m(o[r],s[r]);else m(e,a);return s=v(a,\"script\"),s.length>0&&g(s,!u&&v(e,\"script\")),a},buildFragment:function(e,t,n,r){for(var i,o,s,a,u,l,c=t.createDocumentFragment(),f=[],p=0,d=e.length;d>p;p++)if(i=e[p],i||0===i)if(\"object\"===Z.type(i))Z.merge(f,i.nodeType?[i]:i);else if(qe.test(i)){for(o=o||c.appendChild(t.createElement(\"div\")),s=(Le.exec(i)||[\"\",\"\"])[1].toLowerCase(),a=Me[s]||Me._default,o.innerHTML=a[1]+i.replace(Ae,\"<$1></$2>\")+a[2],l=a[0];l--;)o=o.lastChild;Z.merge(f,o.childNodes),o=c.firstChild,o.textContent=\"\"}else f.push(t.createTextNode(i));for(c.textContent=\"\",p=0;i=f[p++];)if((!r||-1===Z.inArray(i,r))&&(u=Z.contains(i.ownerDocument,i),o=v(c.appendChild(i),\"script\"),u&&g(o),n))for(l=0;i=o[l++];)Fe.test(i.type||\"\")&&n.push(i);return c},cleanData:function(e){for(var t,n,r,i,o=Z.event.special,s=0;void 0!==(n=e[s]);s++){if(Z.acceptData(n)&&(i=n[ve.expando],i&&(t=ve.cache[i]))){if(t.events)for(r in t.events)o[r]?Z.event.remove(n,r):Z.removeEvent(n,r,t.handle);ve.cache[i]&&delete ve.cache[i]}delete ye.cache[n[ye.expando]]}}}),Z.fn.extend({text:function(e){return me(this,function(e){return void 0===e?Z.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=e)})},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=p(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=p(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=e?Z.filter(e,this):this,i=0;null!=(n=r[i]);i++)t||1!==n.nodeType||Z.cleanData(v(n)),n.parentNode&&(t&&Z.contains(n.ownerDocument,n)&&g(v(n,\"script\")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(Z.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return Z.clone(this,e,t)})},html:function(e){return me(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!He.test(e)&&!Me[(Le.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=e.replace(Ae,\"<$1></$2>\");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(Z.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,Z.cleanData(v(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=z.apply([],e);var n,r,i,o,s,a,u=0,l=this.length,c=this,f=l-1,p=e[0],g=Z.isFunction(p);if(g||l>1&&\"string\"==typeof p&&!Q.checkClone&&Oe.test(p))return this.each(function(n){var r=c.eq(n);g&&(e[0]=p.call(this,n,r.html())),r.domManip(e,t)});if(l&&(n=Z.buildFragment(e,this[0].ownerDocument,!1,this),r=n.firstChild,1===n.childNodes.length&&(n=r),r)){for(i=Z.map(v(n,\"script\"),d),o=i.length;l>u;u++)s=n,u!==f&&(s=Z.clone(s,!0,!0),o&&Z.merge(i,v(s,\"script\"))),t.call(this[u],s,u);if(o)for(a=i[i.length-1].ownerDocument,Z.map(i,h),u=0;o>u;u++)s=i[u],Fe.test(s.type||\"\")&&!ve.access(s,\"globalEval\")&&Z.contains(a,s)&&(s.src?Z._evalUrl&&Z._evalUrl(s.src):Z.globalEval(s.textContent.replace(Re,\"\")))}return this}}),Z.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){Z.fn[e]=function(e){for(var n,r=[],i=Z(e),o=i.length-1,s=0;o>=s;s++)n=s===o?this:this.clone(!0),Z(i[s])[t](n),X.apply(r,n.get());return this.pushStack(r)}});var We,$e={},Ie=/^margin/,Be=new RegExp(\"^(\"+we+\")(?!px)[a-z%]+$\",\"i\"),_e=function(t){return t.ownerDocument.defaultView.opener?t.ownerDocument.defaultView.getComputedStyle(t,null):e.getComputedStyle(t,null)};!function(){function t(){s.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",s.innerHTML=\"\",i.appendChild(o);var t=e.getComputedStyle(s,null);n=\"1%\"!==t.top,r=\"4px\"===t.width,i.removeChild(o)}var n,r,i=J.documentElement,o=J.createElement(\"div\"),s=J.createElement(\"div\");s.style&&(s.style.backgroundClip=\"content-box\",s.cloneNode(!0).style.backgroundClip=\"\",Q.clearCloneStyle=\"content-box\"===s.style.backgroundClip,o.style.cssText=\"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute\",o.appendChild(s),e.getComputedStyle&&Z.extend(Q,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return null==r&&t(),r},reliableMarginRight:function(){var t,n=s.appendChild(J.createElement(\"div\"));return n.style.cssText=s.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",n.style.marginRight=n.style.width=\"0\",s.style.width=\"1px\",i.appendChild(o),t=!parseFloat(e.getComputedStyle(n,null).marginRight),i.removeChild(o),s.removeChild(n),t}}))}(),Z.swap=function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i};var ze=/^(none|table(?!-c[ea]).+)/,Xe=new RegExp(\"^(\"+we+\")(.*)$\",\"i\"),Ue=new RegExp(\"^([+-])=(\"+we+\")\",\"i\"),Ve={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Ye={letterSpacing:\"0\",fontWeight:\"400\"},Ge=[\"Webkit\",\"O\",\"Moz\",\"ms\"];Z.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=w(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=Z.camelCase(t),u=e.style;return t=Z.cssProps[a]||(Z.cssProps[a]=C(u,a)),s=Z.cssHooks[t]||Z.cssHooks[a],void 0===n?s&&\"get\"in s&&void 0!==(i=s.get(e,!1,r))?i:u[t]:(o=typeof n,\"string\"===o&&(i=Ue.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(Z.css(e,t)),o=\"number\"),void(null!=n&&n===n&&(\"number\"!==o||Z.cssNumber[a]||(n+=\"px\"),Q.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n))))}},css:function(e,t,n,r){var i,o,s,a=Z.camelCase(t);return t=Z.cssProps[a]||(Z.cssProps[a]=C(e.style,a)),s=Z.cssHooks[t]||Z.cssHooks[a],s&&\"get\"in s&&(i=s.get(e,!0,n)),void 0===i&&(i=w(e,t,r)),\"normal\"===i&&t in Ye&&(i=Ye[t]),\"\"===n||n?(o=parseFloat(i),n===!0||Z.isNumeric(o)?o||0:i):i}}),Z.each([\"height\",\"width\"],function(e,t){Z.cssHooks[t]={get:function(e,n,r){return n?ze.test(Z.css(e,\"display\"))&&0===e.offsetWidth?Z.swap(e,Ve,function(){return E(e,t,r)}):E(e,t,r):void 0},set:function(e,n,r){var i=r&&_e(e);return N(e,n,r?k(e,t,r,\"border-box\"===Z.css(e,\"boxSizing\",!1,i),i):0)}}}),Z.cssHooks.marginRight=T(Q.reliableMarginRight,function(e,t){return t?Z.swap(e,{display:\"inline-block\"},w,[e,\"marginRight\"]):void 0}),Z.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){Z.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];4>r;r++)i[e+Te[r]+t]=o[r]||o[r-2]||o[0];return i}},Ie.test(e)||(Z.cssHooks[e+t].set=N)}),Z.fn.extend({css:function(e,t){return me(this,function(e,t,n){var r,i,o={},s=0;if(Z.isArray(t)){for(r=_e(e),i=t.length;i>s;s++)o[t[s]]=Z.css(e,t[s],!1,r);return o}return void 0!==n?Z.style(e,t,n):Z.css(e,t)},e,t,arguments.length>1)},show:function(){return S(this,!0)},hide:function(){return S(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Ce(this)?Z(this).show():Z(this).hide()})}}),Z.Tween=D,D.prototype={constructor:D,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||\"swing\",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(Z.cssNumber[n]?\"\":\"px\")},cur:function(){var e=D.propHooks[this.prop];return e&&e.get?e.get(this):D.propHooks._default.get(this)},run:function(e){var t,n=D.propHooks[this.prop];return this.pos=t=this.options.duration?Z.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):D.propHooks._default.set(this),this}},D.prototype.init.prototype=D.prototype,D.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=Z.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0):e.elem[e.prop]},set:function(e){Z.fx.step[e.prop]?Z.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[Z.cssProps[e.prop]]||Z.cssHooks[e.prop])?Z.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},D.propHooks.scrollTop=D.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},Z.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},Z.fx=D.prototype.init,Z.fx.step={};var Qe,Je,Ke=/^(?:toggle|show|hide)$/,Ze=new RegExp(\"^(?:([+-])=|)(\"+we+\")([a-z%]*)$\",\"i\"),et=/queueHooks$/,tt=[q],nt={\"*\":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Ze.exec(t),o=i&&i[3]||(Z.cssNumber[e]?\"\":\"px\"),s=(Z.cssNumber[e]||\"px\"!==o&&+r)&&Ze.exec(Z.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||\".5\",s/=a,Z.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};Z.Animation=Z.extend(O,{tweener:function(e,t){Z.isFunction(e)?(t=e,e=[\"*\"]):e=e.split(\" \");for(var n,r=0,i=e.length;i>r;r++)n=e[r],nt[n]=nt[n]||[],nt[n].unshift(t)},prefilter:function(e,t){t?tt.unshift(e):tt.push(e)}}),Z.speed=function(e,t,n){var r=e&&\"object\"==typeof e?Z.extend({},e):{complete:n||!n&&t||Z.isFunction(e)&&e,duration:e,easing:n&&t||t&&!Z.isFunction(t)&&t};return r.duration=Z.fx.off?0:\"number\"==typeof r.duration?r.duration:r.duration in Z.fx.speeds?Z.fx.speeds[r.duration]:Z.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){Z.isFunction(r.old)&&r.old.call(this),r.queue&&Z.dequeue(this,r.queue)},r},Z.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Ce).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=Z.isEmptyObject(e),o=Z.speed(t,n,r),s=function(){var t=O(this,Z.extend({},e),o);(i||ve.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,i=null!=e&&e+\"queueHooks\",o=Z.timers,s=ve.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&et.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&Z.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=ve.get(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=Z.timers,s=r?r.length:0;for(n.finish=!0,Z.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),\no.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),Z.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=Z.fn[t];Z.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(A(t,!0),e,r,i)}}),Z.each({slideDown:A(\"show\"),slideUp:A(\"hide\"),slideToggle:A(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){Z.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),Z.timers=[],Z.fx.tick=function(){var e,t=0,n=Z.timers;for(Qe=Z.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||Z.fx.stop(),Qe=void 0},Z.fx.timer=function(e){Z.timers.push(e),e()?Z.fx.start():Z.timers.pop()},Z.fx.interval=13,Z.fx.start=function(){Je||(Je=setInterval(Z.fx.tick,Z.fx.interval))},Z.fx.stop=function(){clearInterval(Je),Je=null},Z.fx.speeds={slow:600,fast:200,_default:400},Z.fn.delay=function(e,t){return e=Z.fx?Z.fx.speeds[e]||e:e,t=t||\"fx\",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e=J.createElement(\"input\"),t=J.createElement(\"select\"),n=t.appendChild(J.createElement(\"option\"));e.type=\"checkbox\",Q.checkOn=\"\"!==e.value,Q.optSelected=n.selected,t.disabled=!0,Q.optDisabled=!n.disabled,e=J.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",Q.radioValue=\"t\"===e.value}();var rt,it,ot=Z.expr.attrHandle;Z.fn.extend({attr:function(e,t){return me(this,Z.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){Z.removeAttr(this,e)})}}),Z.extend({attr:function(e,t,n){var r,i,o=e.nodeType;return e&&3!==o&&8!==o&&2!==o?typeof e.getAttribute===ke?Z.prop(e,t,n):(1===o&&Z.isXMLDoc(e)||(t=t.toLowerCase(),r=Z.attrHooks[t]||(Z.expr.match.bool.test(t)?it:rt)),void 0===n?r&&\"get\"in r&&null!==(i=r.get(e,t))?i:(i=Z.find.attr(e,t),null==i?void 0:i):null!==n?r&&\"set\"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+\"\"),n):void Z.removeAttr(e,t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(de);if(o&&1===e.nodeType)for(;n=o[i++];)r=Z.propFix[n]||n,Z.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!Q.radioValue&&\"radio\"===t&&Z.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}}}),it={set:function(e,t,n){return t===!1?Z.removeAttr(e,n):e.setAttribute(n,n),n}},Z.each(Z.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=ot[t]||Z.find.attr;ot[t]=function(e,t,r){var i,o;return r||(o=ot[t],ot[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,ot[t]=o),i}});var st=/^(?:input|select|textarea|button)$/i;Z.fn.extend({prop:function(e,t){return me(this,Z.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[Z.propFix[e]||e]})}}),Z.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(e,t,n){var r,i,o,s=e.nodeType;return e&&3!==s&&8!==s&&2!==s?(o=1!==s||!Z.isXMLDoc(e),o&&(t=Z.propFix[t]||t,i=Z.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]):void 0},propHooks:{tabIndex:{get:function(e){return e.hasAttribute(\"tabindex\")||st.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),Q.optSelected||(Z.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),Z.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){Z.propFix[this.toLowerCase()]=this});var at=/[\\t\\r\\n\\f]/g;Z.fn.extend({addClass:function(e){var t,n,r,i,o,s,a=\"string\"==typeof e&&e,u=0,l=this.length;if(Z.isFunction(e))return this.each(function(t){Z(this).addClass(e.call(this,t,this.className))});if(a)for(t=(e||\"\").match(de)||[];l>u;u++)if(n=this[u],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(at,\" \"):\" \")){for(o=0;i=t[o++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");s=Z.trim(r),n.className!==s&&(n.className=s)}return this},removeClass:function(e){var t,n,r,i,o,s,a=0===arguments.length||\"string\"==typeof e&&e,u=0,l=this.length;if(Z.isFunction(e))return this.each(function(t){Z(this).removeClass(e.call(this,t,this.className))});if(a)for(t=(e||\"\").match(de)||[];l>u;u++)if(n=this[u],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(at,\" \"):\"\")){for(o=0;i=t[o++];)for(;r.indexOf(\" \"+i+\" \")>=0;)r=r.replace(\" \"+i+\" \",\" \");s=e?Z.trim(r):\"\",n.className!==s&&(n.className=s)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):this.each(Z.isFunction(e)?function(n){Z(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if(\"string\"===n)for(var t,r=0,i=Z(this),o=e.match(de)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else(n===ke||\"boolean\"===n)&&(this.className&&ve.set(this,\"__className__\",this.className),this.className=this.className||e===!1?\"\":ve.get(this,\"__className__\")||\"\")})},hasClass:function(e){for(var t=\" \"+e+\" \",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(\" \"+this[n].className+\" \").replace(at,\" \").indexOf(t)>=0)return!0;return!1}});var ut=/\\r/g;Z.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=Z.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,Z(this).val()):e,null==i?i=\"\":\"number\"==typeof i?i+=\"\":Z.isArray(i)&&(i=Z.map(i,function(e){return null==e?\"\":e+\"\"})),t=Z.valHooks[this.type]||Z.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,i,\"value\")||(this.value=i))})):i?(t=Z.valHooks[i.type]||Z.valHooks[i.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(i,\"value\"))?n:(n=i.value,\"string\"==typeof n?n.replace(ut,\"\"):null==n?\"\":n)):void 0}}),Z.extend({valHooks:{option:{get:function(e){var t=Z.find.attr(e,\"value\");return null!=t?t:Z.trim(Z.text(e))}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o=\"select-one\"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(Q.optDisabled?n.disabled:null!==n.getAttribute(\"disabled\"))||n.parentNode.disabled&&Z.nodeName(n.parentNode,\"optgroup\"))){if(t=Z(n).val(),o)return t;s.push(t)}return s},set:function(e,t){for(var n,r,i=e.options,o=Z.makeArray(t),s=i.length;s--;)r=i[s],(r.selected=Z.inArray(r.value,o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),Z.each([\"radio\",\"checkbox\"],function(){Z.valHooks[this]={set:function(e,t){return Z.isArray(t)?e.checked=Z.inArray(Z(e).val(),t)>=0:void 0}},Q.checkOn||(Z.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),Z.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(e,t){Z.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),Z.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}});var lt=Z.now(),ct=/\\?/;Z.parseJSON=function(e){return JSON.parse(e+\"\")},Z.parseXML=function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,\"text/xml\")}catch(r){t=void 0}return(!t||t.getElementsByTagName(\"parsererror\").length)&&Z.error(\"Invalid XML: \"+e),t};var ft=/#.*$/,pt=/([?&])_=[^&]*/,dt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,gt=/^(?:GET|HEAD)$/,mt=/^\\/\\//,vt=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,yt={},xt={},bt=\"*/\".concat(\"*\"),wt=e.location.href,Tt=vt.exec(wt.toLowerCase())||[];Z.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wt,type:\"GET\",isLocal:ht.test(Tt[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":bt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":Z.parseJSON,\"text xml\":Z.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?R(R(e,Z.ajaxSettings),t):R(Z.ajaxSettings,e)},ajaxPrefilter:F(yt),ajaxTransport:F(xt),ajax:function(e,t){function n(e,t,n,s){var u,c,v,y,b,T=t;2!==x&&(x=2,a&&clearTimeout(a),r=void 0,o=s||\"\",w.readyState=e>0?4:0,u=e>=200&&300>e||304===e,n&&(y=M(f,w,n)),y=W(f,y,w,u),u?(f.ifModified&&(b=w.getResponseHeader(\"Last-Modified\"),b&&(Z.lastModified[i]=b),b=w.getResponseHeader(\"etag\"),b&&(Z.etag[i]=b)),204===e||\"HEAD\"===f.type?T=\"nocontent\":304===e?T=\"notmodified\":(T=y.state,c=y.data,v=y.error,u=!v)):(v=T,(e||!T)&&(T=\"error\",0>e&&(e=0))),w.status=e,w.statusText=(t||T)+\"\",u?h.resolveWith(p,[c,T,w]):h.rejectWith(p,[w,T,v]),w.statusCode(m),m=void 0,l&&d.trigger(u?\"ajaxSuccess\":\"ajaxError\",[w,f,u?c:v]),g.fireWith(p,[w,T]),l&&(d.trigger(\"ajaxComplete\",[w,f]),--Z.active||Z.event.trigger(\"ajaxStop\")))}\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,s,a,u,l,c,f=Z.ajaxSetup({},t),p=f.context||f,d=f.context&&(p.nodeType||p.jquery)?Z(p):Z.event,h=Z.Deferred(),g=Z.Callbacks(\"once memory\"),m=f.statusCode||{},v={},y={},x=0,b=\"canceled\",w={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!s)for(s={};t=dt.exec(o);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?o:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=y[n]=y[n]||e,v[e]=t),this},overrideMimeType:function(e){return x||(f.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||b;return r&&r.abort(t),n(0,t),this}};if(h.promise(w).complete=g.add,w.success=w.done,w.error=w.fail,f.url=((e||f.url||wt)+\"\").replace(ft,\"\").replace(mt,Tt[1]+\"//\"),f.type=t.method||t.type||f.method||f.type,f.dataTypes=Z.trim(f.dataType||\"*\").toLowerCase().match(de)||[\"\"],null==f.crossDomain&&(u=vt.exec(f.url.toLowerCase()),f.crossDomain=!(!u||u[1]===Tt[1]&&u[2]===Tt[2]&&(u[3]||(\"http:\"===u[1]?\"80\":\"443\"))===(Tt[3]||(\"http:\"===Tt[1]?\"80\":\"443\")))),f.data&&f.processData&&\"string\"!=typeof f.data&&(f.data=Z.param(f.data,f.traditional)),P(yt,f,t,w),2===x)return w;l=Z.event&&f.global,l&&0===Z.active++&&Z.event.trigger(\"ajaxStart\"),f.type=f.type.toUpperCase(),f.hasContent=!gt.test(f.type),i=f.url,f.hasContent||(f.data&&(i=f.url+=(ct.test(i)?\"&\":\"?\")+f.data,delete f.data),f.cache===!1&&(f.url=pt.test(i)?i.replace(pt,\"$1_=\"+lt++):i+(ct.test(i)?\"&\":\"?\")+\"_=\"+lt++)),f.ifModified&&(Z.lastModified[i]&&w.setRequestHeader(\"If-Modified-Since\",Z.lastModified[i]),Z.etag[i]&&w.setRequestHeader(\"If-None-Match\",Z.etag[i])),(f.data&&f.hasContent&&f.contentType!==!1||t.contentType)&&w.setRequestHeader(\"Content-Type\",f.contentType),w.setRequestHeader(\"Accept\",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+(\"*\"!==f.dataTypes[0]?\", \"+bt+\"; q=0.01\":\"\"):f.accepts[\"*\"]);for(c in f.headers)w.setRequestHeader(c,f.headers[c]);if(f.beforeSend&&(f.beforeSend.call(p,w,f)===!1||2===x))return w.abort();b=\"abort\";for(c in{success:1,error:1,complete:1})w[c](f[c]);if(r=P(xt,f,t,w)){w.readyState=1,l&&d.trigger(\"ajaxSend\",[w,f]),f.async&&f.timeout>0&&(a=setTimeout(function(){w.abort(\"timeout\")},f.timeout));try{x=1,r.send(v,n)}catch(T){if(!(2>x))throw T;n(-1,T)}}else n(-1,\"No Transport\");return w},getJSON:function(e,t,n){return Z.get(e,t,n,\"json\")},getScript:function(e,t){return Z.get(e,void 0,t,\"script\")}}),Z.each([\"get\",\"post\"],function(e,t){Z[t]=function(e,n,r,i){return Z.isFunction(n)&&(i=i||r,r=n,n=void 0),Z.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),Z._evalUrl=function(e){return Z.ajax({url:e,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},Z.fn.extend({wrapAll:function(e){var t;return Z.isFunction(e)?this.each(function(t){Z(this).wrapAll(e.call(this,t))}):(this[0]&&(t=Z(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return this.each(Z.isFunction(e)?function(t){Z(this).wrapInner(e.call(this,t))}:function(){var t=Z(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=Z.isFunction(e);return this.each(function(n){Z(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){Z.nodeName(this,\"body\")||Z(this).replaceWith(this.childNodes)}).end()}}),Z.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0},Z.expr.filters.visible=function(e){return!Z.expr.filters.hidden(e)};var Ct=/%20/g,Nt=/\\[\\]$/,kt=/\\r?\\n/g,Et=/^(?:submit|button|image|reset|file)$/i,St=/^(?:input|select|textarea|keygen)/i;Z.param=function(e,t){var n,r=[],i=function(e,t){t=Z.isFunction(t)?t():null==t?\"\":t,r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(t)};if(void 0===t&&(t=Z.ajaxSettings&&Z.ajaxSettings.traditional),Z.isArray(e)||e.jquery&&!Z.isPlainObject(e))Z.each(e,function(){i(this.name,this.value)});else for(n in e)$(n,e[n],t,i);return r.join(\"&\").replace(Ct,\"+\")},Z.fn.extend({serialize:function(){return Z.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=Z.prop(this,\"elements\");return e?Z.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!Z(this).is(\":disabled\")&&St.test(this.nodeName)&&!Et.test(e)&&(this.checked||!Ne.test(e))}).map(function(e,t){var n=Z(this).val();return null==n?null:Z.isArray(n)?Z.map(n,function(e){return{name:t.name,value:e.replace(kt,\"\\r\\n\")}}):{name:t.name,value:n.replace(kt,\"\\r\\n\")}}).get()}}),Z.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var Dt=0,jt={},At={0:200,1223:204},Lt=Z.ajaxSettings.xhr();e.attachEvent&&e.attachEvent(\"onunload\",function(){for(var e in jt)jt[e]()}),Q.cors=!!Lt&&\"withCredentials\"in Lt,Q.ajax=Lt=!!Lt,Z.ajaxTransport(function(e){var t;return Q.cors||Lt&&!e.crossDomain?{send:function(n,r){var i,o=e.xhr(),s=++Dt;if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n[\"X-Requested-With\"]||(n[\"X-Requested-With\"]=\"XMLHttpRequest\");for(i in n)o.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete jt[s],t=o.onload=o.onerror=null,\"abort\"===e?o.abort():\"error\"===e?r(o.status,o.statusText):r(At[o.status]||o.status,o.statusText,\"string\"==typeof o.responseText?{text:o.responseText}:void 0,o.getAllResponseHeaders()))}},o.onload=t(),o.onerror=t(\"error\"),t=jt[s]=t(\"abort\");try{o.send(e.hasContent&&e.data||null)}catch(a){if(t)throw a}},abort:function(){t&&t()}}:void 0}),Z.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(e){return Z.globalEval(e),e}}}),Z.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),Z.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=Z(\"<script>\").prop({async:!0,charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&i(\"error\"===e.type?404:200,e.type)}),J.head.appendChild(t[0])},abort:function(){n&&n()}}}});var qt=[],Ht=/(=)\\?(?=&|$)|\\?\\?/;Z.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=qt.pop()||Z.expando+\"_\"+lt++;return this[e]=!0,e}}),Z.ajaxPrefilter(\"json jsonp\",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(Ht.test(t.url)?\"url\":\"string\"==typeof t.data&&!(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ht.test(t.data)&&\"data\");return a||\"jsonp\"===t.dataTypes[0]?(i=t.jsonpCallback=Z.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ht,\"$1\"+i):t.jsonp!==!1&&(t.url+=(ct.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+i),t.converters[\"script json\"]=function(){return s||Z.error(i+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,qt.push(i)),s&&Z.isFunction(o)&&o(s[0]),s=o=void 0}),\"script\"):void 0}),Z.parseHTML=function(e,t,n){if(!e||\"string\"!=typeof e)return null;\"boolean\"==typeof t&&(n=t,t=!1),t=t||J;var r=se.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=Z.buildFragment([e],t,i),i&&i.length&&Z(i).remove(),Z.merge([],r.childNodes))};var Ot=Z.fn.load;Z.fn.load=function(e,t,n){if(\"string\"!=typeof e&&Ot)return Ot.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(\" \");return a>=0&&(r=Z.trim(e.slice(a)),e=e.slice(0,a)),Z.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),s.length>0&&Z.ajax({url:e,type:i,dataType:\"html\",data:t}).done(function(e){o=arguments,s.html(r?Z(\"<div>\").append(Z.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},Z.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){Z.fn[t]=function(e){return this.on(t,e)}}),Z.expr.filters.animated=function(e){return Z.grep(Z.timers,function(t){return e===t.elem}).length};var Ft=e.document.documentElement;Z.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=Z.css(e,\"position\"),f=Z(e),p={};\"static\"===c&&(e.style.position=\"relative\"),a=f.offset(),o=Z.css(e,\"top\"),u=Z.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(o+u).indexOf(\"auto\")>-1,l?(r=f.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),Z.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+i),\"using\"in t?t.using.call(e,p):f.css(p)}},Z.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){Z.offset.setOffset(this,e,t)});var t,n,r=this[0],i={top:0,left:0},o=r&&r.ownerDocument;return o?(t=o.documentElement,Z.contains(t,r)?(typeof r.getBoundingClientRect!==ke&&(i=r.getBoundingClientRect()),n=I(o),{top:i.top+n.pageYOffset-t.clientTop,left:i.left+n.pageXOffset-t.clientLeft}):i):void 0},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===Z.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),Z.nodeName(e[0],\"html\")||(r=e.offset()),r.top+=Z.css(e[0],\"borderTopWidth\",!0),r.left+=Z.css(e[0],\"borderLeftWidth\",!0)),{top:t.top-r.top-Z.css(n,\"marginTop\",!0),left:t.left-r.left-Z.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||Ft;e&&!Z.nodeName(e,\"html\")&&\"static\"===Z.css(e,\"position\");)e=e.offsetParent;return e||Ft})}}),Z.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,n){var r=\"pageYOffset\"===n;Z.fn[t]=function(i){return me(this,function(t,i,o){var s=I(t);return void 0===o?s?s[n]:t[i]:void(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o)},t,i,arguments.length,null)}}),Z.each([\"top\",\"left\"],function(e,t){Z.cssHooks[t]=T(Q.pixelPosition,function(e,n){return n?(n=w(e,t),Be.test(n)?Z(e).position()[t]+\"px\":n):void 0})}),Z.each({Height:\"height\",Width:\"width\"},function(e,t){Z.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){Z.fn[r]=function(r,i){var o=arguments.length&&(n||\"boolean\"!=typeof r),s=n||(r===!0||i===!0?\"margin\":\"border\");return me(this,function(t,n,r){var i;return Z.isWindow(t)?t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===r?Z.css(t,n,s):Z.style(t,n,r,s)},t,o?r:void 0,o,null)}})}),Z.fn.size=function(){return this.length},Z.fn.andSelf=Z.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return Z});var Pt=e.jQuery,Rt=e.$;return Z.noConflict=function(t){return e.$===Z&&(e.$=Rt),t&&e.jQuery===Z&&(e.jQuery=Pt),Z},typeof t===ke&&(e.jQuery=e.$=Z),Z});\n!function(t,e,i,n){\"use strict\";function r(t,e,i){return setTimeout(c(t,i),e)}function s(t,e,i){return Array.isArray(t)?(o(t,i[e],i),!0):!1}function o(t,e,i){var r;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==n)for(r=0;r<t.length;)e.call(i,t[r],r,t),r++;else for(r in t)t.hasOwnProperty(r)&&e.call(i,t[r],r,t)}function a(t,e,i){for(var r=Object.keys(e),s=0;s<r.length;)(!i||i&&t[r[s]]===n)&&(t[r[s]]=e[r[s]]),s++;return t}function h(t,e){return a(t,e,!0)}function u(t,e,i){var n,r=e.prototype;n=t.prototype=Object.create(r),n.constructor=t,n._super=r,i&&a(n,i)}function c(t,e){return function(){return t.apply(e,arguments)}}function l(t,e){return typeof t==ct?t.apply(e?e[0]||n:n,e):t}function p(t,e){return t===n?e:t}function f(t,e,i){o(g(e),function(e){t.addEventListener(e,i,!1)})}function d(t,e,i){o(g(e),function(e){t.removeEventListener(e,i,!1)})}function v(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function m(t,e){return t.indexOf(e)>-1}function g(t){return t.trim().split(/\\s+/g)}function T(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var n=0;n<t.length;){if(i&&t[n][i]==e||!i&&t[n]===e)return n;n++}return-1}function y(t){return Array.prototype.slice.call(t,0)}function E(t,e,i){for(var n=[],r=[],s=0;s<t.length;){var o=e?t[s][e]:t[s];T(r,o)<0&&n.push(t[s]),r[s]=o,s++}return i&&(n=e?n.sort(function(t,i){return t[e]>i[e]}):n.sort()),n}function I(t,e){for(var i,r,s=e[0].toUpperCase()+e.slice(1),o=0;o<ht.length;){if(i=ht[o],r=i?i+s:e,r in t)return r;o++}return n}function A(){return dt++}function _(t){var e=t.ownerDocument;return e.defaultView||e.parentWindow}function D(t,e){var i=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){l(t.options.enable,[t])&&i.handler(e)},this.init()}function S(t){var e,i=t.options.inputClass;return new(e=i?i:gt?W:Tt?H:mt?U:F)(t,w)}function w(t,e,i){var n=i.pointers.length,r=i.changedPointers.length,s=e&Dt&&n-r===0,o=e&(wt|bt)&&n-r===0;i.isFirst=!!s,i.isFinal=!!o,s&&(t.session={}),i.eventType=e,b(t,i),t.emit(\"hammer.input\",i),t.recognize(i),t.session.prevInput=i}function b(t,e){var i=t.session,n=e.pointers,r=n.length;i.firstInput||(i.firstInput=z(e)),r>1&&!i.firstMultiple?i.firstMultiple=z(e):1===r&&(i.firstMultiple=!1);var s=i.firstInput,o=i.firstMultiple,a=o?o.center:s.center,h=e.center=N(n);e.timeStamp=ft(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=x(a,h),e.distance=O(a,h),C(i,e),e.offsetDirection=M(e.deltaX,e.deltaY),e.scale=o?Y(o.pointers,n):1,e.rotation=o?X(o.pointers,n):0,R(i,e);var u=t.element;v(e.srcEvent.target,u)&&(u=e.srcEvent.target),e.target=u}function C(t,e){var i=e.center,n=t.offsetDelta||{},r=t.prevDelta||{},s=t.prevInput||{};(e.eventType===Dt||s.eventType===wt)&&(r=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},n=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=r.x+(i.x-n.x),e.deltaY=r.y+(i.y-n.y)}function R(t,e){var i,r,s,o,a=t.lastInterval||e,h=e.timeStamp-a.timeStamp;if(e.eventType!=bt&&(h>_t||a.velocity===n)){var u=a.deltaX-e.deltaX,c=a.deltaY-e.deltaY,l=P(h,u,c);r=l.x,s=l.y,i=pt(l.x)>pt(l.y)?l.x:l.y,o=M(u,c),t.lastInterval=e}else i=a.velocity,r=a.velocityX,s=a.velocityY,o=a.direction;e.velocity=i,e.velocityX=r,e.velocityY=s,e.direction=o}function z(t){for(var e=[],i=0;i<t.pointers.length;)e[i]={clientX:lt(t.pointers[i].clientX),clientY:lt(t.pointers[i].clientY)},i++;return{timeStamp:ft(),pointers:e,center:N(e),deltaX:t.deltaX,deltaY:t.deltaY}}function N(t){var e=t.length;if(1===e)return{x:lt(t[0].clientX),y:lt(t[0].clientY)};for(var i=0,n=0,r=0;e>r;)i+=t[r].clientX,n+=t[r].clientY,r++;return{x:lt(i/e),y:lt(n/e)}}function P(t,e,i){return{x:e/t||0,y:i/t||0}}function M(t,e){return t===e?Ct:pt(t)>=pt(e)?t>0?Rt:zt:e>0?Nt:Pt}function O(t,e,i){i||(i=Xt);var n=e[i[0]]-t[i[0]],r=e[i[1]]-t[i[1]];return Math.sqrt(n*n+r*r)}function x(t,e,i){i||(i=Xt);var n=e[i[0]]-t[i[0]],r=e[i[1]]-t[i[1]];return 180*Math.atan2(r,n)/Math.PI}function X(t,e){return x(e[1],e[0],Yt)-x(t[1],t[0],Yt)}function Y(t,e){return O(e[0],e[1],Yt)/O(t[0],t[1],Yt)}function F(){this.evEl=Wt,this.evWin=qt,this.allow=!0,this.pressed=!1,D.apply(this,arguments)}function W(){this.evEl=kt,this.evWin=Ut,D.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function q(){this.evTarget=Vt,this.evWin=jt,this.started=!1,D.apply(this,arguments)}function L(t,e){var i=y(t.touches),n=y(t.changedTouches);return e&(wt|bt)&&(i=E(i.concat(n),\"identifier\",!0)),[i,n]}function H(){this.evTarget=Bt,this.targetIds={},D.apply(this,arguments)}function k(t,e){var i=y(t.touches),n=this.targetIds;if(e&(Dt|St)&&1===i.length)return n[i[0].identifier]=!0,[i,i];var r,s,o=y(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return v(t.target,h)}),e===Dt)for(r=0;r<s.length;)n[s[r].identifier]=!0,r++;for(r=0;r<o.length;)n[o[r].identifier]&&a.push(o[r]),e&(wt|bt)&&delete n[o[r].identifier],r++;return a.length?[E(s.concat(a),\"identifier\",!0),a]:void 0}function U(){D.apply(this,arguments);var t=c(this.handler,this);this.touch=new H(this.manager,t),this.mouse=new F(this.manager,t)}function G(t,e){this.manager=t,this.set(e)}function V(t){if(m(t,ee))return ee;var e=m(t,ie),i=m(t,ne);return e&&i?ie+\" \"+ne:e||i?e?ie:ne:m(t,te)?te:$t}function j(t){this.id=A(),this.manager=null,this.options=h(t||{},this.defaults),this.options.enable=p(this.options.enable,!0),this.state=re,this.simultaneous={},this.requireFail=[]}function Z(t){return t&ue?\"cancel\":t&ae?\"end\":t&oe?\"move\":t&se?\"start\":\"\"}function B(t){return t==Pt?\"down\":t==Nt?\"up\":t==Rt?\"left\":t==zt?\"right\":\"\"}function J(t,e){var i=e.manager;return i?i.get(t):t}function K(){j.apply(this,arguments)}function Q(){K.apply(this,arguments),this.pX=null,this.pY=null}function $(){K.apply(this,arguments)}function tt(){j.apply(this,arguments),this._timer=null,this._input=null}function et(){K.apply(this,arguments)}function it(){K.apply(this,arguments)}function nt(){j.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function rt(t,e){return e=e||{},e.recognizers=p(e.recognizers,rt.defaults.preset),new st(t,e)}function st(t,e){e=e||{},this.options=h(e,rt.defaults),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.element=t,this.input=S(this),this.touchAction=new G(this,this.options.touchAction),ot(this,!0),o(e.recognizers,function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}function ot(t,e){var i=t.element;o(t.options.cssProps,function(t,n){i.style[I(i.style,n)]=e?t:\"\"})}function at(t,i){var n=e.createEvent(\"Event\");n.initEvent(t,!0,!0),n.gesture=i,i.target.dispatchEvent(n)}var ht=[\"\",\"webkit\",\"moz\",\"MS\",\"ms\",\"o\"],ut=e.createElement(\"div\"),ct=\"function\",lt=Math.round,pt=Math.abs,ft=Date.now,dt=1,vt=/mobile|tablet|ip(ad|hone|od)|android/i,mt=\"ontouchstart\"in t,gt=I(t,\"PointerEvent\")!==n,Tt=mt&&vt.test(navigator.userAgent),yt=\"touch\",Et=\"pen\",It=\"mouse\",At=\"kinect\",_t=25,Dt=1,St=2,wt=4,bt=8,Ct=1,Rt=2,zt=4,Nt=8,Pt=16,Mt=Rt|zt,Ot=Nt|Pt,xt=Mt|Ot,Xt=[\"x\",\"y\"],Yt=[\"clientX\",\"clientY\"];D.prototype={handler:function(){},init:function(){this.evEl&&f(this.element,this.evEl,this.domHandler),this.evTarget&&f(this.target,this.evTarget,this.domHandler),this.evWin&&f(_(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&d(this.element,this.evEl,this.domHandler),this.evTarget&&d(this.target,this.evTarget,this.domHandler),this.evWin&&d(_(this.element),this.evWin,this.domHandler)}};var Ft={mousedown:Dt,mousemove:St,mouseup:wt},Wt=\"mousedown\",qt=\"mousemove mouseup\";u(F,D,{handler:function(t){var e=Ft[t.type];e&Dt&&0===t.button&&(this.pressed=!0),e&St&&1!==t.which&&(e=wt),this.pressed&&this.allow&&(e&wt&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:It,srcEvent:t}))}});var Lt={pointerdown:Dt,pointermove:St,pointerup:wt,pointercancel:bt,pointerout:bt},Ht={2:yt,3:Et,4:It,5:At},kt=\"pointerdown\",Ut=\"pointermove pointerup pointercancel\";t.MSPointerEvent&&(kt=\"MSPointerDown\",Ut=\"MSPointerMove MSPointerUp MSPointerCancel\"),u(W,D,{handler:function(t){var e=this.store,i=!1,n=t.type.toLowerCase().replace(\"ms\",\"\"),r=Lt[n],s=Ht[t.pointerType]||t.pointerType,o=s==yt,a=T(e,t.pointerId,\"pointerId\");r&Dt&&(0===t.button||o)?0>a&&(e.push(t),a=e.length-1):r&(wt|bt)&&(i=!0),0>a||(e[a]=t,this.callback(this.manager,r,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var Gt={touchstart:Dt,touchmove:St,touchend:wt,touchcancel:bt},Vt=\"touchstart\",jt=\"touchstart touchmove touchend touchcancel\";u(q,D,{handler:function(t){var e=Gt[t.type];if(e===Dt&&(this.started=!0),this.started){var i=L.call(this,t,e);e&(wt|bt)&&i[0].length-i[1].length===0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:yt,srcEvent:t})}}});var Zt={touchstart:Dt,touchmove:St,touchend:wt,touchcancel:bt},Bt=\"touchstart touchmove touchend touchcancel\";u(H,D,{handler:function(t){var e=Zt[t.type],i=k.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:yt,srcEvent:t})}}),u(U,D,{handler:function(t,e,i){var n=i.pointerType==yt,r=i.pointerType==It;if(n)this.mouse.allow=!1;else if(r&&!this.mouse.allow)return;e&(wt|bt)&&(this.mouse.allow=!0),this.callback(t,e,i)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Jt=I(ut.style,\"touchAction\"),Kt=Jt!==n,Qt=\"compute\",$t=\"auto\",te=\"manipulation\",ee=\"none\",ie=\"pan-x\",ne=\"pan-y\";G.prototype={set:function(t){t==Qt&&(t=this.compute()),Kt&&(this.manager.element.style[Jt]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return o(this.manager.recognizers,function(e){l(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),V(t.join(\" \"))},preventDefaults:function(t){if(!Kt){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var n=this.actions,r=m(n,ee),s=m(n,ne),o=m(n,ie);return r||s&&i&Mt||o&&i&Ot?this.preventSrc(e):void 0}},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var re=1,se=2,oe=4,ae=8,he=ae,ue=16,ce=32;j.prototype={defaults:{},set:function(t){return a(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(s(t,\"recognizeWith\",this))return this;var e=this.simultaneous;return t=J(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return s(t,\"dropRecognizeWith\",this)?this:(t=J(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(s(t,\"requireFailure\",this))return this;var e=this.requireFail;return t=J(t,this),-1===T(e,t)&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(s(t,\"dropRequireFailure\",this))return this;t=J(t,this);var e=T(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(i.options.event+(e?Z(n):\"\"),t)}var i=this,n=this.state;ae>n&&e(!0),e(),n>=ae&&e(!0)},tryEmit:function(t){return this.canEmit()?this.emit(t):void(this.state=ce)},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(ce|re)))return!1;t++}return!0},recognize:function(t){var e=a({},t);return l(this.options.enable,[this,e])?(this.state&(he|ue|ce)&&(this.state=re),this.state=this.process(e),void(this.state&(se|oe|ae|ue)&&this.tryEmit(e))):(this.reset(),void(this.state=ce))},process:function(t){},getTouchAction:function(){},reset:function(){}},u(K,j,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,i=t.eventType,n=e&(se|oe),r=this.attrTest(t);return n&&(i&bt||!r)?e|ue:n||r?i&wt?e|ae:e&se?e|oe:se:ce}}),u(Q,K,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:xt},getTouchAction:function(){var t=this.options.direction,e=[];return t&Mt&&e.push(ne),t&Ot&&e.push(ie),e},directionTest:function(t){var e=this.options,i=!0,n=t.distance,r=t.direction,s=t.deltaX,o=t.deltaY;return r&e.direction||(e.direction&Mt?(r=0===s?Ct:0>s?Rt:zt,i=s!=this.pX,n=Math.abs(t.deltaX)):(r=0===o?Ct:0>o?Nt:Pt,i=o!=this.pY,n=Math.abs(t.deltaY))),t.direction=r,i&&n>e.threshold&&r&e.direction},attrTest:function(t){return K.prototype.attrTest.call(this,t)&&(this.state&se||!(this.state&se)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=B(t.direction);e&&this.manager.emit(this.options.event+e,t),this._super.emit.call(this,t)}}),u($,K,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[ee]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&se)},emit:function(t){if(this._super.emit.call(this,t),1!==t.scale){var e=t.scale<1?\"in\":\"out\";this.manager.emit(this.options.event+e,t)}}}),u(tt,j,{defaults:{event:\"press\",pointers:1,time:500,threshold:5},getTouchAction:function(){return[$t]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,n=t.distance<e.threshold,s=t.deltaTime>e.time;if(this._input=t,!n||!i||t.eventType&(wt|bt)&&!s)this.reset();else if(t.eventType&Dt)this.reset(),this._timer=r(function(){this.state=he,this.tryEmit()},e.time,this);else if(t.eventType&wt)return he;return ce},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===he&&(t&&t.eventType&wt?this.manager.emit(this.options.event+\"up\",t):(this._input.timeStamp=ft(),this.manager.emit(this.options.event,this._input)))}}),u(et,K,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[ee]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&se)}}),u(it,K,{defaults:{event:\"swipe\",threshold:10,velocity:.65,direction:Mt|Ot,pointers:1},getTouchAction:function(){return Q.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Mt|Ot)?e=t.velocity:i&Mt?e=t.velocityX:i&Ot&&(e=t.velocityY),this._super.attrTest.call(this,t)&&i&t.direction&&t.distance>this.options.threshold&&pt(e)>this.options.velocity&&t.eventType&wt},emit:function(t){var e=B(t.direction);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),u(nt,j,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[te]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,n=t.distance<e.threshold,s=t.deltaTime<e.time;if(this.reset(),t.eventType&Dt&&0===this.count)return this.failTimeout();if(n&&s&&i){if(t.eventType!=wt)return this.failTimeout();var o=this.pTime?t.timeStamp-this.pTime<e.interval:!0,a=!this.pCenter||O(this.pCenter,t.center)<e.posThreshold;this.pTime=t.timeStamp,this.pCenter=t.center,a&&o?this.count+=1:this.count=1,this._input=t;var h=this.count%e.taps;if(0===h)return this.hasRequireFailures()?(this._timer=r(function(){this.state=he,this.tryEmit()},e.interval,this),se):he}return ce},failTimeout:function(){return this._timer=r(function(){this.state=ce},this.options.interval,this),ce},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==he&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),rt.VERSION=\"2.0.4\",rt.defaults={domEvents:!1,touchAction:Qt,enable:!0,inputTarget:null,inputClass:null,preset:[[et,{enable:!1}],[$,{enable:!1},[\"rotate\"]],[it,{direction:Mt}],[Q,{direction:Mt},[\"swipe\"]],[nt],[nt,{event:\"doubletap\",taps:2},[\"tap\"]],[tt]],cssProps:{userSelect:\"none\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var le=1,pe=2;st.prototype={set:function(t){return a(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?pe:le},recognize:function(t){var e=this.session;if(!e.stopped){this.touchAction.preventDefaults(t);var i,n=this.recognizers,r=e.curRecognizer;(!r||r&&r.state&he)&&(r=e.curRecognizer=null);for(var s=0;s<n.length;)i=n[s],e.stopped===pe||r&&i!=r&&!i.canRecognizeWith(r)?i.reset():i.recognize(t),!r&&i.state&(se|oe|ae)&&(r=e.curRecognizer=i),s++}},get:function(t){if(t instanceof j)return t;for(var e=this.recognizers,i=0;i<e.length;i++)if(e[i].options.event==t)return e[i];return null},add:function(t){if(s(t,\"add\",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(s(t,\"remove\",this))return this;var e=this.recognizers;return t=this.get(t),e.splice(T(e,t),1),this.touchAction.update(),this},on:function(t,e){var i=this.handlers;return o(g(t),function(t){i[t]=i[t]||[],i[t].push(e)}),this},off:function(t,e){var i=this.handlers;return o(g(t),function(t){e?i[t].splice(T(i[t],e),1):delete i[t]}),this},emit:function(t,e){this.options.domEvents&&at(t,e);var i=this.handlers[t]&&this.handlers[t].slice();if(i&&i.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var n=0;n<i.length;)i[n](e),n++}},destroy:function(){this.element&&ot(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},a(rt,{INPUT_START:Dt,INPUT_MOVE:St,INPUT_END:wt,INPUT_CANCEL:bt,STATE_POSSIBLE:re,STATE_BEGAN:se,STATE_CHANGED:oe,STATE_ENDED:ae,STATE_RECOGNIZED:he,STATE_CANCELLED:ue,STATE_FAILED:ce,DIRECTION_NONE:Ct,DIRECTION_LEFT:Rt,DIRECTION_RIGHT:zt,DIRECTION_UP:Nt,DIRECTION_DOWN:Pt,DIRECTION_HORIZONTAL:Mt,DIRECTION_VERTICAL:Ot,DIRECTION_ALL:xt,Manager:st,Input:D,TouchAction:G,TouchInput:H,MouseInput:F,PointerEventInput:W,TouchMouseInput:U,SingleTouchInput:q,Recognizer:j,AttrRecognizer:K,Tap:nt,Pan:Q,Swipe:it,Pinch:$,Rotate:et,Press:tt,on:f,off:d,each:o,merge:h,extend:a,inherit:u,bindFn:c,prefixed:I}),typeof define==ct&&define.amd?define(function(){return rt}):\"undefined\"!=typeof module&&module.exports?module.exports=rt:t[i]=rt}(window,document,\"Hammer\");\n!function(t,e,n){\"use strict\";function r(t,e){return e=e||Error,function(){var n,r,i=arguments[0],o=\"[\"+(t?t+\":\":\"\")+i+\"] \",a=arguments[1],s=arguments;for(n=o+a.replace(/\\{\\d+\\}/g,function(t){var e=+t.slice(1,-1);return e+2<s.length?ht(s[e+2]):t}),n=n+\"\\nhttp://errors.angularjs.org/1.3.15/\"+(t?t+\"/\":\"\")+i,r=2;r<arguments.length;r++)n=n+(2==r?\"?\":\"&\")+\"p\"+(r-2)+\"=\"+encodeURIComponent(ht(arguments[r]));return new e(n)}}function i(t){if(null==t||A(t))return!1;var e=t.length;return t.nodeType===yr&&e?!0:w(t)||hr(t)||0===e||\"number\"==typeof e&&e>0&&e-1 in t}function o(t,e,n){var r,a;if(t)if(S(t))for(r in t)\"prototype\"==r||\"length\"==r||\"name\"==r||t.hasOwnProperty&&!t.hasOwnProperty(r)||e.call(n,t[r],r,t);else if(hr(t)||i(t)){var s=\"object\"!=typeof t;for(r=0,a=t.length;a>r;r++)(s||r in t)&&e.call(n,t[r],r,t)}else if(t.forEach&&t.forEach!==o)t.forEach(e,n,t);else for(r in t)t.hasOwnProperty(r)&&e.call(n,t[r],r,t);return t}function a(t){return Object.keys(t).sort()}function s(t,e,n){for(var r=a(t),i=0;i<r.length;i++)e.call(n,t[r[i]],r[i]);return r}function u(t){return function(e,n){t(n,e)}}function c(){return++lr}function l(t,e){e?t.$$hashKey=e:delete t.$$hashKey}function f(t){for(var e=t.$$hashKey,n=1,r=arguments.length;r>n;n++){var i=arguments[n];if(i)for(var o=Object.keys(i),a=0,s=o.length;s>a;a++){var u=o[a];t[u]=i[u]}}return l(t,e),t}function h(t){return parseInt(t,10)}function $(t,e){return f(Object.create(t),e)}function p(){}function d(t){return t}function v(t){return function(){return t}}function m(t){return\"undefined\"==typeof t}function g(t){return\"undefined\"!=typeof t}function y(t){return null!==t&&\"object\"==typeof t}function w(t){return\"string\"==typeof t}function b(t){return\"number\"==typeof t}function x(t){return\"[object Date]\"===sr.call(t)}function S(t){return\"function\"==typeof t}function C(t){return\"[object RegExp]\"===sr.call(t)}function A(t){return t&&t.window===t}function E(t){return t&&t.$evalAsync&&t.$watch}function k(t){return\"[object File]\"===sr.call(t)}function O(t){return\"[object FormData]\"===sr.call(t)}function T(t){return\"[object Blob]\"===sr.call(t)}function M(t){return\"boolean\"==typeof t}function N(t){return t&&S(t.then)}function V(t){return!(!t||!(t.nodeName||t.prop&&t.attr&&t.find))}function D(t){var e,n={},r=t.split(\",\");for(e=0;e<r.length;e++)n[r[e]]=!0;return n}function j(t){return Jn(t.nodeName||t[0]&&t[0].nodeName)}function R(t,e){var n=t.indexOf(e);return n>=0&&t.splice(n,1),e}function P(t,e,n,r){if(A(t)||E(t))throw ur(\"cpws\",\"Can't copy! Making copies of Window or Scope instances is not supported.\");if(e){if(t===e)throw ur(\"cpi\",\"Can't copy! Source and destination are identical.\");if(n=n||[],r=r||[],y(t)){var i=n.indexOf(t);if(-1!==i)return r[i];n.push(t),r.push(e)}var a;if(hr(t)){e.length=0;for(var s=0;s<t.length;s++)a=P(t[s],null,n,r),y(t[s])&&(n.push(t[s]),r.push(a)),e.push(a)}else{var u=e.$$hashKey;hr(e)?e.length=0:o(e,function(t,n){delete e[n]});for(var c in t)t.hasOwnProperty(c)&&(a=P(t[c],null,n,r),y(t[c])&&(n.push(t[c]),r.push(a)),e[c]=a);l(e,u)}}else if(e=t,t)if(hr(t))e=P(t,[],n,r);else if(x(t))e=new Date(t.getTime());else if(C(t))e=new RegExp(t.source,t.toString().match(/[^\\/]*$/)[0]),e.lastIndex=t.lastIndex;else if(y(t)){var f=Object.create(Object.getPrototypeOf(t));e=P(t,f,n,r)}return e}function _(t,e){if(hr(t)){e=e||[];for(var n=0,r=t.length;r>n;n++)e[n]=t[n]}else if(y(t)){e=e||{};for(var i in t)(\"$\"!==i.charAt(0)||\"$\"!==i.charAt(1))&&(e[i]=t[i])}return e||t}function I(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t!==t&&e!==e)return!0;var r,i,o,a=typeof t,s=typeof e;if(a==s&&\"object\"==a){if(!hr(t)){if(x(t))return x(e)?I(t.getTime(),e.getTime()):!1;if(C(t))return C(e)?t.toString()==e.toString():!1;if(E(t)||E(e)||A(t)||A(e)||hr(e)||x(e)||C(e))return!1;o={};for(i in t)if(\"$\"!==i.charAt(0)&&!S(t[i])){if(!I(t[i],e[i]))return!1;o[i]=!0}for(i in e)if(!o.hasOwnProperty(i)&&\"$\"!==i.charAt(0)&&e[i]!==n&&!S(e[i]))return!1;return!0}if(!hr(e))return!1;if((r=t.length)==e.length){for(i=0;r>i;i++)if(!I(t[i],e[i]))return!1;return!0}}return!1}function q(t,e,n){return t.concat(ir.call(e,n))}function U(t,e){return ir.call(t,e||0)}function F(t,e){var n=arguments.length>2?U(arguments,2):[];return!S(e)||e instanceof RegExp?e:n.length?function(){return arguments.length?e.apply(t,q(n,arguments,0)):e.apply(t,n)}:function(){return arguments.length?e.apply(t,arguments):e.call(t)}}function H(t,r){var i=r;return\"string\"==typeof t&&\"$\"===t.charAt(0)&&\"$\"===t.charAt(1)?i=n:A(r)?i=\"$WINDOW\":r&&e===r?i=\"$DOCUMENT\":E(r)&&(i=\"$SCOPE\"),i}function B(t,e){return\"undefined\"==typeof t?n:(b(e)||(e=e?2:null),JSON.stringify(t,H,e))}function L(t){return w(t)?JSON.parse(t):t}function z(t){t=er(t).clone();try{t.empty()}catch(e){}var n=er(\"<div>\").append(t).html();try{return t[0].nodeType===wr?Jn(n):n.match(/^(<[^>]+>)/)[1].replace(/^<([\\w\\-]+)/,function(t,e){return\"<\"+Jn(e)})}catch(e){return Jn(n)}}function G(t){try{return decodeURIComponent(t)}catch(e){}}function W(t){var e,n,r={};return o((t||\"\").split(\"&\"),function(t){if(t&&(e=t.replace(/\\+/g,\"%20\").split(\"=\"),n=G(e[0]),g(n))){var i=g(e[1])?G(e[1]):!0;Zn.call(r,n)?hr(r[n])?r[n].push(i):r[n]=[r[n],i]:r[n]=i}}),r}function Y(t){var e=[];return o(t,function(t,n){hr(t)?o(t,function(t){e.push(Z(n,!0)+(t===!0?\"\":\"=\"+Z(t,!0)))}):e.push(Z(n,!0)+(t===!0?\"\":\"=\"+Z(t,!0)))}),e.length?e.join(\"&\"):\"\"}function J(t){return Z(t,!0).replace(/%26/gi,\"&\").replace(/%3D/gi,\"=\").replace(/%2B/gi,\"+\")}function Z(t,e){return encodeURIComponent(t).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%3B/gi,\";\").replace(/%20/g,e?\"%20\":\"+\")}function K(t,e){var n,r,i=vr.length;for(t=er(t),r=0;i>r;++r)if(n=vr[r]+e,w(n=t.attr(n)))return n;return null}function X(t,e){var n,r,i={};o(vr,function(e){var i=e+\"app\";!n&&t.hasAttribute&&t.hasAttribute(i)&&(n=t,r=t.getAttribute(i))}),o(vr,function(e){var i,o=e+\"app\";!n&&(i=t.querySelector(\"[\"+o.replace(\":\",\"\\\\:\")+\"]\"))&&(n=i,r=i.getAttribute(o))}),n&&(i.strictDi=null!==K(n,\"strict-di\"),e(n,r?[r]:[],i))}function Q(n,r,i){y(i)||(i={});var a={strictDi:!1};i=f(a,i);var s=function(){if(n=er(n),n.injector()){var t=n[0]===e?\"document\":z(n);throw ur(\"btstrpd\",\"App Already Bootstrapped with this Element '{0}'\",t.replace(/</,\"&lt;\").replace(/>/,\"&gt;\"))}r=r||[],r.unshift([\"$provide\",function(t){t.value(\"$rootElement\",n)}]),i.debugInfoEnabled&&r.push([\"$compileProvider\",function(t){t.debugInfoEnabled(!0)}]),r.unshift(\"ng\");var o=Lt(r,i.strictDi);return o.invoke([\"$rootScope\",\"$rootElement\",\"$compile\",\"$injector\",function(t,e,n,r){t.$apply(function(){e.data(\"$injector\",r),n(e)(t)})}]),o},u=/^NG_ENABLE_DEBUG_INFO!/,c=/^NG_DEFER_BOOTSTRAP!/;return t&&u.test(t.name)&&(i.debugInfoEnabled=!0,t.name=t.name.replace(u,\"\")),t&&!c.test(t.name)?s():(t.name=t.name.replace(c,\"\"),cr.resumeBootstrap=function(t){return o(t,function(t){r.push(t)}),s()},void(S(cr.resumeDeferredBootstrap)&&cr.resumeDeferredBootstrap()))}function tt(){t.name=\"NG_ENABLE_DEBUG_INFO!\"+t.name,t.location.reload()}function et(t){var e=cr.element(t).injector();if(!e)throw ur(\"test\",\"no injector found for element argument to getTestability\");return e.get(\"$$testability\")}function nt(t,e){return e=e||\"_\",t.replace(mr,function(t,n){return(n?e:\"\")+t.toLowerCase()})}function rt(){var e;gr||(nr=t.jQuery,nr&&nr.fn.on?(er=nr,f(nr.fn,{scope:Ir.scope,isolateScope:Ir.isolateScope,controller:Ir.controller,injector:Ir.injector,inheritedData:Ir.inheritedData}),e=nr.cleanData,nr.cleanData=function(t){var n;if(fr)fr=!1;else for(var r,i=0;null!=(r=t[i]);i++)n=nr._data(r,\"events\"),n&&n.$destroy&&nr(r).triggerHandler(\"$destroy\");e(t)}):er=wt,cr.element=er,gr=!0)}function it(t,e,n){if(!t)throw ur(\"areq\",\"Argument '{0}' is {1}\",e||\"?\",n||\"required\");return t}function ot(t,e,n){return n&&hr(t)&&(t=t[t.length-1]),it(S(t),e,\"not a function, got \"+(t&&\"object\"==typeof t?t.constructor.name||\"Object\":typeof t)),t}function at(t,e){if(\"hasOwnProperty\"===t)throw ur(\"badname\",\"hasOwnProperty is not a valid {0} name\",e)}function st(t,e,n){if(!e)return t;for(var r,i=e.split(\".\"),o=t,a=i.length,s=0;a>s;s++)r=i[s],t&&(t=(o=t)[r]);return!n&&S(t)?F(o,t):t}function ut(t){var e=t[0],n=t[t.length-1],r=[e];do{if(e=e.nextSibling,!e)break;r.push(e)}while(e!==n);return er(r)}function ct(){return Object.create(null)}function lt(t){function e(t,e,n){return t[e]||(t[e]=n())}var n=r(\"$injector\"),i=r(\"ng\"),o=e(t,\"angular\",Object);return o.$$minErr=o.$$minErr||r,e(o,\"module\",function(){var t={};return function(r,o,a){var s=function(t,e){if(\"hasOwnProperty\"===t)throw i(\"badname\",\"hasOwnProperty is not a valid {0} name\",e)};return s(r,\"module\"),o&&t.hasOwnProperty(r)&&(t[r]=null),e(t,r,function(){function t(t,n,r,i){return i||(i=e),function(){return i[r||\"push\"]([t,n,arguments]),c}}if(!o)throw n(\"nomod\",\"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.\",r);var e=[],i=[],s=[],u=t(\"$injector\",\"invoke\",\"push\",i),c={_invokeQueue:e,_configBlocks:i,_runBlocks:s,requires:o,name:r,provider:t(\"$provide\",\"provider\"),factory:t(\"$provide\",\"factory\"),service:t(\"$provide\",\"service\"),value:t(\"$provide\",\"value\"),constant:t(\"$provide\",\"constant\",\"unshift\"),animation:t(\"$animateProvider\",\"register\"),filter:t(\"$filterProvider\",\"register\"),controller:t(\"$controllerProvider\",\"register\"),directive:t(\"$compileProvider\",\"directive\"),config:u,run:function(t){return s.push(t),this}};return a&&u(a),c})}})}function ft(t){var e=[];return JSON.stringify(t,function(t,n){if(n=H(t,n),y(n)){if(e.indexOf(n)>=0)return\"<<already seen>>\";e.push(n)}return n})}function ht(t){return\"function\"==typeof t?t.toString().replace(/ \\{[\\s\\S]*$/,\"\"):\"undefined\"==typeof t?\"undefined\":\"string\"!=typeof t?ft(t):t}function $t(e){f(e,{bootstrap:Q,copy:P,extend:f,equals:I,element:er,forEach:o,injector:Lt,noop:p,bind:F,toJson:B,fromJson:L,identity:d,isUndefined:m,isDefined:g,isString:w,isFunction:S,isObject:y,isNumber:b,isElement:V,isArray:hr,version:Cr,isDate:x,lowercase:Jn,uppercase:Kn,callbacks:{counter:0},getTestability:et,$$minErr:r,$$csp:dr,reloadWithDebugInfo:tt}),rr=lt(t);try{rr(\"ngLocale\")}catch(n){rr(\"ngLocale\",[]).provider(\"$locale\",ve)}rr(\"ng\",[\"ngLocale\"],[\"$provide\",function(t){t.provider({$$sanitizeUri:Ye}),t.provider(\"$compile\",Kt).directive({a:Mi,input:Wi,textarea:Wi,form:Ri,script:_o,select:Uo,style:Ho,option:Fo,ngBind:Zi,ngBindHtml:Xi,ngBindTemplate:Ki,ngClass:to,ngClassEven:no,ngClassOdd:eo,ngCloak:ro,ngController:io,ngForm:Pi,ngHide:No,ngIf:so,ngInclude:uo,ngInit:lo,ngNonBindable:Ao,ngPluralize:Eo,ngRepeat:ko,ngShow:Mo,ngStyle:Vo,ngSwitch:Do,ngSwitchWhen:jo,ngSwitchDefault:Ro,ngOptions:qo,ngTransclude:Po,ngModel:xo,ngList:fo,ngChange:Qi,pattern:Lo,ngPattern:Lo,required:Bo,ngRequired:Bo,minlength:Go,ngMinlength:Go,maxlength:zo,ngMaxlength:zo,ngValue:Ji,ngModelOptions:Co}).directive({ngInclude:co}).directive(Ni).directive(oo),t.provider({$anchorScroll:zt,$animate:Yr,$browser:Yt,$cacheFactory:Jt,$controller:ee,$document:ne,$exceptionHandler:re,$filter:sn,$interpolate:pe,$interval:de,$http:le,$httpBackend:he,$location:Me,$log:Ne,$parse:He,$rootScope:We,$q:Be,$$q:Le,$sce:Xe,$sceDelegate:Ke,$sniffer:Qe,$templateCache:Zt,$templateRequest:tn,$$testability:en,$timeout:nn,$window:an,$$rAF:Ge,$$asyncCallback:Gt,$$jqLite:qt})}])}function pt(){return++Er}function dt(t){return t.replace(Tr,function(t,e,n,r){return r?n.toUpperCase():n}).replace(Mr,\"Moz$1\")}function vt(t){return!jr.test(t)}function mt(t){var e=t.nodeType;return e===yr||!e||e===xr}function gt(t,e){var n,r,i,a,s=e.createDocumentFragment(),u=[];if(vt(t))u.push(e.createTextNode(t));else{for(n=n||s.appendChild(e.createElement(\"div\")),r=(Rr.exec(t)||[\"\",\"\"])[1].toLowerCase(),i=_r[r]||_r._default,n.innerHTML=i[1]+t.replace(Pr,\"<$1></$2>\")+i[2],a=i[0];a--;)n=n.lastChild;u=q(u,n.childNodes),n=s.firstChild,n.textContent=\"\"}return s.textContent=\"\",s.innerHTML=\"\",o(u,function(t){s.appendChild(t)}),s}function yt(t,n){n=n||e;var r;return(r=Dr.exec(t))?[n.createElement(r[1])]:(r=gt(t,n))?r.childNodes:[]}function wt(t){if(t instanceof wt)return t;var e;if(w(t)&&(t=$r(t),e=!0),!(this instanceof wt)){if(e&&\"<\"!=t.charAt(0))throw Vr(\"nosel\",\"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element\");return new wt(t)}e?Mt(this,yt(t)):Mt(this,t)}function bt(t){return t.cloneNode(!0)}function xt(t,e){if(e||Ct(t),t.querySelectorAll)for(var n=t.querySelectorAll(\"*\"),r=0,i=n.length;i>r;r++)Ct(n[r])}function St(t,e,n,r){if(g(r))throw Vr(\"offargs\",\"jqLite#off() does not support the ` + \"`\" + `selector` + \"`\" + ` argument\");var i=At(t),a=i&&i.events,s=i&&i.handle;if(s)if(e)o(e.split(\" \"),function(e){if(g(n)){var r=a[e];if(R(r||[],n),r&&r.length>0)return}Or(t,e,s),delete a[e]});else for(e in a)\"$destroy\"!==e&&Or(t,e,s),delete a[e]}function Ct(t,e){var r=t.ng339,i=r&&Ar[r];if(i){if(e)return void delete i.data[e];i.handle&&(i.events.$destroy&&i.handle({},\"$destroy\"),St(t)),delete Ar[r],t.ng339=n}}function At(t,e){var r=t.ng339,i=r&&Ar[r];return e&&!i&&(t.ng339=r=pt(),i=Ar[r]={events:{},data:{},handle:n}),i}function Et(t,e,n){if(mt(t)){var r=g(n),i=!r&&e&&!y(e),o=!e,a=At(t,!i),s=a&&a.data;if(r)s[e]=n;else{if(o)return s;if(i)return s&&s[e];f(s,e)}}}function kt(t,e){return t.getAttribute?(\" \"+(t.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \").indexOf(\" \"+e+\" \")>-1:!1}function Ot(t,e){e&&t.setAttribute&&o(e.split(\" \"),function(e){t.setAttribute(\"class\",$r((\" \"+(t.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \").replace(\" \"+$r(e)+\" \",\" \")))})}function Tt(t,e){if(e&&t.setAttribute){var n=(\" \"+(t.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \");o(e.split(\" \"),function(t){t=$r(t),-1===n.indexOf(\" \"+t+\" \")&&(n+=t+\" \")}),t.setAttribute(\"class\",$r(n))}}function Mt(t,e){if(e)if(e.nodeType)t[t.length++]=e;else{var n=e.length;if(\"number\"==typeof n&&e.window!==e){if(n)for(var r=0;n>r;r++)t[t.length++]=e[r]}else t[t.length++]=e}}function Nt(t,e){return Vt(t,\"$\"+(e||\"ngController\")+\"Controller\")}function Vt(t,e,r){t.nodeType==xr&&(t=t.documentElement);for(var i=hr(e)?e:[e];t;){for(var o=0,a=i.length;a>o;o++)if((r=er.data(t,i[o]))!==n)return r;t=t.parentNode||t.nodeType===Sr&&t.host}}function Dt(t){for(xt(t,!0);t.firstChild;)t.removeChild(t.firstChild)}function jt(t,e){e||xt(t);var n=t.parentNode;n&&n.removeChild(t)}function Rt(e,n){n=n||t,\"complete\"===n.document.readyState?n.setTimeout(e):er(n).on(\"load\",e)}function Pt(t,e){var n=qr[e.toLowerCase()];return n&&Ur[j(t)]&&n}function _t(t,e){var n=t.nodeName;return(\"INPUT\"===n||\"TEXTAREA\"===n)&&Fr[e]}function It(t,e){var n=function(n,r){n.isDefaultPrevented=function(){return n.defaultPrevented};var i=e[r||n.type],o=i?i.length:0;if(o){if(m(n.immediatePropagationStopped)){var a=n.stopImmediatePropagation;n.stopImmediatePropagation=function(){n.immediatePropagationStopped=!0,n.stopPropagation&&n.stopPropagation(),a&&a.call(n)}}n.isImmediatePropagationStopped=function(){return n.immediatePropagationStopped===!0},o>1&&(i=_(i));for(var s=0;o>s;s++)n.isImmediatePropagationStopped()||i[s].call(t,n)}};return n.elem=t,n}function qt(){this.$get=function(){return f(wt,{hasClass:function(t,e){return t.attr&&(t=t[0]),kt(t,e)},addClass:function(t,e){return t.attr&&(t=t[0]),Tt(t,e)},removeClass:function(t,e){return t.attr&&(t=t[0]),Ot(t,e)}})}}function Ut(t,e){var n=t&&t.$$hashKey;if(n)return\"function\"==typeof n&&(n=t.$$hashKey()),n;var r=typeof t;return n=\"function\"==r||\"object\"==r&&null!==t?t.$$hashKey=r+\":\"+(e||c)():r+\":\"+t}function Ft(t,e){if(e){var n=0;this.nextUid=function(){return++n}}o(t,this.put,this)}function Ht(t){var e=t.toString().replace(zr,\"\"),n=e.match(Hr);return n?\"function(\"+(n[1]||\"\").replace(/[\\s\\r\\n]+/,\" \")+\")\":\"fn\"}function Bt(t,e,n){var r,i,a,s;if(\"function\"==typeof t){if(!(r=t.$inject)){if(r=[],t.length){if(e)throw w(n)&&n||(n=t.name||Ht(t)),Gr(\"strictdi\",\"{0} is not using explicit annotation and cannot be invoked in strict mode\",n);i=t.toString().replace(zr,\"\"),a=i.match(Hr),o(a[1].split(Br),function(t){t.replace(Lr,function(t,e,n){r.push(n)})})}t.$inject=r}}else hr(t)?(s=t.length-1,ot(t[s],\"fn\"),r=t.slice(0,s)):ot(t,\"fn\",!0);return r}function Lt(t,e){function r(t){return function(e,n){return y(e)?void o(e,u(t)):t(e,n)}}function i(t,e){if(at(t,\"service\"),(S(e)||hr(e))&&(e=E.instantiate(e)),!e.$get)throw Gr(\"pget\",\"Provider '{0}' must define $get factory method.\",t);return A[t+b]=e}function a(t,e){return function(){var n=O.invoke(e,this);if(m(n))throw Gr(\"undef\",\"Provider '{0}' must return a value from $get factory method.\",t);return n}}function s(t,e,n){return i(t,{$get:n!==!1?a(t,e):e})}function c(t,e){return s(t,[\"$injector\",function(t){return t.instantiate(e)}])}function l(t,e){return s(t,v(e),!1)}function f(t,e){at(t,\"constant\"),A[t]=e,k[t]=e}function h(t,e){var n=E.get(t+b),r=n.$get;n.$get=function(){var t=O.invoke(r,n);return O.invoke(e,null,{$delegate:t})}}function $(t){var e,n=[];return o(t,function(t){function r(t){var e,n;for(e=0,n=t.length;n>e;e++){var r=t[e],i=E.get(r[0]);i[r[1]].apply(i,r[2])}}if(!C.get(t)){C.put(t,!0);try{w(t)?(e=rr(t),n=n.concat($(e.requires)).concat(e._runBlocks),r(e._invokeQueue),r(e._configBlocks)):S(t)?n.push(E.invoke(t)):hr(t)?n.push(E.invoke(t)):ot(t,\"module\")}catch(i){throw hr(t)&&(t=t[t.length-1]),i.message&&i.stack&&-1==i.stack.indexOf(i.message)&&(i=i.message+\"\\n\"+i.stack),Gr(\"modulerr\",\"Failed to instantiate module {0} due to:\\n{1}\",t,i.stack||i.message||i)}}}),n}function d(t,n){function r(e,r){if(t.hasOwnProperty(e)){if(t[e]===g)throw Gr(\"cdep\",\"Circular dependency found: {0}\",e+\" <- \"+x.join(\" <- \"));return t[e]}try{return x.unshift(e),t[e]=g,t[e]=n(e,r)}catch(i){throw t[e]===g&&delete t[e],i}finally{x.shift()}}function i(t,n,i,o){\"string\"==typeof i&&(o=i,i=null);var a,s,u,c=[],l=Lt.$$annotate(t,e,o);for(s=0,a=l.length;a>s;s++){if(u=l[s],\"string\"!=typeof u)throw Gr(\"itkn\",\"Incorrect injection token! Expected service name as string, got {0}\",u);c.push(i&&i.hasOwnProperty(u)?i[u]:r(u,o))}return hr(t)&&(t=t[a]),t.apply(n,c)}function o(t,e,n){var r=Object.create((hr(t)?t[t.length-1]:t).prototype||null),o=i(t,r,e,n);return y(o)||S(o)?o:r}return{invoke:i,instantiate:o,get:r,annotate:Lt.$$annotate,has:function(e){return A.hasOwnProperty(e+b)||t.hasOwnProperty(e)}}}e=e===!0;var g={},b=\"Provider\",x=[],C=new Ft([],!0),A={$provide:{provider:r(i),factory:r(s),service:r(c),value:r(l),constant:r(f),decorator:h}},E=A.$injector=d(A,function(t,e){throw cr.isString(e)&&x.push(e),Gr(\"unpr\",\"Unknown provider: {0}\",x.join(\" <- \"))}),k={},O=k.$injector=d(k,function(t,e){var r=E.get(t+b,e);return O.invoke(r.$get,r,n,t)});return o($(t),function(t){O.invoke(t||p)}),O}function zt(){var t=!0;this.disableAutoScrolling=function(){t=!1},this.$get=[\"$window\",\"$location\",\"$rootScope\",function(e,n,r){function i(t){var e=null;return Array.prototype.some.call(t,function(t){return\"a\"===j(t)?(e=t,!0):void 0}),e}function o(){var t=s.yOffset;if(S(t))t=t();else if(V(t)){var n=t[0],r=e.getComputedStyle(n);t=\"fixed\"!==r.position?0:n.getBoundingClientRect().bottom}else b(t)||(t=0);return t}function a(t){if(t){t.scrollIntoView();var n=o();if(n){var r=t.getBoundingClientRect().top;e.scrollBy(0,r-n)}}else e.scrollTo(0,0)}function s(){var t,e=n.hash();e?(t=u.getElementById(e))?a(t):(t=i(u.getElementsByName(e)))?a(t):\"top\"===e&&a(null):a(null)}var u=e.document;return t&&r.$watch(function(){return n.hash()},function(t,e){(t!==e||\"\"!==t)&&Rt(function(){r.$evalAsync(s)})}),s}]}function Gt(){this.$get=[\"$$rAF\",\"$timeout\",function(t,e){return t.supported?function(e){return t(e)}:function(t){return e(t,0,!1)}}]}function Wt(t,e,r,i){function a(t){try{t.apply(null,U(arguments,1))}finally{if(C--,0===C)for(;A.length;)try{A.pop()()}catch(e){r.error(e)}}}function s(t){var e=t.indexOf(\"#\");return-1===e?\"\":t.substr(e+1)}function u(t,e){!function n(){o(k,function(t){t()}),E=e(n,t)}()}function c(){f(),h()}function l(){try{return y.state}catch(t){}}function f(){O=l(),O=m(O)?null:O,I(O,R)&&(O=R),R=O}function h(){(M!==d.url()||T!==O)&&(M=d.url(),T=O,o(D,function(t){t(d.url(),O)}))}function $(t){try{return decodeURIComponent(t)}catch(e){return t}}var d=this,v=e[0],g=t.location,y=t.history,b=t.setTimeout,x=t.clearTimeout,S={};d.isMock=!1;var C=0,A=[];d.$$completeOutstandingRequest=a,d.$$incOutstandingRequestCount=function(){C++},d.notifyWhenNoOutstandingRequests=function(t){o(k,function(t){t()}),0===C?t():A.push(t)};var E,k=[];d.addPollFn=function(t){return m(E)&&u(100,b),k.push(t),t};var O,T,M=g.href,N=e.find(\"base\"),V=null;f(),T=O,d.url=function(e,n,r){if(m(r)&&(r=null),g!==t.location&&(g=t.location),y!==t.history&&(y=t.history),e){var o=T===r;if(M===e&&(!i.history||o))return d;var a=M&&be(M)===be(e);return M=e,T=r,!i.history||a&&o?(a||(V=e),n?g.replace(e):a?g.hash=s(e):g.href=e):(y[n?\"replaceState\":\"pushState\"](r,\"\",e),f(),T=O),d}return V||g.href.replace(/%27/g,\"'\")},d.state=function(){return O};var D=[],j=!1,R=null;d.onUrlChange=function(e){return j||(i.history&&er(t).on(\"popstate\",c),er(t).on(\"hashchange\",c),j=!0),D.push(e),e},d.$$checkUrlChange=h,d.baseHref=function(){var t=N.attr(\"href\");return t?t.replace(/^(https?\\:)?\\/\\/[^\\/]*/,\"\"):\"\"};var P={},_=\"\",q=d.baseHref();d.cookies=function(t,e){var i,o,a,s,u;if(!t){if(v.cookie!==_)for(_=v.cookie,o=_.split(\"; \"),P={},s=0;s<o.length;s++)a=o[s],u=a.indexOf(\"=\"),u>0&&(t=$(a.substring(0,u)),P[t]===n&&(P[t]=$(a.substring(u+1))));return P}e===n?v.cookie=encodeURIComponent(t)+\"=;path=\"+q+\";expires=Thu, 01 Jan 1970 00:00:00 GMT\":w(e)&&(i=(v.cookie=encodeURIComponent(t)+\"=\"+encodeURIComponent(e)+\";path=\"+q).length+1,i>4096&&r.warn(\"Cookie '\"+t+\"' possibly not set or overflowed because it was too large (\"+i+\" > 4096 bytes)!\"))},d.defer=function(t,e){var n;return C++,n=b(function(){delete S[n],a(t)},e||0),S[n]=!0,n},d.defer.cancel=function(t){return S[t]?(delete S[t],x(t),a(p),!0):!1}}function Yt(){this.$get=[\"$window\",\"$log\",\"$sniffer\",\"$document\",function(t,e,n,r){return new Wt(t,r,e,n)}]}function Jt(){this.$get=function(){function t(t,n){function i(t){t!=h&&($?$==t&&($=t.n):$=t,o(t.n,t.p),o(t,h),h=t,h.n=null)}function o(t,e){t!=e&&(t&&(t.p=e),e&&(e.n=t))}if(t in e)throw r(\"$cacheFactory\")(\"iid\",\"CacheId '{0}' is already taken!\",t);var a=0,s=f({},n,{id:t}),u={},c=n&&n.capacity||Number.MAX_VALUE,l={},h=null,$=null;return e[t]={put:function(t,e){if(c<Number.MAX_VALUE){var n=l[t]||(l[t]={key:t});i(n)}if(!m(e))return t in u||a++,u[t]=e,a>c&&this.remove($.key),e},get:function(t){if(c<Number.MAX_VALUE){var e=l[t];if(!e)return;i(e)}return u[t]},remove:function(t){if(c<Number.MAX_VALUE){var e=l[t];if(!e)return;e==h&&(h=e.p),e==$&&($=e.n),o(e.n,e.p),delete l[t]}delete u[t],a--},removeAll:function(){u={},a=0,l={},h=$=null},destroy:function(){u=null,s=null,l=null,delete e[t]},info:function(){return f({},s,{size:a})}}}var e={};return t.info=function(){var t={};return o(e,function(e,n){t[n]=e.info()}),t},t.get=function(t){return e[t]},t}}function Zt(){this.$get=[\"$cacheFactory\",function(t){return t(\"templates\")}]}function Kt(t,r){function i(t,e){var n=/^\\s*([@&]|=(\\*?))(\\??)\\s*(\\w*)\\s*$/,r={};return o(t,function(t,i){var o=t.match(n);if(!o)throw Jr(\"iscp\",\"Invalid isolate scope definition for directive '{0}'. Definition: {... {1}: '{2}' ...}\",e,i,t);r[i]={mode:o[1][0],collection:\"*\"===o[2],optional:\"?\"===o[3],attrName:o[4]||i}}),r}var a={},s=\"Directive\",c=/^\\s*directive\\:\\s*([\\w\\-]+)\\s+(.*)$/,l=/(([\\w\\-]+)(?:\\:([^;]+))?;?)/,h=D(\"ngSrc,ngSrcset,src,srcset\"),m=/^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/,b=/^(on[a-z]+|formaction)$/;this.directive=function C(e,n){return at(e,\"directive\"),w(e)?(it(n,\"directiveFactory\"),a.hasOwnProperty(e)||(a[e]=[],t.factory(e+s,[\"$injector\",\"$exceptionHandler\",function(t,n){var r=[];return o(a[e],function(o,a){try{var s=t.invoke(o);S(s)?s={compile:v(s)}:!s.compile&&s.link&&(s.compile=v(s.link)),s.priority=s.priority||0,s.index=a,s.name=s.name||e,s.require=s.require||s.controller&&s.name,s.restrict=s.restrict||\"EA\",y(s.scope)&&(s.$$isolateBindings=i(s.scope,s.name)),r.push(s)}catch(u){n(u)}}),r}])),a[e].push(n)):o(e,u(C)),this},this.aHrefSanitizationWhitelist=function(t){return g(t)?(r.aHrefSanitizationWhitelist(t),this):r.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(t){return g(t)?(r.imgSrcSanitizationWhitelist(t),this):r.imgSrcSanitizationWhitelist()};var x=!0;this.debugInfoEnabled=function(t){return g(t)?(x=t,this):x},this.$get=[\"$injector\",\"$interpolate\",\"$exceptionHandler\",\"$templateRequest\",\"$parse\",\"$controller\",\"$rootScope\",\"$document\",\"$sce\",\"$animate\",\"$$sanitizeUri\",function(t,r,i,u,v,g,C,A,k,O,T){function M(t,e){try{t.addClass(e)}catch(n){}}function N(t,e,n,r,i){t instanceof er||(t=er(t)),o(t,function(e,n){e.nodeType==wr&&e.nodeValue.match(/\\S+/)&&(t[n]=er(e).wrap(\"<span></span>\").parent()[0])});var a=D(t,e,t,n,r,i);N.$$addScopeClass(t);var s=null;return function(e,n,r){it(e,\"scope\"),r=r||{};var i=r.parentBoundTranscludeFn,o=r.transcludeControllers,u=r.futureParentElement;i&&i.$$boundTransclude&&(i=i.$$boundTransclude),s||(s=V(u));var c;if(c=\"html\"!==s?er(X(s,er(\"<div>\").append(t).html())):n?Ir.clone.call(t):t,o)for(var l in o)c.data(\"$\"+l+\"Controller\",o[l].instance);return N.$$addScopeInfo(c,e),n&&n(c,e),a&&a(e,c,c,i),c}}function V(t){var e=t&&t[0];return e&&\"foreignobject\"!==j(e)&&e.toString().match(/SVG/)?\"svg\":\"html\"}function D(t,e,r,i,o,a){function s(t,r,i,o){var a,s,u,c,l,f,h,$,v;if(p){var m=r.length;for(v=new Array(m),l=0;l<d.length;l+=3)h=d[l],v[h]=r[h]}else v=r;for(l=0,f=d.length;f>l;)u=v[d[l++]],a=d[l++],s=d[l++],a?(a.scope?(c=t.$new(),N.$$addScopeInfo(er(u),c)):c=t,$=a.transcludeOnThisElement?P(t,a.transclude,o,a.elementTranscludeOnThisElement):!a.templateOnThisElement&&o?o:!o&&e?P(t,e):null,a(s,c,u,i,$)):s&&s(t,u.childNodes,n,o)}for(var u,c,l,f,h,$,p,d=[],v=0;v<t.length;v++)u=new at,c=_(t[v],[],u,0===v?i:n,o),l=c.length?H(c,t[v],u,e,r,null,[],[],a):null,l&&l.scope&&N.$$addScopeClass(u.$$element),h=l&&l.terminal||!(f=t[v].childNodes)||!f.length?null:D(f,l?(l.transcludeOnThisElement||!l.templateOnThisElement)&&l.transclude:e),(l||h)&&(d.push(v,l,h),$=!0,p=p||l),a=null;return $?s:null}function P(t,e,n,r){var i=function(r,i,o,a,s){return r||(r=t.$new(!1,s),r.$$transcluded=!0),e(r,i,{parentBoundTranscludeFn:n,transcludeControllers:o,futureParentElement:a})};return i}function _(t,e,n,r,i){var o,a,s=t.nodeType,u=n.$attr;switch(s){case yr:L(e,Xt(j(t)),\"E\",r,i);for(var f,h,$,p,d,v,m=t.attributes,g=0,b=m&&m.length;b>g;g++){var x=!1,S=!1;f=m[g],h=f.name,d=$r(f.value),p=Xt(h),(v=ft.test(p))&&(h=h.replace(Zr,\"\").substr(8).replace(/_(.)/g,function(t,e){return e.toUpperCase()}));var C=p.replace(/(Start|End)$/,\"\");G(C)&&p===C+\"Start\"&&(x=h,S=h.substr(0,h.length-5)+\"end\",h=h.substr(0,h.length-6)),$=Xt(h.toLowerCase()),u[$]=h,(v||!n.hasOwnProperty($))&&(n[$]=d,Pt(t,$)&&(n[$]=!0)),tt(t,e,d,$,v),L(e,$,\"A\",r,i,x,S)}if(a=t.className,y(a)&&(a=a.animVal),w(a)&&\"\"!==a)for(;o=l.exec(a);)$=Xt(o[2]),L(e,$,\"C\",r,i)&&(n[$]=$r(o[3])),a=a.substr(o.index+o[0].length);break;case wr:K(e,t.nodeValue);break;case br:try{o=c.exec(t.nodeValue),o&&($=Xt(o[1]),L(e,$,\"M\",r,i)&&(n[$]=$r(o[2])))}catch(A){}}return e.sort(J),e}function q(t,e,n){var r=[],i=0;if(e&&t.hasAttribute&&t.hasAttribute(e)){do{if(!t)throw Jr(\"uterdir\",\"Unterminated attribute, found '{0}' but no matching '{1}' found.\",e,n);t.nodeType==yr&&(t.hasAttribute(e)&&i++,t.hasAttribute(n)&&i--),r.push(t),t=t.nextSibling}while(i>0)}else r.push(t);return er(r)}function F(t,e,n){return function(r,i,o,a,s){return i=q(i[0],e,n),t(r,i,o,a,s)}}function H(t,a,s,u,c,l,f,h,$){function p(t,e,n,r){t&&(n&&(t=F(t,n,r)),t.require=A.require,t.directiveName=k,(j===A||A.$$isolateScope)&&(t=rt(t,{isolateScope:!0})),f.push(t)),e&&(n&&(e=F(e,n,r)),e.require=A.require,e.directiveName=k,(j===A||A.$$isolateScope)&&(e=rt(e,{isolateScope:!0})),h.push(e))}function d(t,e,n,r){var i,a,s=\"data\",u=!1,c=n;if(w(e)){if(a=e.match(m),e=e.substring(a[0].length),a[3]&&(a[1]?a[3]=null:a[1]=a[3]),\"^\"===a[1]?s=\"inheritedData\":\"^^\"===a[1]&&(s=\"inheritedData\",c=n.parent()),\"?\"===a[2]&&(u=!0),i=null,r&&\"data\"===s&&(i=r[e])&&(i=i.instance),i=i||c[s](\"$\"+e+\"Controller\"),!i&&!u)throw Jr(\"ctreq\",\"Controller '{0}', required by directive '{1}', can't be found!\",e,t);return i||null}return hr(e)&&(i=[],o(e,function(e){i.push(d(t,e,n,r))})),i}function b(t,e,i,u,c){function l(t,e,r){var i;return E(t)||(r=e,e=t,t=n),G&&(i=b),r||(r=G?S.parent():S),c(t,e,i,r,T)}var $,p,m,y,w,b,x,S,A;if(a===i?(A=s,S=s.$$element):(S=er(i),A=new at(S,s)),j&&(w=e.$new(!0)),c&&(x=l,x.$$boundTransclude=c),D&&(C={},b={},o(D,function(t){var n,r={$scope:t===j||t.$$isolateScope?w:e,$element:S,$attrs:A,$transclude:x};y=t.controller,\"@\"==y&&(y=A[t.name]),n=g(y,r,!0,t.controllerAs),b[t.name]=n,G||S.data(\"$\"+t.name+\"Controller\",n.instance),C[t.name]=n})),j){N.$$addScopeInfo(S,w,!0,!(R&&(R===j||R===j.$$originalDirective))),N.$$addScopeClass(S,!0);var k=C&&C[j.name],O=w;k&&k.identifier&&j.bindToController===!0&&(O=k.instance),o(w.$$isolateBindings=j.$$isolateBindings,function(t,n){var i,o,a,s,u=t.attrName,c=t.optional,l=t.mode;switch(l){case\"@\":A.$observe(u,function(t){O[n]=t}),A.$$observers[u].$$scope=e,A[u]&&(O[n]=r(A[u])(e));break;case\"=\":if(c&&!A[u])return;o=v(A[u]),s=o.literal?I:function(t,e){return t===e||t!==t&&e!==e},a=o.assign||function(){throw i=O[n]=o(e),Jr(\"nonassign\",\"Expression '{0}' used with directive '{1}' is non-assignable!\",A[u],j.name)},i=O[n]=o(e);var f=function(t){return s(t,O[n])||(s(t,i)?a(e,t=O[n]):O[n]=t),i=t};f.$stateful=!0;var h;h=t.collection?e.$watchCollection(A[u],f):e.$watch(v(A[u],f),null,o.literal),w.$on(\"$destroy\",h);break;case\"&\":o=v(A[u]),O[n]=function(t){return o(e,t)}}})}for(C&&(o(C,function(t){t()}),C=null),$=0,p=f.length;p>$;$++)m=f[$],ot(m,m.isolateScope?w:e,S,A,m.require&&d(m.directiveName,m.require,S,b),x);var T=e;for(j&&(j.template||null===j.templateUrl)&&(T=w),t&&t(T,i.childNodes,n,c),$=h.length-1;$>=0;$--)m=h[$],ot(m,m.isolateScope?w:e,S,A,m.require&&d(m.directiveName,m.require,S,b),x)}$=$||{};for(var x,C,A,k,O,T,M,V=-Number.MAX_VALUE,D=$.controllerDirectives,j=$.newIsolateScopeDirective,R=$.templateDirective,P=$.nonTlbTranscludeDirective,H=!1,L=!1,G=$.hasElementTranscludeDirective,J=s.$$element=er(a),K=l,Q=u,tt=0,nt=t.length;nt>tt;tt++){A=t[tt];var it=A.$$start,st=A.$$end;if(it&&(J=q(a,it,st)),O=n,V>A.priority)break;if((M=A.scope)&&(A.templateUrl||(y(M)?(Z(\"new/isolated scope\",j||x,A,J),j=A):Z(\"new/isolated scope\",j,A,J)),x=x||A),k=A.name,!A.templateUrl&&A.controller&&(M=A.controller,D=D||{},Z(\"'\"+k+\"' controller\",D[k],A,J),D[k]=A),(M=A.transclude)&&(H=!0,A.$$tlb||(Z(\"transclusion\",P,A,J),P=A),\"element\"==M?(G=!0,V=A.priority,O=J,J=s.$$element=er(e.createComment(\" \"+k+\": \"+s[k]+\" \")),a=J[0],et(c,U(O),a),Q=N(O,u,V,K&&K.name,{nonTlbTranscludeDirective:P})):(O=er(bt(a)).contents(),J.empty(),Q=N(O,u))),A.template)if(L=!0,Z(\"template\",R,A,J),R=A,M=S(A.template)?A.template(J,s):A.template,M=lt(M),A.replace){if(K=A,O=vt(M)?[]:te(X(A.templateNamespace,$r(M))),a=O[0],1!=O.length||a.nodeType!==yr)throw Jr(\"tplrt\",\"Template for directive '{0}' must have exactly one root element. {1}\",k,\"\");et(c,J,a);var ut={$attr:{}},ct=_(a,[],ut),ft=t.splice(tt+1,t.length-(tt+1));j&&B(ct),t=t.concat(ct).concat(ft),W(s,ut),nt=t.length}else J.html(M);if(A.templateUrl)L=!0,Z(\"template\",R,A,J),R=A,A.replace&&(K=A),b=Y(t.splice(tt,t.length-tt),J,s,c,H&&Q,f,h,{controllerDirectives:D,newIsolateScopeDirective:j,templateDirective:R,nonTlbTranscludeDirective:P}),nt=t.length;else if(A.compile)try{T=A.compile(J,s,Q),S(T)?p(null,T,it,st):T&&p(T.pre,T.post,it,st)}catch(ht){i(ht,z(J))}A.terminal&&(b.terminal=!0,V=Math.max(V,A.priority))}return b.scope=x&&x.scope===!0,b.transcludeOnThisElement=H,b.elementTranscludeOnThisElement=G,b.templateOnThisElement=L,b.transclude=Q,$.hasElementTranscludeDirective=G,b}function B(t){for(var e=0,n=t.length;n>e;e++)t[e]=$(t[e],{$$isolateScope:!0})}function L(e,r,o,u,c,l,f){if(r===c)return null;var h=null;if(a.hasOwnProperty(r))for(var p,d=t.get(r+s),v=0,m=d.length;m>v;v++)try{p=d[v],(u===n||u>p.priority)&&-1!=p.restrict.indexOf(o)&&(l&&(p=$(p,{\n$$start:l,$$end:f})),e.push(p),h=p)}catch(g){i(g)}return h}function G(e){if(a.hasOwnProperty(e))for(var n,r=t.get(e+s),i=0,o=r.length;o>i;i++)if(n=r[i],n.multiElement)return!0;return!1}function W(t,e){var n=e.$attr,r=t.$attr,i=t.$$element;o(t,function(r,i){\"$\"!=i.charAt(0)&&(e[i]&&e[i]!==r&&(r+=(\"style\"===i?\";\":\" \")+e[i]),t.$set(i,r,!0,n[i]))}),o(e,function(e,o){\"class\"==o?(M(i,e),t[\"class\"]=(t[\"class\"]?t[\"class\"]+\" \":\"\")+e):\"style\"==o?(i.attr(\"style\",i.attr(\"style\")+\";\"+e),t.style=(t.style?t.style+\";\":\"\")+e):\"$\"==o.charAt(0)||t.hasOwnProperty(o)||(t[o]=e,r[o]=n[o])})}function Y(t,e,n,r,i,a,s,c){var l,f,h=[],p=e[0],d=t.shift(),v=$(d,{templateUrl:null,transclude:null,replace:null,$$originalDirective:d}),m=S(d.templateUrl)?d.templateUrl(e,n):d.templateUrl,g=d.templateNamespace;return e.empty(),u(k.getTrustedResourceUrl(m)).then(function(u){var $,w,b,x;if(u=lt(u),d.replace){if(b=vt(u)?[]:te(X(g,$r(u))),$=b[0],1!=b.length||$.nodeType!==yr)throw Jr(\"tplrt\",\"Template for directive '{0}' must have exactly one root element. {1}\",d.name,m);w={$attr:{}},et(r,e,$);var S=_($,[],w);y(d.scope)&&B(S),t=S.concat(t),W(n,w)}else $=p,e.html(u);for(t.unshift(v),l=H(t,$,n,i,e,d,a,s,c),o(r,function(t,n){t==$&&(r[n]=e[0])}),f=D(e[0].childNodes,i);h.length;){var C=h.shift(),A=h.shift(),E=h.shift(),k=h.shift(),O=e[0];if(!C.$$destroyed){if(A!==p){var T=A.className;c.hasElementTranscludeDirective&&d.replace||(O=bt($)),et(E,er(A),O),M(er(O),T)}x=l.transcludeOnThisElement?P(C,l.transclude,k):k,l(f,C,O,r,x)}}h=null}),function(t,e,n,r,i){var o=i;e.$$destroyed||(h?h.push(e,n,r,o):(l.transcludeOnThisElement&&(o=P(e,l.transclude,i)),l(f,e,n,r,o)))}}function J(t,e){var n=e.priority-t.priority;return 0!==n?n:t.name!==e.name?t.name<e.name?-1:1:t.index-e.index}function Z(t,e,n,r){if(e)throw Jr(\"multidir\",\"Multiple directives [{0}, {1}] asking for {2} on: {3}\",e.name,n.name,t,z(r))}function K(t,e){var n=r(e,!0);n&&t.push({priority:0,compile:function(t){var e=t.parent(),r=!!e.length;return r&&N.$$addBindingClass(e),function(t,e){var i=e.parent();r||N.$$addBindingClass(i),N.$$addBindingInfo(i,n.expressions),t.$watch(n,function(t){e[0].nodeValue=t})}}})}function X(t,n){switch(t=Jn(t||\"html\")){case\"svg\":case\"math\":var r=e.createElement(\"div\");return r.innerHTML=\"<\"+t+\">\"+n+\"</\"+t+\">\",r.childNodes[0].childNodes;default:return n}}function Q(t,e){if(\"srcdoc\"==e)return k.HTML;var n=j(t);return\"xlinkHref\"==e||\"form\"==n&&\"action\"==e||\"img\"!=n&&(\"src\"==e||\"ngSrc\"==e)?k.RESOURCE_URL:void 0}function tt(t,e,n,i,o){var a=Q(t,i);o=h[i]||o;var s=r(n,!0,a,o);if(s){if(\"multiple\"===i&&\"select\"===j(t))throw Jr(\"selmulti\",\"Binding to the 'multiple' attribute is not supported. Element: {0}\",z(t));e.push({priority:100,compile:function(){return{pre:function(t,e,u){var c=u.$$observers||(u.$$observers={});if(b.test(i))throw Jr(\"nodomevents\",\"Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.\");var l=u[i];l!==n&&(s=l&&r(l,!0,a,o),n=l),s&&(u[i]=s(t),(c[i]||(c[i]=[])).$$inter=!0,(u.$$observers&&u.$$observers[i].$$scope||t).$watch(s,function(t,e){\"class\"===i&&t!=e?u.$updateClass(t,e):u.$set(i,t)}))}}}})}}function et(t,n,r){var i,o,a=n[0],s=n.length,u=a.parentNode;if(t)for(i=0,o=t.length;o>i;i++)if(t[i]==a){t[i++]=r;for(var c=i,l=c+s-1,f=t.length;f>c;c++,l++)f>l?t[c]=t[l]:delete t[c];t.length-=s-1,t.context===a&&(t.context=r);break}u&&u.replaceChild(r,a);var h=e.createDocumentFragment();h.appendChild(a),er(r).data(er(a).data()),nr?(fr=!0,nr.cleanData([a])):delete er.cache[a[er.expando]];for(var $=1,p=n.length;p>$;$++){var d=n[$];er(d).remove(),h.appendChild(d),delete n[$]}n[0]=r,n.length=1}function rt(t,e){return f(function(){return t.apply(null,arguments)},t,e)}function ot(t,e,n,r,o,a){try{t(e,n,r,o,a)}catch(s){i(s,z(n))}}var at=function(t,e){if(e){var n,r,i,o=Object.keys(e);for(n=0,r=o.length;r>n;n++)i=o[n],this[i]=e[i]}else this.$attr={};this.$$element=t};at.prototype={$normalize:Xt,$addClass:function(t){t&&t.length>0&&O.addClass(this.$$element,t)},$removeClass:function(t){t&&t.length>0&&O.removeClass(this.$$element,t)},$updateClass:function(t,e){var n=Qt(t,e);n&&n.length&&O.addClass(this.$$element,n);var r=Qt(e,t);r&&r.length&&O.removeClass(this.$$element,r)},$set:function(t,e,r,a){var s,u=this.$$element[0],c=Pt(u,t),l=_t(u,t),f=t;if(c?(this.$$element.prop(t,e),a=c):l&&(this[l]=e,f=l),this[t]=e,a?this.$attr[t]=a:(a=this.$attr[t],a||(this.$attr[t]=a=nt(t,\"-\"))),s=j(this.$$element),\"a\"===s&&\"href\"===t||\"img\"===s&&\"src\"===t)this[t]=e=T(e,\"src\"===t);else if(\"img\"===s&&\"srcset\"===t){for(var h=\"\",$=$r(e),p=/(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/,d=/\\s/.test($)?p:/(,)/,v=$.split(d),m=Math.floor(v.length/2),g=0;m>g;g++){var y=2*g;h+=T($r(v[y]),!0),h+=\" \"+$r(v[y+1])}var w=$r(v[2*g]).split(/\\s/);h+=T($r(w[0]),!0),2===w.length&&(h+=\" \"+$r(w[1])),this[t]=e=h}r!==!1&&(null===e||e===n?this.$$element.removeAttr(a):this.$$element.attr(a,e));var b=this.$$observers;b&&o(b[f],function(t){try{t(e)}catch(n){i(n)}})},$observe:function(t,e){var n=this,r=n.$$observers||(n.$$observers=ct()),i=r[t]||(r[t]=[]);return i.push(e),C.$evalAsync(function(){!i.$$inter&&n.hasOwnProperty(t)&&e(n[t])}),function(){R(i,e)}}};var st=r.startSymbol(),ut=r.endSymbol(),lt=\"{{\"==st||\"}}\"==ut?d:function(t){return t.replace(/\\{\\{/g,st).replace(/}}/g,ut)},ft=/^ngAttr[A-Z]/;return N.$$addBindingInfo=x?function(t,e){var n=t.data(\"$binding\")||[];hr(e)?n=n.concat(e):n.push(e),t.data(\"$binding\",n)}:p,N.$$addBindingClass=x?function(t){M(t,\"ng-binding\")}:p,N.$$addScopeInfo=x?function(t,e,n,r){var i=n?r?\"$isolateScopeNoTemplate\":\"$isolateScope\":\"$scope\";t.data(i,e)}:p,N.$$addScopeClass=x?function(t,e){M(t,e?\"ng-isolate-scope\":\"ng-scope\")}:p,N}]}function Xt(t){return dt(t.replace(Zr,\"\"))}function Qt(t,e){var n=\"\",r=t.split(/\\s+/),i=e.split(/\\s+/);t:for(var o=0;o<r.length;o++){for(var a=r[o],s=0;s<i.length;s++)if(a==i[s])continue t;n+=(n.length>0?\" \":\"\")+a}return n}function te(t){t=er(t);var e=t.length;if(1>=e)return t;for(;e--;){var n=t[e];n.nodeType===br&&or.call(t,e,1)}return t}function ee(){var t={},e=!1,i=/^(\\S+)(\\s+as\\s+(\\w+))?$/;this.register=function(e,n){at(e,\"controller\"),y(e)?f(t,e):t[e]=n},this.allowGlobals=function(){e=!0},this.$get=[\"$injector\",\"$window\",function(o,a){function s(t,e,n,i){if(!t||!y(t.$scope))throw r(\"$controller\")(\"noscp\",\"Cannot export controller '{0}' as '{1}'! No $scope object provided via ` + \"`\" + `locals` + \"`\" + `.\",i,e);t.$scope[e]=n}return function(r,u,c,l){var h,$,p,d;if(c=c===!0,l&&w(l)&&(d=l),w(r)){if($=r.match(i),!$)throw Kr(\"ctrlfmt\",\"Badly formed controller string '{0}'. Must match ` + \"`\" + `__name__ as __id__` + \"`\" + ` or ` + \"`\" + `__name__` + \"`\" + `.\",r);p=$[1],d=d||$[3],r=t.hasOwnProperty(p)?t[p]:st(u.$scope,p,!0)||(e?st(a,p,!0):n),ot(r,p,!0)}if(c){var v=(hr(r)?r[r.length-1]:r).prototype;return h=Object.create(v||null),d&&s(u,d,h,p||r.name),f(function(){return o.invoke(r,h,u,p),h},{instance:h,identifier:d})}return h=o.instantiate(r,u,p),d&&s(u,d,h,p||r.name),h}}]}function ne(){this.$get=[\"$window\",function(t){return er(t.document)}]}function re(){this.$get=[\"$log\",function(t){return function(e,n){t.error.apply(t,arguments)}}]}function ie(t,e){if(w(t)){var n=t.replace(ni,\"\").trim();if(n){var r=e(\"Content-Type\");(r&&0===r.indexOf(Xr)||oe(n))&&(t=L(n))}}return t}function oe(t){var e=t.match(ti);return e&&ei[e[0]].test(t)}function ae(t){var e,n,r,i=ct();return t?(o(t.split(\"\\n\"),function(t){r=t.indexOf(\":\"),e=Jn($r(t.substr(0,r))),n=$r(t.substr(r+1)),e&&(i[e]=i[e]?i[e]+\", \"+n:n)}),i):i}function se(t){var e=y(t)?t:n;return function(n){if(e||(e=ae(t)),n){var r=e[Jn(n)];return void 0===r&&(r=null),r}return e}}function ue(t,e,n,r){return S(r)?r(t,e,n):(o(r,function(r){t=r(t,e,n)}),t)}function ce(t){return t>=200&&300>t}function le(){var t=this.defaults={transformResponse:[ie],transformRequest:[function(t){return!y(t)||k(t)||T(t)||O(t)?t:B(t)}],headers:{common:{Accept:\"application/json, text/plain, */*\"},post:_(Qr),put:_(Qr),patch:_(Qr)},xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\"},e=!1;this.useApplyAsync=function(t){return g(t)?(e=!!t,this):e};var i=this.interceptors=[];this.$get=[\"$httpBackend\",\"$browser\",\"$cacheFactory\",\"$rootScope\",\"$q\",\"$injector\",function(a,u,c,l,h,$){function p(e){function i(t){var e=f({},t);return t.data?e.data=ue(t.data,t.headers,t.status,u.transformResponse):e.data=t.data,ce(t.status)?e:h.reject(e)}function a(t){var e,n={};return o(t,function(t,r){S(t)?(e=t(),null!=e&&(n[r]=e)):n[r]=t}),n}function s(e){var n,r,i,o=t.headers,s=f({},e.headers);o=f({},o.common,o[Jn(e.method)]);t:for(n in o){r=Jn(n);for(i in s)if(Jn(i)===r)continue t;s[n]=o[n]}return a(s)}if(!cr.isObject(e))throw r(\"$http\")(\"badreq\",\"Http request configuration must be an object.  Received: {0}\",e);var u=f({method:\"get\",transformRequest:t.transformRequest,transformResponse:t.transformResponse},e);u.headers=s(e),u.method=Kn(u.method);var c=function(e){var r=e.headers,a=ue(e.data,se(r),n,e.transformRequest);return m(a)&&o(r,function(t,e){\"content-type\"===Jn(e)&&delete r[e]}),m(e.withCredentials)&&!m(t.withCredentials)&&(e.withCredentials=t.withCredentials),b(e,a).then(i,i)},l=[c,n],$=h.when(u);for(o(E,function(t){(t.request||t.requestError)&&l.unshift(t.request,t.requestError),(t.response||t.responseError)&&l.push(t.response,t.responseError)});l.length;){var p=l.shift(),d=l.shift();$=$.then(p,d)}return $.success=function(t){return $.then(function(e){t(e.data,e.status,e.headers,u)}),$},$.error=function(t){return $.then(null,function(e){t(e.data,e.status,e.headers,u)}),$},$}function d(t){o(arguments,function(t){p[t]=function(e,n){return p(f(n||{},{method:t,url:e}))}})}function v(t){o(arguments,function(t){p[t]=function(e,n,r){return p(f(r||{},{method:t,url:e,data:n}))}})}function b(r,i){function o(t,n,r,i){function o(){s(n,t,r,i)}$&&(ce(t)?$.put(x,[t,n,ae(r),i]):$.remove(x)),e?l.$applyAsync(o):(o(),l.$$phase||l.$apply())}function s(t,e,n,i){e=Math.max(e,0),(ce(e)?v.resolve:v.reject)({data:t,status:e,headers:se(n),config:r,statusText:i})}function c(t){s(t.data,t.status,_(t.headers()),t.statusText)}function f(){var t=p.pendingRequests.indexOf(r);-1!==t&&p.pendingRequests.splice(t,1)}var $,d,v=h.defer(),w=v.promise,b=r.headers,x=C(r.url,r.params);if(p.pendingRequests.push(r),w.then(f,f),!r.cache&&!t.cache||r.cache===!1||\"GET\"!==r.method&&\"JSONP\"!==r.method||($=y(r.cache)?r.cache:y(t.cache)?t.cache:A),$&&(d=$.get(x),g(d)?N(d)?d.then(c,c):hr(d)?s(d[1],d[0],_(d[2]),d[3]):s(d,200,{},\"OK\"):$.put(x,w)),m(d)){var S=on(r.url)?u.cookies()[r.xsrfCookieName||t.xsrfCookieName]:n;S&&(b[r.xsrfHeaderName||t.xsrfHeaderName]=S),a(r.method,x,i,o,b,r.timeout,r.withCredentials,r.responseType)}return w}function C(t,e){if(!e)return t;var n=[];return s(e,function(t,e){null===t||m(t)||(hr(t)||(t=[t]),o(t,function(t){y(t)&&(t=x(t)?t.toISOString():B(t)),n.push(Z(e)+\"=\"+Z(t))}))}),n.length>0&&(t+=(-1==t.indexOf(\"?\")?\"?\":\"&\")+n.join(\"&\")),t}var A=c(\"$http\"),E=[];return o(i,function(t){E.unshift(w(t)?$.get(t):$.invoke(t))}),p.pendingRequests=[],d(\"get\",\"delete\",\"head\",\"jsonp\"),v(\"post\",\"put\",\"patch\"),p.defaults=t,p}]}function fe(){return new t.XMLHttpRequest}function he(){this.$get=[\"$browser\",\"$window\",\"$document\",function(t,e,n){return $e(t,fe,t.defer,e.angular.callbacks,n[0])}]}function $e(t,e,r,i,a){function s(t,e,n){var r=a.createElement(\"script\"),o=null;return r.type=\"text/javascript\",r.src=t,r.async=!0,o=function(t){Or(r,\"load\",o),Or(r,\"error\",o),a.body.removeChild(r),r=null;var s=-1,u=\"unknown\";t&&(\"load\"!==t.type||i[e].called||(t={type:\"error\"}),u=t.type,s=\"error\"===t.type?404:200),n&&n(s,u)},kr(r,\"load\",o),kr(r,\"error\",o),a.body.appendChild(r),o}return function(a,u,c,l,f,h,$,d){function v(){w&&w(),b&&b.abort()}function m(e,i,o,a,s){C!==n&&r.cancel(C),w=b=null,e(i,o,a,s),t.$$completeOutstandingRequest(p)}if(t.$$incOutstandingRequestCount(),u=u||t.url(),\"jsonp\"==Jn(a)){var y=\"_\"+(i.counter++).toString(36);i[y]=function(t){i[y].data=t,i[y].called=!0};var w=s(u.replace(\"JSON_CALLBACK\",\"angular.callbacks.\"+y),y,function(t,e){m(l,t,i[y].data,\"\",e),i[y]=p})}else{var b=e();b.open(a,u,!0),o(f,function(t,e){g(t)&&b.setRequestHeader(e,t)}),b.onload=function(){var t=b.statusText||\"\",e=\"response\"in b?b.response:b.responseText,n=1223===b.status?204:b.status;0===n&&(n=e?200:\"file\"==rn(u).protocol?404:0),m(l,n,e,b.getAllResponseHeaders(),t)};var x=function(){m(l,-1,null,null,\"\")};if(b.onerror=x,b.onabort=x,$&&(b.withCredentials=!0),d)try{b.responseType=d}catch(S){if(\"json\"!==d)throw S}b.send(c||null)}if(h>0)var C=r(v,h);else N(h)&&h.then(v)}}function pe(){var t=\"{{\",e=\"}}\";this.startSymbol=function(e){return e?(t=e,this):t},this.endSymbol=function(t){return t?(e=t,this):e},this.$get=[\"$parse\",\"$exceptionHandler\",\"$sce\",function(n,r,i){function o(t){return\"\\\\\\\\\\\\\"+t}function a(o,a,h,$){function p(n){return n.replace(c,t).replace(l,e)}function d(t){try{return t=T(t),$&&!g(t)?t:M(t)}catch(e){var n=ri(\"interr\",\"Can't interpolate: {0}\\n{1}\",o,e.toString());r(n)}}$=!!$;for(var v,y,w,b=0,x=[],C=[],A=o.length,E=[],k=[];A>b;){if(-1==(v=o.indexOf(t,b))||-1==(y=o.indexOf(e,v+s))){b!==A&&E.push(p(o.substring(b)));break}b!==v&&E.push(p(o.substring(b,v))),w=o.substring(v+s,y),x.push(w),C.push(n(w,d)),b=y+u,k.push(E.length),E.push(\"\")}if(h&&E.length>1)throw ri(\"noconcat\",\"Error while interpolating: {0}\\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce\",o);if(!a||x.length){var O=function(t){for(var e=0,n=x.length;n>e;e++){if($&&m(t[e]))return;E[k[e]]=t[e]}return E.join(\"\")},T=function(t){return h?i.getTrusted(h,t):i.valueOf(t)},M=function(t){if(null==t)return\"\";switch(typeof t){case\"string\":break;case\"number\":t=\"\"+t;break;default:t=B(t)}return t};return f(function(t){var e=0,n=x.length,i=new Array(n);try{for(;n>e;e++)i[e]=C[e](t);return O(i)}catch(a){var s=ri(\"interr\",\"Can't interpolate: {0}\\n{1}\",o,a.toString());r(s)}},{exp:o,expressions:x,$$watchDelegate:function(t,e,n){var r;return t.$watchGroup(C,function(n,i){var o=O(n);S(e)&&e.call(this,o,n!==i?r:o,t),r=o},n)}})}}var s=t.length,u=e.length,c=new RegExp(t.replace(/./g,o),\"g\"),l=new RegExp(e.replace(/./g,o),\"g\");return a.startSymbol=function(){return t},a.endSymbol=function(){return e},a}]}function de(){this.$get=[\"$rootScope\",\"$window\",\"$q\",\"$$q\",function(t,e,n,r){function i(i,a,s,u){var c=e.setInterval,l=e.clearInterval,f=0,h=g(u)&&!u,$=(h?r:n).defer(),p=$.promise;return s=g(s)?s:0,p.then(null,null,i),p.$$intervalId=c(function(){$.notify(f++),s>0&&f>=s&&($.resolve(f),l(p.$$intervalId),delete o[p.$$intervalId]),h||t.$apply()},a),o[p.$$intervalId]=$,p}var o={};return i.cancel=function(t){return t&&t.$$intervalId in o?(o[t.$$intervalId].reject(\"canceled\"),e.clearInterval(t.$$intervalId),delete o[t.$$intervalId],!0):!1},i}]}function ve(){this.$get=function(){return{id:\"en-us\",NUMBER_FORMATS:{DECIMAL_SEP:\".\",GROUP_SEP:\",\",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:\"\",posSuf:\"\",negPre:\"-\",negSuf:\"\",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:\"¤\",posSuf:\"\",negPre:\"(¤\",negSuf:\")\",gSize:3,lgSize:3}],CURRENCY_SYM:\"$\"},DATETIME_FORMATS:{MONTH:\"January,February,March,April,May,June,July,August,September,October,November,December\".split(\",\"),SHORTMONTH:\"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\".split(\",\"),DAY:\"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\".split(\",\"),SHORTDAY:\"Sun,Mon,Tue,Wed,Thu,Fri,Sat\".split(\",\"),AMPMS:[\"AM\",\"PM\"],medium:\"MMM d, y h:mm:ss a\",\"short\":\"M/d/yy h:mm a\",fullDate:\"EEEE, MMMM d, y\",longDate:\"MMMM d, y\",mediumDate:\"MMM d, y\",shortDate:\"M/d/yy\",mediumTime:\"h:mm:ss a\",shortTime:\"h:mm a\",ERANAMES:[\"Before Christ\",\"Anno Domini\"],ERAS:[\"BC\",\"AD\"]},pluralCat:function(t){return 1===t?\"one\":\"other\"}}}}function me(t){for(var e=t.split(\"/\"),n=e.length;n--;)e[n]=J(e[n]);return e.join(\"/\")}function ge(t,e){var n=rn(t);e.$$protocol=n.protocol,e.$$host=n.hostname,e.$$port=h(n.port)||oi[n.protocol]||null}function ye(t,e){var n=\"/\"!==t.charAt(0);n&&(t=\"/\"+t);var r=rn(t);e.$$path=decodeURIComponent(n&&\"/\"===r.pathname.charAt(0)?r.pathname.substring(1):r.pathname),e.$$search=W(r.search),e.$$hash=decodeURIComponent(r.hash),e.$$path&&\"/\"!=e.$$path.charAt(0)&&(e.$$path=\"/\"+e.$$path)}function we(t,e){return 0===e.indexOf(t)?e.substr(t.length):void 0}function be(t){var e=t.indexOf(\"#\");return-1==e?t:t.substr(0,e)}function xe(t){return t.replace(/(#.+)|#$/,\"$1\")}function Se(t){return t.substr(0,be(t).lastIndexOf(\"/\")+1)}function Ce(t){return t.substring(0,t.indexOf(\"/\",t.indexOf(\"//\")+2))}function Ae(t,e){this.$$html5=!0,e=e||\"\";var r=Se(t);ge(t,this),this.$$parse=function(t){var e=we(r,t);if(!w(e))throw ai(\"ipthprfx\",'Invalid url \"{0}\", missing path prefix \"{1}\".',t,r);ye(e,this),this.$$path||(this.$$path=\"/\"),this.$$compose()},this.$$compose=function(){var t=Y(this.$$search),e=this.$$hash?\"#\"+J(this.$$hash):\"\";this.$$url=me(this.$$path)+(t?\"?\"+t:\"\")+e,this.$$absUrl=r+this.$$url.substr(1)},this.$$parseLinkUrl=function(i,o){if(o&&\"#\"===o[0])return this.hash(o.slice(1)),!0;var a,s,u;return(a=we(t,i))!==n?(s=a,u=(a=we(e,a))!==n?r+(we(\"/\",a)||a):t+s):(a=we(r,i))!==n?u=r+a:r==i+\"/\"&&(u=r),u&&this.$$parse(u),!!u}}function Ee(t,e){var n=Se(t);ge(t,this),this.$$parse=function(r){function i(t,e,n){var r,i=/^\\/[A-Z]:(\\/.*)/;return 0===e.indexOf(n)&&(e=e.replace(n,\"\")),i.exec(e)?t:(r=i.exec(t),r?r[1]:t)}var o,a=we(t,r)||we(n,r);\"#\"===a.charAt(0)?(o=we(e,a),m(o)&&(o=a)):o=this.$$html5?a:\"\",ye(o,this),this.$$path=i(this.$$path,o,t),this.$$compose()},this.$$compose=function(){var n=Y(this.$$search),r=this.$$hash?\"#\"+J(this.$$hash):\"\";this.$$url=me(this.$$path)+(n?\"?\"+n:\"\")+r,this.$$absUrl=t+(this.$$url?e+this.$$url:\"\")},this.$$parseLinkUrl=function(e,n){return be(t)==be(e)?(this.$$parse(e),!0):!1}}function ke(t,e){this.$$html5=!0,Ee.apply(this,arguments);var n=Se(t);this.$$parseLinkUrl=function(r,i){if(i&&\"#\"===i[0])return this.hash(i.slice(1)),!0;var o,a;return t==be(r)?o=r:(a=we(n,r))?o=t+e+a:n===r+\"/\"&&(o=n),o&&this.$$parse(o),!!o},this.$$compose=function(){var n=Y(this.$$search),r=this.$$hash?\"#\"+J(this.$$hash):\"\";this.$$url=me(this.$$path)+(n?\"?\"+n:\"\")+r,this.$$absUrl=t+e+this.$$url}}function Oe(t){return function(){return this[t]}}function Te(t,e){return function(n){return m(n)?this[t]:(this[t]=e(n),this.$$compose(),this)}}function Me(){var t=\"\",e={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(e){return g(e)?(t=e,this):t},this.html5Mode=function(t){return M(t)?(e.enabled=t,this):y(t)?(M(t.enabled)&&(e.enabled=t.enabled),M(t.requireBase)&&(e.requireBase=t.requireBase),M(t.rewriteLinks)&&(e.rewriteLinks=t.rewriteLinks),this):e},this.$get=[\"$rootScope\",\"$browser\",\"$sniffer\",\"$rootElement\",\"$window\",function(n,r,i,o,a){function s(t,e,n){var i=c.url(),o=c.$$state;try{r.url(t,e,n),c.$$state=r.state()}catch(a){throw c.url(i),c.$$state=o,a}}function u(t,e){n.$broadcast(\"$locationChangeSuccess\",c.absUrl(),t,c.$$state,e)}var c,l,f,h=r.baseHref(),$=r.url();if(e.enabled){if(!h&&e.requireBase)throw ai(\"nobase\",\"$location in HTML5 mode requires a <base> tag to be present!\");f=Ce($)+(h||\"/\"),l=i.history?Ae:ke}else f=be($),l=Ee;c=new l(f,\"#\"+t),c.$$parseLinkUrl($,$),c.$$state=r.state();var p=/^\\s*(javascript|mailto):/i;o.on(\"click\",function(t){if(e.rewriteLinks&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey&&2!=t.which&&2!=t.button){for(var i=er(t.target);\"a\"!==j(i[0]);)if(i[0]===o[0]||!(i=i.parent())[0])return;var s=i.prop(\"href\"),u=i.attr(\"href\")||i.attr(\"xlink:href\");y(s)&&\"[object SVGAnimatedString]\"===s.toString()&&(s=rn(s.animVal).href),p.test(s)||!s||i.attr(\"target\")||t.isDefaultPrevented()||c.$$parseLinkUrl(s,u)&&(t.preventDefault(),c.absUrl()!=r.url()&&(n.$apply(),a.angular[\"ff-684208-preventDefault\"]=!0))}}),xe(c.absUrl())!=xe($)&&r.url(c.absUrl(),!0);var d=!0;return r.onUrlChange(function(t,e){n.$evalAsync(function(){var r,i=c.absUrl(),o=c.$$state;c.$$parse(t),c.$$state=e,r=n.$broadcast(\"$locationChangeStart\",t,i,e,o).defaultPrevented,c.absUrl()===t&&(r?(c.$$parse(i),c.$$state=o,s(i,!1,o)):(d=!1,u(i,o)))}),n.$$phase||n.$digest()}),n.$watch(function(){var t=xe(r.url()),e=xe(c.absUrl()),o=r.state(),a=c.$$replace,l=t!==e||c.$$html5&&i.history&&o!==c.$$state;(d||l)&&(d=!1,n.$evalAsync(function(){var e=c.absUrl(),r=n.$broadcast(\"$locationChangeStart\",e,t,c.$$state,o).defaultPrevented;c.absUrl()===e&&(r?(c.$$parse(t),c.$$state=o):(l&&s(e,a,o===c.$$state?null:c.$$state),u(t,o)))})),c.$$replace=!1}),c}]}function Ne(){var t=!0,e=this;this.debugEnabled=function(e){return g(e)?(t=e,this):t},this.$get=[\"$window\",function(n){function r(t){return t instanceof Error&&(t.stack?t=t.message&&-1===t.stack.indexOf(t.message)?\"Error: \"+t.message+\"\\n\"+t.stack:t.stack:t.sourceURL&&(t=t.message+\"\\n\"+t.sourceURL+\":\"+t.line)),t}function i(t){var e=n.console||{},i=e[t]||e.log||p,a=!1;try{a=!!i.apply}catch(s){}return a?function(){var t=[];return o(arguments,function(e){t.push(r(e))}),i.apply(e,t)}:function(t,e){i(t,null==e?\"\":e)}}return{log:i(\"log\"),info:i(\"info\"),warn:i(\"warn\"),error:i(\"error\"),debug:function(){var n=i(\"debug\");return function(){t&&n.apply(e,arguments)}}()}}]}function Ve(t,e){if(\"__defineGetter__\"===t||\"__defineSetter__\"===t||\"__lookupGetter__\"===t||\"__lookupSetter__\"===t||\"__proto__\"===t)throw ui(\"isecfld\",\"Attempting to access a disallowed field in Angular expressions! Expression: {0}\",e);return t}function De(t,e){if(t){if(t.constructor===t)throw ui(\"isecfn\",\"Referencing Function in Angular expressions is disallowed! Expression: {0}\",e);if(t.window===t)throw ui(\"isecwindow\",\"Referencing the Window in Angular expressions is disallowed! Expression: {0}\",e);if(t.children&&(t.nodeName||t.prop&&t.attr&&t.find))throw ui(\"isecdom\",\"Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}\",e);if(t===Object)throw ui(\"isecobj\",\"Referencing Object in Angular expressions is disallowed! Expression: {0}\",e)}return t}function je(t,e){if(t){if(t.constructor===t)throw ui(\"isecfn\",\"Referencing Function in Angular expressions is disallowed! Expression: {0}\",e);if(t===ci||t===li||t===fi)throw ui(\"isecff\",\"Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}\",e)}}function Re(t){return t.constant}function Pe(t,e,n,r,i){De(t,i),De(e,i);for(var o,a=n.split(\".\"),s=0;a.length>1;s++){o=Ve(a.shift(),i);var u=0===s&&e&&e[o]||t[o];u||(u={},t[o]=u),t=De(u,i)}return o=Ve(a.shift(),i),De(t[o],i),t[o]=r,r}function _e(t){return\"constructor\"==t}function Ie(t,e,r,i,o,a,s){Ve(t,a),Ve(e,a),Ve(r,a),Ve(i,a),Ve(o,a);var u=function(t){return De(t,a)},c=s||_e(t)?u:d,l=s||_e(e)?u:d,f=s||_e(r)?u:d,h=s||_e(i)?u:d,$=s||_e(o)?u:d;return function(a,s){var u=s&&s.hasOwnProperty(t)?s:a;return null==u?u:(u=c(u[t]),e?null==u?n:(u=l(u[e]),r?null==u?n:(u=f(u[r]),i?null==u?n:(u=h(u[i]),o?null==u?n:u=$(u[o]):u):u):u):u)}}function qe(t,e){return function(n,r){return t(n,r,De,e)}}function Ue(t,e,r){var i=e.expensiveChecks,a=i?gi:mi,s=a[t];if(s)return s;var u=t.split(\".\"),c=u.length;if(e.csp)s=6>c?Ie(u[0],u[1],u[2],u[3],u[4],r,i):function(t,e){var o,a=0;do o=Ie(u[a++],u[a++],u[a++],u[a++],u[a++],r,i)(t,e),e=n,t=o;while(c>a);return o};else{var l=\"\";i&&(l+=\"s = eso(s, fe);\\nl = eso(l, fe);\\n\");var f=i;o(u,function(t,e){Ve(t,r);var n=(e?\"s\":'((l&&l.hasOwnProperty(\"'+t+'\"))?l:s)')+\".\"+t;(i||_e(t))&&(n=\"eso(\"+n+\", fe)\",f=!0),l+=\"if(s == null) return undefined;\\ns=\"+n+\";\\n\"}),l+=\"return s;\";var h=new Function(\"s\",\"l\",\"eso\",\"fe\",l);h.toString=v(l),f&&(h=qe(h,r)),s=h}return s.sharedGetter=!0,s.assign=function(e,n,r){return Pe(e,r,t,n,t)},a[t]=s,s}function Fe(t){return S(t.valueOf)?t.valueOf():yi.call(t)}function He(){var t=ct(),e=ct();this.$get=[\"$filter\",\"$sniffer\",function(n,r){function i(t){var e=t;return t.sharedGetter&&(e=function(e,n){return t(e,n)},e.literal=t.literal,e.constant=t.constant,e.assign=t.assign),e}function a(t,e){for(var n=0,r=t.length;r>n;n++){var i=t[n];i.constant||(i.inputs?a(i.inputs,e):-1===e.indexOf(i)&&e.push(i))}return e}function s(t,e){return null==t||null==e?t===e:\"object\"==typeof t&&(t=Fe(t),\"object\"==typeof t)?!1:t===e||t!==t&&e!==e}function u(t,e,n,r){var i,o=r.$$inputs||(r.$$inputs=a(r.inputs,[]));if(1===o.length){var u=s;return o=o[0],t.$watch(function(t){var e=o(t);return s(e,u)||(i=r(t),u=e&&Fe(e)),i},e,n)}for(var c=[],l=0,f=o.length;f>l;l++)c[l]=s;return t.$watch(function(t){for(var e=!1,n=0,a=o.length;a>n;n++){var u=o[n](t);(e||(e=!s(u,c[n])))&&(c[n]=u&&Fe(u))}return e&&(i=r(t)),i},e,n)}function c(t,e,n,r){var i,o;return i=t.$watch(function(t){return r(t)},function(t,n,r){o=t,S(e)&&e.apply(this,arguments),g(t)&&r.$$postDigest(function(){g(o)&&i()})},n)}function l(t,e,n,r){function i(t){var e=!0;return o(t,function(t){g(t)||(e=!1)}),e}var a,s;return a=t.$watch(function(t){return r(t)},function(t,n,r){s=t,S(e)&&e.call(this,t,n,r),i(t)&&r.$$postDigest(function(){i(s)&&a()})},n)}function f(t,e,n,r){var i;return i=t.$watch(function(t){return r(t)},function(t,n,r){S(e)&&e.apply(this,arguments),i()},n)}function h(t,e){if(!e)return t;var n=t.$$watchDelegate,r=n!==l&&n!==c,i=r?function(n,r){var i=t(n,r);return e(i,n,r)}:function(n,r){var i=t(n,r),o=e(i,n,r);return g(i)?o:i};return t.$$watchDelegate&&t.$$watchDelegate!==u?i.$$watchDelegate=t.$$watchDelegate:e.$stateful||(i.$$watchDelegate=u,i.inputs=[t]),i}var $={csp:r.csp,expensiveChecks:!1},d={csp:r.csp,expensiveChecks:!0};return function(r,o,a){var s,v,m;switch(typeof r){case\"string\":m=r=r.trim();var g=a?e:t;if(s=g[m],!s){\":\"===r.charAt(0)&&\":\"===r.charAt(1)&&(v=!0,r=r.substring(2));var y=a?d:$,w=new di(y),b=new vi(w,n,y);s=b.parse(r),s.constant?s.$$watchDelegate=f:v?(s=i(s),s.$$watchDelegate=s.literal?l:c):s.inputs&&(s.$$watchDelegate=u),g[m]=s}return h(s,o);case\"function\":return h(r,o);default:return h(p,o)}}}]}function Be(){this.$get=[\"$rootScope\",\"$exceptionHandler\",function(t,e){return ze(function(e){t.$evalAsync(e)},e)}]}function Le(){this.$get=[\"$browser\",\"$exceptionHandler\",function(t,e){return ze(function(e){t.defer(e)},e)}]}function ze(t,e){function i(t,e,n){function r(e){return function(n){i||(i=!0,e.call(t,n))}}var i=!1;return[r(e),r(n)]}function a(){this.$$state={status:0}}function s(t,e){return function(n){e.call(t,n)}}function u(t){var r,i,o;o=t.pending,t.processScheduled=!1,t.pending=n;for(var a=0,s=o.length;s>a;++a){i=o[a][0],r=o[a][t.status];try{S(r)?i.resolve(r(t.value)):1===t.status?i.resolve(t.value):i.reject(t.value)}catch(u){i.reject(u),e(u)}}}function c(e){!e.processScheduled&&e.pending&&(e.processScheduled=!0,t(function(){u(e)}))}function l(){this.promise=new a,this.resolve=s(this,this.resolve),this.reject=s(this,this.reject),this.notify=s(this,this.notify)}function f(t){var e=new l,n=0,r=hr(t)?[]:{};return o(t,function(t,i){n++,m(t).then(function(t){r.hasOwnProperty(i)||(r[i]=t,--n||e.resolve(r))},function(t){r.hasOwnProperty(i)||e.reject(t)})}),0===n&&e.resolve(r),e.promise}var h=r(\"$q\",TypeError),$=function(){return new l};a.prototype={then:function(t,e,n){var r=new l;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([r,t,e,n]),this.$$state.status>0&&c(this.$$state),r.promise},\"catch\":function(t){return this.then(null,t)},\"finally\":function(t,e){return this.then(function(e){return v(e,!0,t)},function(e){return v(e,!1,t)},e)}},l.prototype={resolve:function(t){this.promise.$$state.status||(t===this.promise?this.$$reject(h(\"qcycle\",\"Expected promise to be resolved with value other than itself '{0}'\",t)):this.$$resolve(t))},$$resolve:function(t){var n,r;r=i(this,this.$$resolve,this.$$reject);try{(y(t)||S(t))&&(n=t&&t.then),S(n)?(this.promise.$$state.status=-1,n.call(t,r[0],r[1],this.notify)):(this.promise.$$state.value=t,this.promise.$$state.status=1,c(this.promise.$$state))}catch(o){r[1](o),e(o)}},reject:function(t){this.promise.$$state.status||this.$$reject(t)},$$reject:function(t){this.promise.$$state.value=t,this.promise.$$state.status=2,c(this.promise.$$state)},notify:function(n){var r=this.promise.$$state.pending;this.promise.$$state.status<=0&&r&&r.length&&t(function(){for(var t,i,o=0,a=r.length;a>o;o++){i=r[o][0],t=r[o][3];try{i.notify(S(t)?t(n):n)}catch(s){e(s)}}})}};var p=function(t){var e=new l;return e.reject(t),e.promise},d=function(t,e){var n=new l;return e?n.resolve(t):n.reject(t),n.promise},v=function(t,e,n){var r=null;try{S(n)&&(r=n())}catch(i){return d(i,!1)}return N(r)?r.then(function(){return d(t,e)},function(t){return d(t,!1)}):d(t,e)},m=function(t,e,n,r){var i=new l;return i.resolve(t),i.promise.then(e,n,r)},g=function w(t){function e(t){r.resolve(t)}function n(t){r.reject(t)}if(!S(t))throw h(\"norslvr\",\"Expected resolverFn, got '{0}'\",t);if(!(this instanceof w))return new w(t);var r=new l;return t(e,n),r.promise};return g.defer=$,g.reject=p,g.when=m,g.all=f,g}function Ge(){this.$get=[\"$window\",\"$timeout\",function(t,e){var n=t.requestAnimationFrame||t.webkitRequestAnimationFrame,r=t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.webkitCancelRequestAnimationFrame,i=!!n,o=i?function(t){var e=n(t);return function(){r(e)}}:function(t){var n=e(t,16.66,!1);return function(){e.cancel(n)}};return o.supported=i,o}]}function We(){function t(t){function e(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=c(),this.$$ChildScope=null}return e.prototype=t,e}var e=10,n=r(\"$rootScope\"),a=null,s=null;this.digestTtl=function(t){return arguments.length&&(e=t),e},this.$get=[\"$injector\",\"$exceptionHandler\",\"$parse\",\"$browser\",function(r,u,l,f){function h(t){t.currentScope.$$destroyed=!0}function $(){this.$id=c(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings=null}function d(t){if(C.$$phase)throw n(\"inprog\",\"{0} already in progress\",C.$$phase);C.$$phase=t}function v(){C.$$phase=null}function g(t,e,n){do t.$$listenerCount[n]-=e,0===t.$$listenerCount[n]&&delete t.$$listenerCount[n];while(t=t.$parent)}function w(){}function b(){for(;k.length;)try{k.shift()()}catch(t){u(t)}s=null}function x(){null===s&&(s=f.defer(function(){C.$apply(b)}))}$.prototype={constructor:$,$new:function(e,n){var r;return n=n||this,e?(r=new $,r.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=t(this)),r=new this.$$ChildScope),r.$parent=n,r.$$prevSibling=n.$$childTail,n.$$childHead?(n.$$childTail.$$nextSibling=r,n.$$childTail=r):n.$$childHead=n.$$childTail=r,(e||n!=this)&&r.$on(\"$destroy\",h),r},$watch:function(t,e,n){var r=l(t);if(r.$$watchDelegate)return r.$$watchDelegate(this,e,n,r);var i=this,o=i.$$watchers,s={fn:e,last:w,get:r,exp:t,eq:!!n};return a=null,S(e)||(s.fn=p),o||(o=i.$$watchers=[]),o.unshift(s),function(){R(o,s),a=null}},$watchGroup:function(t,e){function n(){u=!1,c?(c=!1,e(i,i,s)):e(i,r,s)}var r=new Array(t.length),i=new Array(t.length),a=[],s=this,u=!1,c=!0;if(!t.length){var l=!0;return s.$evalAsync(function(){l&&e(i,i,s)}),function(){l=!1}}return 1===t.length?this.$watch(t[0],function(t,n,o){i[0]=t,r[0]=n,e(i,t===n?i:r,o)}):(o(t,function(t,e){var o=s.$watch(t,function(t,o){i[e]=t,r[e]=o,u||(u=!0,s.$evalAsync(n))});a.push(o)}),function(){for(;a.length;)a.shift()()})},$watchCollection:function(t,e){function n(t){o=t;var e,n,r,s,u;if(!m(o)){if(y(o))if(i(o)){a!==$&&(a=$,v=a.length=0,f++),e=o.length,v!==e&&(f++,a.length=v=e);for(var c=0;e>c;c++)u=a[c],s=o[c],r=u!==u&&s!==s,r||u===s||(f++,a[c]=s)}else{a!==p&&(a=p={},v=0,f++),e=0;for(n in o)o.hasOwnProperty(n)&&(e++,s=o[n],u=a[n],n in a?(r=u!==u&&s!==s,r||u===s||(f++,a[n]=s)):(v++,a[n]=s,f++));if(v>e){f++;for(n in a)o.hasOwnProperty(n)||(v--,delete a[n])}}else a!==o&&(a=o,f++);return f}}function r(){if(d?(d=!1,e(o,o,u)):e(o,s,u),c)if(y(o))if(i(o)){s=new Array(o.length);for(var t=0;t<o.length;t++)s[t]=o[t]}else{s={};for(var n in o)Zn.call(o,n)&&(s[n]=o[n])}else s=o}n.$stateful=!0;var o,a,s,u=this,c=e.length>1,f=0,h=l(t,n),$=[],p={},d=!0,v=0;return this.$watch(h,r)},$digest:function(){var t,r,i,o,c,l,h,$,p,m,g=e,y=this,x=[];d(\"$digest\"),f.$$checkUrlChange(),this===C&&null!==s&&(f.defer.cancel(s),\nb()),a=null;do{for(l=!1,$=y;A.length;){try{m=A.shift(),m.scope.$eval(m.expression,m.locals)}catch(k){u(k)}a=null}t:do{if(o=$.$$watchers)for(c=o.length;c--;)try{if(t=o[c])if((r=t.get($))===(i=t.last)||(t.eq?I(r,i):\"number\"==typeof r&&\"number\"==typeof i&&isNaN(r)&&isNaN(i))){if(t===a){l=!1;break t}}else l=!0,a=t,t.last=t.eq?P(r,null):r,t.fn(r,i===w?r:i,$),5>g&&(p=4-g,x[p]||(x[p]=[]),x[p].push({msg:S(t.exp)?\"fn: \"+(t.exp.name||t.exp.toString()):t.exp,newVal:r,oldVal:i}))}catch(k){u(k)}if(!(h=$.$$childHead||$!==y&&$.$$nextSibling))for(;$!==y&&!(h=$.$$nextSibling);)$=$.$parent}while($=h);if((l||A.length)&&!g--)throw v(),n(\"infdig\",\"{0} $digest() iterations reached. Aborting!\\nWatchers fired in the last 5 iterations: {1}\",e,x)}while(l||A.length);for(v();E.length;)try{E.shift()()}catch(k){u(k)}},$destroy:function(){if(!this.$$destroyed){var t=this.$parent;if(this.$broadcast(\"$destroy\"),this.$$destroyed=!0,this!==C){for(var e in this.$$listenerCount)g(this,this.$$listenerCount[e],e);t.$$childHead==this&&(t.$$childHead=this.$$nextSibling),t.$$childTail==this&&(t.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=p,this.$on=this.$watch=this.$watchGroup=function(){return p},this.$$listeners={},this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(t,e){return l(t)(this,e)},$evalAsync:function(t,e){C.$$phase||A.length||f.defer(function(){A.length&&C.$digest()}),A.push({scope:this,expression:t,locals:e})},$$postDigest:function(t){E.push(t)},$apply:function(t){try{return d(\"$apply\"),this.$eval(t)}catch(e){u(e)}finally{v();try{C.$digest()}catch(e){throw u(e),e}}},$applyAsync:function(t){function e(){n.$eval(t)}var n=this;t&&k.push(e),x()},$on:function(t,e){var n=this.$$listeners[t];n||(this.$$listeners[t]=n=[]),n.push(e);var r=this;do r.$$listenerCount[t]||(r.$$listenerCount[t]=0),r.$$listenerCount[t]++;while(r=r.$parent);var i=this;return function(){var r=n.indexOf(e);-1!==r&&(n[r]=null,g(i,1,t))}},$emit:function(t,e){var n,r,i,o=[],a=this,s=!1,c={name:t,targetScope:a,stopPropagation:function(){s=!0},preventDefault:function(){c.defaultPrevented=!0},defaultPrevented:!1},l=q([c],arguments,1);do{for(n=a.$$listeners[t]||o,c.currentScope=a,r=0,i=n.length;i>r;r++)if(n[r])try{n[r].apply(null,l)}catch(f){u(f)}else n.splice(r,1),r--,i--;if(s)return c.currentScope=null,c;a=a.$parent}while(a);return c.currentScope=null,c},$broadcast:function(t,e){var n=this,r=n,i=n,o={name:t,targetScope:n,preventDefault:function(){o.defaultPrevented=!0},defaultPrevented:!1};if(!n.$$listenerCount[t])return o;for(var a,s,c,l=q([o],arguments,1);r=i;){for(o.currentScope=r,a=r.$$listeners[t]||[],s=0,c=a.length;c>s;s++)if(a[s])try{a[s].apply(null,l)}catch(f){u(f)}else a.splice(s,1),s--,c--;if(!(i=r.$$listenerCount[t]&&r.$$childHead||r!==n&&r.$$nextSibling))for(;r!==n&&!(i=r.$$nextSibling);)r=r.$parent}return o.currentScope=null,o}};var C=new $,A=C.$$asyncQueue=[],E=C.$$postDigestQueue=[],k=C.$$applyAsyncQueue=[];return C}]}function Ye(){var t=/^\\s*(https?|ftp|mailto|tel|file):/,e=/^\\s*((https?|ftp|file|blob):|data:image\\/)/;this.aHrefSanitizationWhitelist=function(e){return g(e)?(t=e,this):t},this.imgSrcSanitizationWhitelist=function(t){return g(t)?(e=t,this):e},this.$get=function(){return function(n,r){var i,o=r?e:t;return i=rn(n).href,\"\"===i||i.match(o)?n:\"unsafe:\"+i}}}function Je(t){if(\"self\"===t)return t;if(w(t)){if(t.indexOf(\"***\")>-1)throw wi(\"iwcard\",\"Illegal sequence *** in string matcher.  String: {0}\",t);return t=pr(t).replace(\"\\\\*\\\\*\",\".*\").replace(\"\\\\*\",\"[^:/.?&;]*\"),new RegExp(\"^\"+t+\"$\")}if(C(t))return new RegExp(\"^\"+t.source+\"$\");throw wi(\"imatcher\",'Matchers may only be \"self\", string patterns or RegExp objects')}function Ze(t){var e=[];return g(t)&&o(t,function(t){e.push(Je(t))}),e}function Ke(){this.SCE_CONTEXTS=bi;var t=[\"self\"],e=[];this.resourceUrlWhitelist=function(e){return arguments.length&&(t=Ze(e)),t},this.resourceUrlBlacklist=function(t){return arguments.length&&(e=Ze(t)),e},this.$get=[\"$injector\",function(r){function i(t,e){return\"self\"===t?on(e):!!t.exec(e.href)}function o(n){var r,o,a=rn(n.toString()),s=!1;for(r=0,o=t.length;o>r;r++)if(i(t[r],a)){s=!0;break}if(s)for(r=0,o=e.length;o>r;r++)if(i(e[r],a)){s=!1;break}return s}function a(t){var e=function(t){this.$$unwrapTrustedValue=function(){return t}};return t&&(e.prototype=new t),e.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},e.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},e}function s(t,e){var r=h.hasOwnProperty(t)?h[t]:null;if(!r)throw wi(\"icontext\",\"Attempted to trust a value in invalid context. Context: {0}; Value: {1}\",t,e);if(null===e||e===n||\"\"===e)return e;if(\"string\"!=typeof e)throw wi(\"itype\",\"Attempted to trust a non-string value in a content requiring a string: Context: {0}\",t);return new r(e)}function u(t){return t instanceof f?t.$$unwrapTrustedValue():t}function c(t,e){if(null===e||e===n||\"\"===e)return e;var r=h.hasOwnProperty(t)?h[t]:null;if(r&&e instanceof r)return e.$$unwrapTrustedValue();if(t===bi.RESOURCE_URL){if(o(e))return e;throw wi(\"insecurl\",\"Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}\",e.toString())}if(t===bi.HTML)return l(e);throw wi(\"unsafe\",\"Attempting to use an unsafe value in a safe context.\")}var l=function(t){throw wi(\"unsafe\",\"Attempting to use an unsafe value in a safe context.\")};r.has(\"$sanitize\")&&(l=r.get(\"$sanitize\"));var f=a(),h={};return h[bi.HTML]=a(f),h[bi.CSS]=a(f),h[bi.URL]=a(f),h[bi.JS]=a(f),h[bi.RESOURCE_URL]=a(h[bi.URL]),{trustAs:s,getTrusted:c,valueOf:u}}]}function Xe(){var t=!0;this.enabled=function(e){return arguments.length&&(t=!!e),t},this.$get=[\"$parse\",\"$sceDelegate\",function(e,n){if(t&&8>tr)throw wi(\"iequirks\",\"Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.\");var r=_(bi);r.isEnabled=function(){return t},r.trustAs=n.trustAs,r.getTrusted=n.getTrusted,r.valueOf=n.valueOf,t||(r.trustAs=r.getTrusted=function(t,e){return e},r.valueOf=d),r.parseAs=function(t,n){var i=e(n);return i.literal&&i.constant?i:e(n,function(e){return r.getTrusted(t,e)})};var i=r.parseAs,a=r.getTrusted,s=r.trustAs;return o(bi,function(t,e){var n=Jn(e);r[dt(\"parse_as_\"+n)]=function(e){return i(t,e)},r[dt(\"get_trusted_\"+n)]=function(e){return a(t,e)},r[dt(\"trust_as_\"+n)]=function(e){return s(t,e)}}),r}]}function Qe(){this.$get=[\"$window\",\"$document\",function(t,e){var n,r,i={},o=h((/android (\\d+)/.exec(Jn((t.navigator||{}).userAgent))||[])[1]),a=/Boxee/i.test((t.navigator||{}).userAgent),s=e[0]||{},u=/^(Moz|webkit|ms)(?=[A-Z])/,c=s.body&&s.body.style,l=!1,f=!1;if(c){for(var $ in c)if(r=u.exec($)){n=r[0],n=n.substr(0,1).toUpperCase()+n.substr(1);break}n||(n=\"WebkitOpacity\"in c&&\"webkit\"),l=!!(\"transition\"in c||n+\"Transition\"in c),f=!!(\"animation\"in c||n+\"Animation\"in c),!o||l&&f||(l=w(s.body.style.webkitTransition),f=w(s.body.style.webkitAnimation))}return{history:!(!t.history||!t.history.pushState||4>o||a),hasEvent:function(t){if(\"input\"===t&&11>=tr)return!1;if(m(i[t])){var e=s.createElement(\"div\");i[t]=\"on\"+t in e}return i[t]},csp:dr(),vendorPrefix:n,transitions:l,animations:f,android:o}}]}function tn(){this.$get=[\"$templateCache\",\"$http\",\"$q\",function(t,e,n){function r(i,o){function a(t){if(!o)throw Jr(\"tpload\",\"Failed to load template: {0}\",i);return n.reject(t)}r.totalPendingRequests++;var s=e.defaults&&e.defaults.transformResponse;hr(s)?s=s.filter(function(t){return t!==ie}):s===ie&&(s=null);var u={cache:t,transformResponse:s};return e.get(i,u)[\"finally\"](function(){r.totalPendingRequests--}).then(function(t){return t.data},a)}return r.totalPendingRequests=0,r}]}function en(){this.$get=[\"$rootScope\",\"$browser\",\"$location\",function(t,e,n){var r={};return r.findBindings=function(t,e,n){var r=t.getElementsByClassName(\"ng-binding\"),i=[];return o(r,function(t){var r=cr.element(t).data(\"$binding\");r&&o(r,function(r){if(n){var o=new RegExp(\"(^|\\\\s)\"+pr(e)+\"(\\\\s|\\\\||$)\");o.test(r)&&i.push(t)}else-1!=r.indexOf(e)&&i.push(t)})}),i},r.findModels=function(t,e,n){for(var r=[\"ng-\",\"data-ng-\",\"ng\\\\:\"],i=0;i<r.length;++i){var o=n?\"=\":\"*=\",a=\"[\"+r[i]+\"model\"+o+'\"'+e+'\"]',s=t.querySelectorAll(a);if(s.length)return s}},r.getLocation=function(){return n.url()},r.setLocation=function(e){e!==n.url()&&(n.url(e),t.$digest())},r.whenStable=function(t){e.notifyWhenNoOutstandingRequests(t)},r}]}function nn(){this.$get=[\"$rootScope\",\"$browser\",\"$q\",\"$$q\",\"$exceptionHandler\",function(t,e,n,r,i){function o(o,s,u){var c,l=g(u)&&!u,f=(l?r:n).defer(),h=f.promise;return c=e.defer(function(){try{f.resolve(o())}catch(e){f.reject(e),i(e)}finally{delete a[h.$$timeoutId]}l||t.$apply()},s),h.$$timeoutId=c,a[c]=f,h}var a={};return o.cancel=function(t){return t&&t.$$timeoutId in a?(a[t.$$timeoutId].reject(\"canceled\"),delete a[t.$$timeoutId],e.defer.cancel(t.$$timeoutId)):!1},o}]}function rn(t){var e=t;return tr&&(xi.setAttribute(\"href\",e),e=xi.href),xi.setAttribute(\"href\",e),{href:xi.href,protocol:xi.protocol?xi.protocol.replace(/:$/,\"\"):\"\",host:xi.host,search:xi.search?xi.search.replace(/^\\?/,\"\"):\"\",hash:xi.hash?xi.hash.replace(/^#/,\"\"):\"\",hostname:xi.hostname,port:xi.port,pathname:\"/\"===xi.pathname.charAt(0)?xi.pathname:\"/\"+xi.pathname}}function on(t){var e=w(t)?rn(t):t;return e.protocol===Si.protocol&&e.host===Si.host}function an(){this.$get=v(t)}function sn(t){function e(r,i){if(y(r)){var a={};return o(r,function(t,n){a[n]=e(n,t)}),a}return t.factory(r+n,i)}var n=\"Filter\";this.register=e,this.$get=[\"$injector\",function(t){return function(e){return t.get(e+n)}}],e(\"currency\",fn),e(\"date\",Cn),e(\"filter\",un),e(\"json\",An),e(\"limitTo\",En),e(\"lowercase\",Oi),e(\"number\",hn),e(\"orderBy\",kn),e(\"uppercase\",Ti)}function un(){return function(t,e,n){if(!hr(t))return t;var r,i;switch(typeof e){case\"function\":r=e;break;case\"boolean\":case\"number\":case\"string\":i=!0;case\"object\":r=cn(e,n,i);break;default:return t}return t.filter(r)}}function cn(t,e,n){var r,i=y(t)&&\"$\"in t;return e===!0?e=I:S(e)||(e=function(t,e){return y(t)||y(e)?!1:(t=Jn(\"\"+t),e=Jn(\"\"+e),-1!==t.indexOf(e))}),r=function(r){return i&&!y(r)?ln(r,t.$,e,!1):ln(r,t,e,n)}}function ln(t,e,n,r,i){var o=null!==t?typeof t:\"null\",a=null!==e?typeof e:\"null\";if(\"string\"===a&&\"!\"===e.charAt(0))return!ln(t,e.substring(1),n,r);if(hr(t))return t.some(function(t){return ln(t,e,n,r)});switch(o){case\"object\":var s;if(r){for(s in t)if(\"$\"!==s.charAt(0)&&ln(t[s],e,n,!0))return!0;return i?!1:ln(t,e,n,!1)}if(\"object\"===a){for(s in e){var u=e[s];if(!S(u)&&!m(u)){var c=\"$\"===s,l=c?t:t[s];if(!ln(l,u,n,c,c))return!1}}return!0}return n(t,e);case\"function\":return!1;default:return n(t,e)}}function fn(t){var e=t.NUMBER_FORMATS;return function(t,n,r){return m(n)&&(n=e.CURRENCY_SYM),m(r)&&(r=e.PATTERNS[1].maxFrac),null==t?t:$n(t,e.PATTERNS[1],e.GROUP_SEP,e.DECIMAL_SEP,r).replace(/\\u00A4/g,n)}}function hn(t){var e=t.NUMBER_FORMATS;return function(t,n){return null==t?t:$n(t,e.PATTERNS[0],e.GROUP_SEP,e.DECIMAL_SEP,n)}}function $n(t,e,n,r,i){if(!isFinite(t)||y(t))return\"\";var o=0>t;t=Math.abs(t);var a=t+\"\",s=\"\",u=[],c=!1;if(-1!==a.indexOf(\"e\")){var l=a.match(/([\\d\\.]+)e(-?)(\\d+)/);l&&\"-\"==l[2]&&l[3]>i+1?t=0:(s=a,c=!0)}if(c)i>0&&1>t&&(s=t.toFixed(i),t=parseFloat(s));else{var f=(a.split(Ci)[1]||\"\").length;m(i)&&(i=Math.min(Math.max(e.minFrac,f),e.maxFrac)),t=+(Math.round(+(t.toString()+\"e\"+i)).toString()+\"e\"+-i);var h=(\"\"+t).split(Ci),$=h[0];h=h[1]||\"\";var p,d=0,v=e.lgSize,g=e.gSize;if($.length>=v+g)for(d=$.length-v,p=0;d>p;p++)(d-p)%g===0&&0!==p&&(s+=n),s+=$.charAt(p);for(p=d;p<$.length;p++)($.length-p)%v===0&&0!==p&&(s+=n),s+=$.charAt(p);for(;h.length<i;)h+=\"0\";i&&\"0\"!==i&&(s+=r+h.substr(0,i))}return 0===t&&(o=!1),u.push(o?e.negPre:e.posPre,s,o?e.negSuf:e.posSuf),u.join(\"\")}function pn(t,e,n){var r=\"\";for(0>t&&(r=\"-\",t=-t),t=\"\"+t;t.length<e;)t=\"0\"+t;return n&&(t=t.substr(t.length-e)),r+t}function dn(t,e,n,r){return n=n||0,function(i){var o=i[\"get\"+t]();return(n>0||o>-n)&&(o+=n),0===o&&-12==n&&(o=12),pn(o,e,r)}}function vn(t,e){return function(n,r){var i=n[\"get\"+t](),o=Kn(e?\"SHORT\"+t:t);return r[o][i]}}function mn(t){var e=-1*t.getTimezoneOffset(),n=e>=0?\"+\":\"\";return n+=pn(Math[e>0?\"floor\":\"ceil\"](e/60),2)+pn(Math.abs(e%60),2)}function gn(t){var e=new Date(t,0,1).getDay();return new Date(t,0,(4>=e?5:12)-e)}function yn(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function wn(t){return function(e){var n=gn(e.getFullYear()),r=yn(e),i=+r-+n,o=1+Math.round(i/6048e5);return pn(o,t)}}function bn(t,e){return t.getHours()<12?e.AMPMS[0]:e.AMPMS[1]}function xn(t,e){return t.getFullYear()<=0?e.ERAS[0]:e.ERAS[1]}function Sn(t,e){return t.getFullYear()<=0?e.ERANAMES[0]:e.ERANAMES[1]}function Cn(t){function e(t){var e;if(e=t.match(n)){var r=new Date(0),i=0,o=0,a=e[8]?r.setUTCFullYear:r.setFullYear,s=e[8]?r.setUTCHours:r.setHours;e[9]&&(i=h(e[9]+e[10]),o=h(e[9]+e[11])),a.call(r,h(e[1]),h(e[2])-1,h(e[3]));var u=h(e[4]||0)-i,c=h(e[5]||0)-o,l=h(e[6]||0),f=Math.round(1e3*parseFloat(\"0.\"+(e[7]||0)));return s.call(r,u,c,l,f),r}return t}var n=/^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;return function(n,r,i){var a,s,u=\"\",c=[];if(r=r||\"mediumDate\",r=t.DATETIME_FORMATS[r]||r,w(n)&&(n=ki.test(n)?h(n):e(n)),b(n)&&(n=new Date(n)),!x(n))return n;for(;r;)s=Ei.exec(r),s?(c=q(c,s,1),r=c.pop()):(c.push(r),r=null);return i&&\"UTC\"===i&&(n=new Date(n.getTime()),n.setMinutes(n.getMinutes()+n.getTimezoneOffset())),o(c,function(e){a=Ai[e],u+=a?a(n,t.DATETIME_FORMATS):e.replace(/(^'|'$)/g,\"\").replace(/''/g,\"'\")}),u}}function An(){return function(t,e){return m(e)&&(e=2),B(t,e)}}function En(){return function(t,e){return b(t)&&(t=t.toString()),hr(t)||w(t)?(e=Math.abs(Number(e))===1/0?Number(e):h(e),e?e>0?t.slice(0,e):t.slice(e):w(t)?\"\":[]):t}}function kn(t){return function(e,n,r){function o(t,e){for(var r=0;r<n.length;r++){var i=n[r](t,e);if(0!==i)return i}return 0}function a(t,e){return e?function(e,n){return t(n,e)}:t}function s(t){switch(typeof t){case\"number\":case\"boolean\":case\"string\":return!0;default:return!1}}function u(t){return null===t?\"null\":\"function\"==typeof t.valueOf&&(t=t.valueOf(),s(t))?t:\"function\"==typeof t.toString&&(t=t.toString(),s(t))?t:\"\"}function c(t,e){var n=typeof t,r=typeof e;return n===r&&\"object\"===n&&(t=u(t),e=u(e)),n===r?(\"string\"===n&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e?0:e>t?-1:1):r>n?-1:1}return i(e)?(n=hr(n)?n:[n],0===n.length&&(n=[\"+\"]),n=n.map(function(e){var n=!1,r=e||d;if(w(e)){if((\"+\"==e.charAt(0)||\"-\"==e.charAt(0))&&(n=\"-\"==e.charAt(0),e=e.substring(1)),\"\"===e)return a(c,n);if(r=t(e),r.constant){var i=r();return a(function(t,e){return c(t[i],e[i])},n)}}return a(function(t,e){return c(r(t),r(e))},n)}),ir.call(e).sort(a(o,r))):e}}function On(t){return S(t)&&(t={link:t}),t.restrict=t.restrict||\"AC\",v(t)}function Tn(t,e){t.$name=e}function Mn(t,e,r,i,a){var s=this,u=[],c=s.$$parentForm=t.parent().controller(\"form\")||Vi;s.$error={},s.$$success={},s.$pending=n,s.$name=a(e.name||e.ngForm||\"\")(r),s.$dirty=!1,s.$pristine=!0,s.$valid=!0,s.$invalid=!1,s.$submitted=!1,c.$addControl(s),s.$rollbackViewValue=function(){o(u,function(t){t.$rollbackViewValue()})},s.$commitViewValue=function(){o(u,function(t){t.$commitViewValue()})},s.$addControl=function(t){at(t.$name,\"input\"),u.push(t),t.$name&&(s[t.$name]=t)},s.$$renameControl=function(t,e){var n=t.$name;s[n]===t&&delete s[n],s[e]=t,t.$name=e},s.$removeControl=function(t){t.$name&&s[t.$name]===t&&delete s[t.$name],o(s.$pending,function(e,n){s.$setValidity(n,null,t)}),o(s.$error,function(e,n){s.$setValidity(n,null,t)}),o(s.$$success,function(e,n){s.$setValidity(n,null,t)}),R(u,t)},zn({ctrl:this,$element:t,set:function(t,e,n){var r=t[e];if(r){var i=r.indexOf(n);-1===i&&r.push(n)}else t[e]=[n]},unset:function(t,e,n){var r=t[e];r&&(R(r,n),0===r.length&&delete t[e])},parentForm:c,$animate:i}),s.$setDirty=function(){i.removeClass(t,po),i.addClass(t,vo),s.$dirty=!0,s.$pristine=!1,c.$setDirty()},s.$setPristine=function(){i.setClass(t,po,vo+\" \"+Di),s.$dirty=!1,s.$pristine=!0,s.$submitted=!1,o(u,function(t){t.$setPristine()})},s.$setUntouched=function(){o(u,function(t){t.$setUntouched()})},s.$setSubmitted=function(){i.addClass(t,Di),s.$submitted=!0,c.$setSubmitted()}}function Nn(t){t.$formatters.push(function(e){return t.$isEmpty(e)?e:e.toString()})}function Vn(t,e,n,r,i,o){Dn(t,e,n,r,i,o),Nn(r)}function Dn(t,e,n,r,i,o){var a=Jn(e[0].type);if(!i.android){var s=!1;e.on(\"compositionstart\",function(t){s=!0}),e.on(\"compositionend\",function(){s=!1,u()})}var u=function(t){if(c&&(o.defer.cancel(c),c=null),!s){var i=e.val(),u=t&&t.type;\"password\"===a||n.ngTrim&&\"false\"===n.ngTrim||(i=$r(i)),(r.$viewValue!==i||\"\"===i&&r.$$hasNativeValidators)&&r.$setViewValue(i,u)}};if(i.hasEvent(\"input\"))e.on(\"input\",u);else{var c,l=function(t,e,n){c||(c=o.defer(function(){c=null,e&&e.value===n||u(t)}))};e.on(\"keydown\",function(t){var e=t.keyCode;91===e||e>15&&19>e||e>=37&&40>=e||l(t,this,this.value)}),i.hasEvent(\"paste\")&&e.on(\"paste cut\",l)}e.on(\"change\",u),r.$render=function(){e.val(r.$isEmpty(r.$viewValue)?\"\":r.$viewValue)}}function jn(t,e){if(x(t))return t;if(w(t)){Bi.lastIndex=0;var n=Bi.exec(t);if(n){var r=+n[1],i=+n[2],o=0,a=0,s=0,u=0,c=gn(r),l=7*(i-1);return e&&(o=e.getHours(),a=e.getMinutes(),s=e.getSeconds(),u=e.getMilliseconds()),new Date(r,0,c.getDate()+l,o,a,s,u)}}return NaN}function Rn(t,e){return function(n,r){var i,a;if(x(n))return n;if(w(n)){if('\"'==n.charAt(0)&&'\"'==n.charAt(n.length-1)&&(n=n.substring(1,n.length-1)),_i.test(n))return new Date(n);if(t.lastIndex=0,i=t.exec(n))return i.shift(),a=r?{yyyy:r.getFullYear(),MM:r.getMonth()+1,dd:r.getDate(),HH:r.getHours(),mm:r.getMinutes(),ss:r.getSeconds(),sss:r.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},o(i,function(t,n){n<e.length&&(a[e[n]]=+t)}),new Date(a.yyyy,a.MM-1,a.dd,a.HH,a.mm,a.ss||0,1e3*a.sss||0)}return NaN}}function Pn(t,e,r,i){return function(o,a,s,u,c,l,f){function h(t){return t&&!(t.getTime&&t.getTime()!==t.getTime())}function $(t){return g(t)?x(t)?t:r(t):n}_n(o,a,s,u),Dn(o,a,s,u,c,l);var p,d=u&&u.$options&&u.$options.timezone;if(u.$$parserName=t,u.$parsers.push(function(t){if(u.$isEmpty(t))return null;if(e.test(t)){var i=r(t,p);return\"UTC\"===d&&i.setMinutes(i.getMinutes()-i.getTimezoneOffset()),i}return n}),u.$formatters.push(function(t){if(t&&!x(t))throw wo(\"datefmt\",\"Expected ` + \"`\" + `{0}` + \"`\" + ` to be a date\",t);if(h(t)){if(p=t,p&&\"UTC\"===d){var e=6e4*p.getTimezoneOffset();p=new Date(p.getTime()+e)}return f(\"date\")(t,i,d)}return p=null,\"\"}),g(s.min)||s.ngMin){var v;u.$validators.min=function(t){return!h(t)||m(v)||r(t)>=v},s.$observe(\"min\",function(t){v=$(t),u.$validate()})}if(g(s.max)||s.ngMax){var y;u.$validators.max=function(t){return!h(t)||m(y)||r(t)<=y},s.$observe(\"max\",function(t){y=$(t),u.$validate()})}}}function _n(t,e,r,i){var o=e[0],a=i.$$hasNativeValidators=y(o.validity);a&&i.$parsers.push(function(t){var r=e.prop(Yn)||{};return r.badInput&&!r.typeMismatch?n:t})}function In(t,e,r,i,o,a){if(_n(t,e,r,i),Dn(t,e,r,i,o,a),i.$$parserName=\"number\",i.$parsers.push(function(t){return i.$isEmpty(t)?null:Ui.test(t)?parseFloat(t):n}),i.$formatters.push(function(t){if(!i.$isEmpty(t)){if(!b(t))throw wo(\"numfmt\",\"Expected ` + \"`\" + `{0}` + \"`\" + ` to be a number\",t);t=t.toString()}return t}),g(r.min)||r.ngMin){var s;i.$validators.min=function(t){return i.$isEmpty(t)||m(s)||t>=s},r.$observe(\"min\",function(t){g(t)&&!b(t)&&(t=parseFloat(t,10)),s=b(t)&&!isNaN(t)?t:n,i.$validate()})}if(g(r.max)||r.ngMax){var u;i.$validators.max=function(t){return i.$isEmpty(t)||m(u)||u>=t},r.$observe(\"max\",function(t){g(t)&&!b(t)&&(t=parseFloat(t,10)),u=b(t)&&!isNaN(t)?t:n,i.$validate()})}}function qn(t,e,n,r,i,o){Dn(t,e,n,r,i,o),Nn(r),r.$$parserName=\"url\",r.$validators.url=function(t,e){var n=t||e;return r.$isEmpty(n)||Ii.test(n)}}function Un(t,e,n,r,i,o){Dn(t,e,n,r,i,o),Nn(r),r.$$parserName=\"email\",r.$validators.email=function(t,e){var n=t||e;return r.$isEmpty(n)||qi.test(n)}}function Fn(t,e,n,r){m(n.name)&&e.attr(\"name\",c());var i=function(t){e[0].checked&&r.$setViewValue(n.value,t&&t.type)};e.on(\"click\",i),r.$render=function(){var t=n.value;e[0].checked=t==r.$viewValue},n.$observe(\"value\",r.$render)}function Hn(t,e,n,i,o){var a;if(g(i)){if(a=t(i),!a.constant)throw r(\"ngModel\")(\"constexpr\",\"Expected constant expression for ` + \"`\" + `{0}` + \"`\" + `, but saw ` + \"`\" + `{1}` + \"`\" + `.\",n,i);return a(e)}return o}function Bn(t,e,n,r,i,o,a,s){var u=Hn(s,t,\"ngTrueValue\",n.ngTrueValue,!0),c=Hn(s,t,\"ngFalseValue\",n.ngFalseValue,!1),l=function(t){r.$setViewValue(e[0].checked,t&&t.type)};e.on(\"click\",l),r.$render=function(){e[0].checked=r.$viewValue},r.$isEmpty=function(t){return t===!1},r.$formatters.push(function(t){return I(t,u)}),r.$parsers.push(function(t){return t?u:c})}function Ln(t,e){return t=\"ngClass\"+t,[\"$animate\",function(n){function r(t,e){var n=[];t:for(var r=0;r<t.length;r++){for(var i=t[r],o=0;o<e.length;o++)if(i==e[o])continue t;n.push(i)}return n}function i(t){if(hr(t))return t;if(w(t))return t.split(\" \");if(y(t)){var e=[];return o(t,function(t,n){t&&(e=e.concat(n.split(\" \")))}),e}return t}return{restrict:\"AC\",link:function(a,s,u){function c(t){var e=f(t,1);u.$addClass(e)}function l(t){var e=f(t,-1);u.$removeClass(e)}function f(t,e){var n=s.data(\"$classCounts\")||{},r=[];return o(t,function(t){(e>0||n[t])&&(n[t]=(n[t]||0)+e,n[t]===+(e>0)&&r.push(t))}),s.data(\"$classCounts\",n),r.join(\" \")}function h(t,e){var i=r(e,t),o=r(t,e);i=f(i,1),o=f(o,-1),i&&i.length&&n.addClass(s,i),o&&o.length&&n.removeClass(s,o)}function $(t){if(e===!0||a.$index%2===e){var n=i(t||[]);if(p){if(!I(t,p)){var r=i(p);h(r,n)}}else c(n)}p=_(t)}var p;a.$watch(u[t],$,!0),u.$observe(\"class\",function(e){$(a.$eval(u[t]))}),\"ngClass\"!==t&&a.$watch(\"$index\",function(n,r){var o=1&n;if(o!==(1&r)){var s=i(a.$eval(u[t]));o===e?c(s):l(s)}})}}}]}function zn(t){function e(t,e,u){e===n?r(\"$pending\",t,u):i(\"$pending\",t,u),M(e)?e?(f(s.$error,t,u),l(s.$$success,t,u)):(l(s.$error,t,u),f(s.$$success,t,u)):(f(s.$error,t,u),f(s.$$success,t,u)),s.$pending?(o(yo,!0),s.$valid=s.$invalid=n,a(\"\",null)):(o(yo,!1),s.$valid=Gn(s.$error),s.$invalid=!s.$valid,a(\"\",s.$valid));var c;c=s.$pending&&s.$pending[t]?n:s.$error[t]?!1:s.$$success[t]?!0:null,a(t,c),h.$setValidity(t,c,s)}function r(t,e,n){s[t]||(s[t]={}),l(s[t],e,n)}function i(t,e,r){s[t]&&f(s[t],e,r),Gn(s[t])&&(s[t]=n)}function o(t,e){e&&!c[t]?($.addClass(u,t),c[t]=!0):!e&&c[t]&&($.removeClass(u,t),c[t]=!1)}function a(t,e){t=t?\"-\"+nt(t,\"-\"):\"\",o(ho+t,e===!0),o($o+t,e===!1)}var s=t.ctrl,u=t.$element,c={},l=t.set,f=t.unset,h=t.parentForm,$=t.$animate;c[$o]=!(c[ho]=u.hasClass(ho)),s.$setValidity=e}function Gn(t){if(t)for(var e in t)return!1;return!0}var Wn=/^\\/(.+)\\/([a-z]*)$/,Yn=\"validity\",Jn=function(t){return w(t)?t.toLowerCase():t},Zn=Object.prototype.hasOwnProperty,Kn=function(t){return w(t)?t.toUpperCase():t},Xn=function(t){return w(t)?t.replace(/[A-Z]/g,function(t){return String.fromCharCode(32|t.charCodeAt(0))}):t},Qn=function(t){return w(t)?t.replace(/[a-z]/g,function(t){return String.fromCharCode(-33&t.charCodeAt(0))}):t};\"i\"!==\"I\".toLowerCase()&&(Jn=Xn,Kn=Qn);var tr,er,nr,rr,ir=[].slice,or=[].splice,ar=[].push,sr=Object.prototype.toString,ur=r(\"ng\"),cr=t.angular||(t.angular={}),lr=0;tr=e.documentMode,p.$inject=[],d.$inject=[];var fr,hr=Array.isArray,$r=function(t){return w(t)?t.trim():t},pr=function(t){return t.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\").replace(/\\x08/g,\"\\\\x08\")},dr=function(){if(g(dr.isActive_))return dr.isActive_;var t=!(!e.querySelector(\"[ng-csp]\")&&!e.querySelector(\"[data-ng-csp]\"));if(!t)try{new Function(\"\")}catch(n){t=!0}return dr.isActive_=t},vr=[\"ng-\",\"data-ng-\",\"ng:\",\"x-ng-\"],mr=/[A-Z]/g,gr=!1,yr=1,wr=3,br=8,xr=9,Sr=11,Cr={full:\"1.3.15\",major:1,minor:3,dot:15,codeName:\"locality-filtration\"};wt.expando=\"ng339\";var Ar=wt.cache={},Er=1,kr=function(t,e,n){t.addEventListener(e,n,!1)},Or=function(t,e,n){t.removeEventListener(e,n,!1)};wt._data=function(t){return this.cache[t[this.expando]]||{}};var Tr=/([\\:\\-\\_]+(.))/g,Mr=/^moz([A-Z])/,Nr={mouseleave:\"mouseout\",mouseenter:\"mouseover\"},Vr=r(\"jqLite\"),Dr=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,jr=/<|&#?\\w+;/,Rr=/<([\\w:]+)/,Pr=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,_r={option:[1,'<select multiple=\"multiple\">',\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};_r.optgroup=_r.option,_r.tbody=_r.tfoot=_r.colgroup=_r.caption=_r.thead,_r.th=_r.td;var Ir=wt.prototype={ready:function(n){function r(){i||(i=!0,n())}var i=!1;\"complete\"===e.readyState?setTimeout(r):(this.on(\"DOMContentLoaded\",r),wt(t).on(\"load\",r))},toString:function(){var t=[];return o(this,function(e){t.push(\"\"+e)}),\"[\"+t.join(\", \")+\"]\"},eq:function(t){return er(t>=0?this[t]:this[this.length+t])},length:0,push:ar,sort:[].sort,splice:[].splice},qr={};o(\"multiple,selected,checked,disabled,readOnly,required,open\".split(\",\"),function(t){qr[Jn(t)]=t});var Ur={};o(\"input,select,option,textarea,button,form,details\".split(\",\"),function(t){Ur[t]=!0});var Fr={ngMinlength:\"minlength\",ngMaxlength:\"maxlength\",ngMin:\"min\",ngMax:\"max\",ngPattern:\"pattern\"};o({data:Et,removeData:Ct},function(t,e){wt[e]=t}),o({data:Et,inheritedData:Vt,scope:function(t){return er.data(t,\"$scope\")||Vt(t.parentNode||t,[\"$isolateScope\",\"$scope\"])},isolateScope:function(t){return er.data(t,\"$isolateScope\")||er.data(t,\"$isolateScopeNoTemplate\")},controller:Nt,injector:function(t){return Vt(t,\"$injector\")},removeAttr:function(t,e){t.removeAttribute(e)},hasClass:kt,css:function(t,e,n){return e=dt(e),g(n)?void(t.style[e]=n):t.style[e]},attr:function(t,e,r){var i=Jn(e);if(qr[i]){if(!g(r))return t[e]||(t.attributes.getNamedItem(e)||p).specified?i:n;r?(t[e]=!0,t.setAttribute(e,i)):(t[e]=!1,t.removeAttribute(i))}else if(g(r))t.setAttribute(e,r);else if(t.getAttribute){var o=t.getAttribute(e,2);return null===o?n:o}},prop:function(t,e,n){return g(n)?void(t[e]=n):t[e]},text:function(){function t(t,e){if(m(e)){var n=t.nodeType;return n===yr||n===wr?t.textContent:\"\"}t.textContent=e}return t.$dv=\"\",t}(),val:function(t,e){if(m(e)){if(t.multiple&&\"select\"===j(t)){var n=[];return o(t.options,function(t){t.selected&&n.push(t.value||t.text)}),0===n.length?null:n}return t.value}t.value=e},html:function(t,e){return m(e)?t.innerHTML:(xt(t,!0),void(t.innerHTML=e))},empty:Dt},function(t,e){wt.prototype[e]=function(e,r){var i,o,a=this.length;if(t!==Dt&&(2==t.length&&t!==kt&&t!==Nt?e:r)===n){if(y(e)){for(i=0;a>i;i++)if(t===Et)t(this[i],e);else for(o in e)t(this[i],o,e[o]);return this}for(var s=t.$dv,u=s===n?Math.min(a,1):a,c=0;u>c;c++){var l=t(this[c],e,r);s=s?s+l:l}return s}for(i=0;a>i;i++)t(this[i],e,r);return this}}),o({removeData:Ct,on:function Wo(t,e,n,r){if(g(r))throw Vr(\"onargs\",\"jqLite#on() does not support the ` + \"`\" + `selector` + \"`\" + ` or ` + \"`\" + `eventData` + \"`\" + ` parameters\");if(mt(t)){var i=At(t,!0),o=i.events,a=i.handle;a||(a=i.handle=It(t,o));for(var s=e.indexOf(\" \")>=0?e.split(\" \"):[e],u=s.length;u--;){e=s[u];var c=o[e];c||(o[e]=[],\"mouseenter\"===e||\"mouseleave\"===e?Wo(t,Nr[e],function(t){var n=this,r=t.relatedTarget;(!r||r!==n&&!n.contains(r))&&a(t,e)}):\"$destroy\"!==e&&kr(t,e,a),c=o[e]),c.push(n)}}},off:St,one:function(t,e,n){t=er(t),t.on(e,function r(){t.off(e,n),t.off(e,r)}),t.on(e,n)},replaceWith:function(t,e){var n,r=t.parentNode;xt(t),o(new wt(e),function(e){n?r.insertBefore(e,n.nextSibling):r.replaceChild(e,t),n=e})},children:function(t){var e=[];return o(t.childNodes,function(t){t.nodeType===yr&&e.push(t)}),e},contents:function(t){return t.contentDocument||t.childNodes||[]},append:function(t,e){var n=t.nodeType;if(n===yr||n===Sr){e=new wt(e);for(var r=0,i=e.length;i>r;r++){var o=e[r];t.appendChild(o)}}},prepend:function(t,e){if(t.nodeType===yr){var n=t.firstChild;o(new wt(e),function(e){t.insertBefore(e,n)})}},wrap:function(t,e){e=er(e).eq(0).clone()[0];var n=t.parentNode;n&&n.replaceChild(e,t),e.appendChild(t)},remove:jt,detach:function(t){jt(t,!0)},after:function(t,e){var n=t,r=t.parentNode;e=new wt(e);for(var i=0,o=e.length;o>i;i++){var a=e[i];r.insertBefore(a,n.nextSibling),n=a}},addClass:Tt,removeClass:Ot,toggleClass:function(t,e,n){e&&o(e.split(\" \"),function(e){var r=n;m(r)&&(r=!kt(t,e)),(r?Tt:Ot)(t,e)})},parent:function(t){var e=t.parentNode;return e&&e.nodeType!==Sr?e:null},next:function(t){return t.nextElementSibling},find:function(t,e){return t.getElementsByTagName?t.getElementsByTagName(e):[]},clone:bt,triggerHandler:function(t,e,n){var r,i,a,s=e.type||e,u=At(t),c=u&&u.events,l=c&&c[s];l&&(r={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:p,type:s,target:t},e.type&&(r=f(r,e)),i=_(l),a=n?[r].concat(n):[r],o(i,function(e){r.isImmediatePropagationStopped()||e.apply(t,a)}))}},function(t,e){wt.prototype[e]=function(e,n,r){for(var i,o=0,a=this.length;a>o;o++)m(i)?(i=t(this[o],e,n,r),g(i)&&(i=er(i))):Mt(i,t(this[o],e,n,r));return g(i)?i:this},wt.prototype.bind=wt.prototype.on,wt.prototype.unbind=wt.prototype.off}),Ft.prototype={put:function(t,e){this[Ut(t,this.nextUid)]=e},get:function(t){return this[Ut(t,this.nextUid)]},remove:function(t){var e=this[t=Ut(t,this.nextUid)];return delete this[t],e}};var Hr=/^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m,Br=/,/,Lr=/^\\s*(_?)(\\S+?)\\1\\s*$/,zr=/((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm,Gr=r(\"$injector\");Lt.$$annotate=Bt;var Wr=r(\"$animate\"),Yr=[\"$provide\",function(t){this.$$selectors={},this.register=function(e,n){var r=e+\"-animation\";if(e&&\".\"!=e.charAt(0))throw Wr(\"notcsel\",\"Expecting class selector starting with '.' got '{0}'.\",e);this.$$selectors[e.substr(1)]=r,t.factory(r,n)},this.classNameFilter=function(t){return 1===arguments.length&&(this.$$classNameFilter=t instanceof RegExp?t:null),this.$$classNameFilter},this.$get=[\"$$q\",\"$$asyncCallback\",\"$rootScope\",function(t,e,n){function r(e){var r,i=t.defer();return i.promise.$$cancelFn=function(){r&&r()},n.$$postDigest(function(){r=e(function(){i.resolve()})}),i.promise}function i(t,e){var n=[],r=[],i=ct();return o((t.attr(\"class\")||\"\").split(/\\s+/),function(t){i[t]=!0}),o(e,function(t,e){var o=i[e];t===!1&&o?r.push(e):t!==!0||o||n.push(e)}),n.length+r.length>0&&[n.length?n:null,r.length?r:null]}function a(t,e,n){for(var r=0,i=e.length;i>r;++r){var o=e[r];t[o]=n}}function s(){return c||(c=t.defer(),e(function(){c.resolve(),c=null})),c.promise}function u(t,e){if(cr.isObject(e)){var n=f(e.from||{},e.to||{});t.css(n)}}var c;return{animate:function(t,e,n){return u(t,{from:e,to:n}),s()},enter:function(t,e,n,r){return u(t,r),n?n.after(t):e.prepend(t),s()},leave:function(t,e){return u(t,e),t.remove(),s()},move:function(t,e,n,r){return this.enter(t,e,n,r)},addClass:function(t,e,n){return this.setClass(t,e,[],n)},$$addClassImmediately:function(t,e,n){return t=er(t),e=w(e)?e:hr(e)?e.join(\" \"):\"\",o(t,function(t){Tt(t,e)}),u(t,n),s()},removeClass:function(t,e,n){return this.setClass(t,[],e,n)},$$removeClassImmediately:function(t,e,n){return t=er(t),e=w(e)?e:hr(e)?e.join(\" \"):\"\",o(t,function(t){Ot(t,e)}),u(t,n),s()},setClass:function(t,e,n,o){var s=this,u=\"$$animateClasses\",c=!1;t=er(t);var l=t.data(u);l?o&&l.options&&(l.options=cr.extend(l.options||{},o)):(l={classes:{},options:o},c=!0);var f=l.classes;return e=hr(e)?e:e.split(\" \"),n=hr(n)?n:n.split(\" \"),a(f,e,!0),a(f,n,!1),c&&(l.promise=r(function(e){var n=t.data(u);if(t.removeData(u),n){var r=i(t,n.classes);r&&s.$$setClassImmediately(t,r[0],r[1],n.options)}e()}),t.data(u,l)),l.promise},$$setClassImmediately:function(t,e,n,r){\nreturn e&&this.$$addClassImmediately(t,e),n&&this.$$removeClassImmediately(t,n),u(t,r),s()},enabled:p,cancel:p}}]}],Jr=r(\"$compile\");Kt.$inject=[\"$provide\",\"$$sanitizeUriProvider\"];var Zr=/^((?:x|data)[\\:\\-_])/i,Kr=r(\"$controller\"),Xr=\"application/json\",Qr={\"Content-Type\":Xr+\";charset=utf-8\"},ti=/^\\[|^\\{(?!\\{)/,ei={\"[\":/]$/,\"{\":/}$/},ni=/^\\)\\]\\}',?\\n/,ri=r(\"$interpolate\"),ii=/^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,oi={http:80,https:443,ftp:21},ai=r(\"$location\"),si={$$html5:!1,$$replace:!1,absUrl:Oe(\"$$absUrl\"),url:function(t){if(m(t))return this.$$url;var e=ii.exec(t);return(e[1]||\"\"===t)&&this.path(decodeURIComponent(e[1])),(e[2]||e[1]||\"\"===t)&&this.search(e[3]||\"\"),this.hash(e[5]||\"\"),this},protocol:Oe(\"$$protocol\"),host:Oe(\"$$host\"),port:Oe(\"$$port\"),path:Te(\"$$path\",function(t){return t=null!==t?t.toString():\"\",\"/\"==t.charAt(0)?t:\"/\"+t}),search:function(t,e){switch(arguments.length){case 0:return this.$$search;case 1:if(w(t)||b(t))t=t.toString(),this.$$search=W(t);else{if(!y(t))throw ai(\"isrcharg\",\"The first argument of the ` + \"`\" + `$location#search()` + \"`\" + ` call must be a string or an object.\");t=P(t,{}),o(t,function(e,n){null==e&&delete t[n]}),this.$$search=t}break;default:m(e)||null===e?delete this.$$search[t]:this.$$search[t]=e}return this.$$compose(),this},hash:Te(\"$$hash\",function(t){return null!==t?t.toString():\"\"}),replace:function(){return this.$$replace=!0,this}};o([ke,Ee,Ae],function(t){t.prototype=Object.create(si),t.prototype.state=function(e){if(!arguments.length)return this.$$state;if(t!==Ae||!this.$$html5)throw ai(\"nostate\",\"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API\");return this.$$state=m(e)?null:e,this}});var ui=r(\"$parse\"),ci=Function.prototype.call,li=Function.prototype.apply,fi=Function.prototype.bind,hi=ct();o({\"null\":function(){return null},\"true\":function(){return!0},\"false\":function(){return!1},undefined:function(){}},function(t,e){t.constant=t.literal=t.sharedGetter=!0,hi[e]=t}),hi[\"this\"]=function(t){return t},hi[\"this\"].sharedGetter=!0;var $i=f(ct(),{\"+\":function(t,e,r,i){return r=r(t,e),i=i(t,e),g(r)?g(i)?r+i:r:g(i)?i:n},\"-\":function(t,e,n,r){return n=n(t,e),r=r(t,e),(g(n)?n:0)-(g(r)?r:0)},\"*\":function(t,e,n,r){return n(t,e)*r(t,e)},\"/\":function(t,e,n,r){return n(t,e)/r(t,e)},\"%\":function(t,e,n,r){return n(t,e)%r(t,e)},\"===\":function(t,e,n,r){return n(t,e)===r(t,e)},\"!==\":function(t,e,n,r){return n(t,e)!==r(t,e)},\"==\":function(t,e,n,r){return n(t,e)==r(t,e)},\"!=\":function(t,e,n,r){return n(t,e)!=r(t,e)},\"<\":function(t,e,n,r){return n(t,e)<r(t,e)},\">\":function(t,e,n,r){return n(t,e)>r(t,e)},\"<=\":function(t,e,n,r){return n(t,e)<=r(t,e)},\">=\":function(t,e,n,r){return n(t,e)>=r(t,e)},\"&&\":function(t,e,n,r){return n(t,e)&&r(t,e)},\"||\":function(t,e,n,r){return n(t,e)||r(t,e)},\"!\":function(t,e,n){return!n(t,e)},\"=\":!0,\"|\":!0}),pi={n:\"\\n\",f:\"\\f\",r:\"\\r\",t:\"\t\",v:\"\\x0B\",\"'\":\"'\",'\"':'\"'},di=function(t){this.options=t};di.prototype={constructor:di,lex:function(t){for(this.text=t,this.index=0,this.tokens=[];this.index<this.text.length;){var e=this.text.charAt(this.index);if('\"'===e||\"'\"===e)this.readString(e);else if(this.isNumber(e)||\".\"===e&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(e))this.readIdent();else if(this.is(e,\"(){}[].,;:?\"))this.tokens.push({index:this.index,text:e}),this.index++;else if(this.isWhitespace(e))this.index++;else{var n=e+this.peek(),r=n+this.peek(2),i=$i[e],o=$i[n],a=$i[r];if(i||o||a){var s=a?r:o?n:e;this.tokens.push({index:this.index,text:s,operator:!0}),this.index+=s.length}else this.throwError(\"Unexpected next character \",this.index,this.index+1)}}return this.tokens},is:function(t,e){return-1!==e.indexOf(t)},peek:function(t){var e=t||1;return this.index+e<this.text.length?this.text.charAt(this.index+e):!1},isNumber:function(t){return t>=\"0\"&&\"9\">=t&&\"string\"==typeof t},isWhitespace:function(t){return\" \"===t||\"\\r\"===t||\"\t\"===t||\"\\n\"===t||\"\\x0B\"===t||\" \"===t},isIdent:function(t){return t>=\"a\"&&\"z\">=t||t>=\"A\"&&\"Z\">=t||\"_\"===t||\"$\"===t},isExpOperator:function(t){return\"-\"===t||\"+\"===t||this.isNumber(t)},throwError:function(t,e,n){n=n||this.index;var r=g(e)?\"s \"+e+\"-\"+this.index+\" [\"+this.text.substring(e,n)+\"]\":\" \"+n;throw ui(\"lexerr\",\"Lexer Error: {0} at column{1} in expression [{2}].\",t,r,this.text)},readNumber:function(){for(var t=\"\",e=this.index;this.index<this.text.length;){var n=Jn(this.text.charAt(this.index));if(\".\"==n||this.isNumber(n))t+=n;else{var r=this.peek();if(\"e\"==n&&this.isExpOperator(r))t+=n;else if(this.isExpOperator(n)&&r&&this.isNumber(r)&&\"e\"==t.charAt(t.length-1))t+=n;else{if(!this.isExpOperator(n)||r&&this.isNumber(r)||\"e\"!=t.charAt(t.length-1))break;this.throwError(\"Invalid exponent\")}}this.index++}this.tokens.push({index:e,text:t,constant:!0,value:Number(t)})},readIdent:function(){for(var t=this.index;this.index<this.text.length;){var e=this.text.charAt(this.index);if(!this.isIdent(e)&&!this.isNumber(e))break;this.index++}this.tokens.push({index:t,text:this.text.slice(t,this.index),identifier:!0})},readString:function(t){var e=this.index;this.index++;for(var n=\"\",r=t,i=!1;this.index<this.text.length;){var o=this.text.charAt(this.index);if(r+=o,i){if(\"u\"===o){var a=this.text.substring(this.index+1,this.index+5);a.match(/[\\da-f]{4}/i)||this.throwError(\"Invalid unicode escape [\\\\u\"+a+\"]\"),this.index+=4,n+=String.fromCharCode(parseInt(a,16))}else{var s=pi[o];n+=s||o}i=!1}else if(\"\\\\\"===o)i=!0;else{if(o===t)return this.index++,void this.tokens.push({index:e,text:r,constant:!0,value:n});n+=o}this.index++}this.throwError(\"Unterminated quote\",e)}};var vi=function(t,e,n){this.lexer=t,this.$filter=e,this.options=n};vi.ZERO=f(function(){return 0},{sharedGetter:!0,constant:!0}),vi.prototype={constructor:vi,parse:function(t){this.text=t,this.tokens=this.lexer.lex(t);var e=this.statements();return 0!==this.tokens.length&&this.throwError(\"is an unexpected token\",this.tokens[0]),e.literal=!!e.literal,e.constant=!!e.constant,e},primary:function(){var t;this.expect(\"(\")?(t=this.filterChain(),this.consume(\")\")):this.expect(\"[\")?t=this.arrayDeclaration():this.expect(\"{\")?t=this.object():this.peek().identifier&&this.peek().text in hi?t=hi[this.consume().text]:this.peek().identifier?t=this.identifier():this.peek().constant?t=this.constant():this.throwError(\"not a primary expression\",this.peek());for(var e,n;e=this.expect(\"(\",\"[\",\".\");)\"(\"===e.text?(t=this.functionCall(t,n),n=null):\"[\"===e.text?(n=t,t=this.objectIndex(t)):\".\"===e.text?(n=t,t=this.fieldAccess(t)):this.throwError(\"IMPOSSIBLE\");return t},throwError:function(t,e){throw ui(\"syntax\",\"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].\",e.text,t,e.index+1,this.text,this.text.substring(e.index))},peekToken:function(){if(0===this.tokens.length)throw ui(\"ueoe\",\"Unexpected end of expression: {0}\",this.text);return this.tokens[0]},peek:function(t,e,n,r){return this.peekAhead(0,t,e,n,r)},peekAhead:function(t,e,n,r,i){if(this.tokens.length>t){var o=this.tokens[t],a=o.text;if(a===e||a===n||a===r||a===i||!e&&!n&&!r&&!i)return o}return!1},expect:function(t,e,n,r){var i=this.peek(t,e,n,r);return i?(this.tokens.shift(),i):!1},consume:function(t){if(0===this.tokens.length)throw ui(\"ueoe\",\"Unexpected end of expression: {0}\",this.text);var e=this.expect(t);return e||this.throwError(\"is unexpected, expecting [\"+t+\"]\",this.peek()),e},unaryFn:function(t,e){var n=$i[t];return f(function(t,r){return n(t,r,e)},{constant:e.constant,inputs:[e]})},binaryFn:function(t,e,n,r){var i=$i[e];return f(function(e,r){return i(e,r,t,n)},{constant:t.constant&&n.constant,inputs:!r&&[t,n]})},identifier:function(){for(var t=this.consume().text;this.peek(\".\")&&this.peekAhead(1).identifier&&!this.peekAhead(2,\"(\");)t+=this.consume().text+this.consume().text;return Ue(t,this.options,this.text)},constant:function(){var t=this.consume().value;return f(function(){return t},{constant:!0,literal:!0})},statements:function(){for(var t=[];;)if(this.tokens.length>0&&!this.peek(\"}\",\")\",\";\",\"]\")&&t.push(this.filterChain()),!this.expect(\";\"))return 1===t.length?t[0]:function(e,n){for(var r,i=0,o=t.length;o>i;i++)r=t[i](e,n);return r}},filterChain:function(){for(var t,e=this.expression();t=this.expect(\"|\");)e=this.filter(e);return e},filter:function(t){var e,r,i=this.$filter(this.consume().text);if(this.peek(\":\"))for(e=[],r=[];this.expect(\":\");)e.push(this.expression());var o=[t].concat(e||[]);return f(function(o,a){var s=t(o,a);if(r){r[0]=s;for(var u=e.length;u--;)r[u+1]=e[u](o,a);return i.apply(n,r)}return i(s)},{constant:!i.$stateful&&o.every(Re),inputs:!i.$stateful&&o})},expression:function(){return this.assignment()},assignment:function(){var t,e,n=this.ternary();return(e=this.expect(\"=\"))?(n.assign||this.throwError(\"implies assignment but [\"+this.text.substring(0,e.index)+\"] can not be assigned to\",e),t=this.ternary(),f(function(e,r){return n.assign(e,t(e,r),r)},{inputs:[n,t]})):n},ternary:function(){var t,e,n=this.logicalOR();if((e=this.expect(\"?\"))&&(t=this.assignment(),this.consume(\":\"))){var r=this.assignment();return f(function(e,i){return n(e,i)?t(e,i):r(e,i)},{constant:n.constant&&t.constant&&r.constant})}return n},logicalOR:function(){for(var t,e=this.logicalAND();t=this.expect(\"||\");)e=this.binaryFn(e,t.text,this.logicalAND(),!0);return e},logicalAND:function(){for(var t,e=this.equality();t=this.expect(\"&&\");)e=this.binaryFn(e,t.text,this.equality(),!0);return e},equality:function(){for(var t,e=this.relational();t=this.expect(\"==\",\"!=\",\"===\",\"!==\");)e=this.binaryFn(e,t.text,this.relational());return e},relational:function(){for(var t,e=this.additive();t=this.expect(\"<\",\">\",\"<=\",\">=\");)e=this.binaryFn(e,t.text,this.additive());return e},additive:function(){for(var t,e=this.multiplicative();t=this.expect(\"+\",\"-\");)e=this.binaryFn(e,t.text,this.multiplicative());return e},multiplicative:function(){for(var t,e=this.unary();t=this.expect(\"*\",\"/\",\"%\");)e=this.binaryFn(e,t.text,this.unary());return e},unary:function(){var t;return this.expect(\"+\")?this.primary():(t=this.expect(\"-\"))?this.binaryFn(vi.ZERO,t.text,this.unary()):(t=this.expect(\"!\"))?this.unaryFn(t.text,this.unary()):this.primary()},fieldAccess:function(t){var e=this.identifier();return f(function(r,i,o){var a=o||t(r,i);return null==a?n:e(a)},{assign:function(n,r,i){var o=t(n,i);return o||t.assign(n,o={},i),e.assign(o,r)}})},objectIndex:function(t){var e=this.text,r=this.expression();return this.consume(\"]\"),f(function(i,o){var a,s=t(i,o),u=r(i,o);return Ve(u,e),s?a=De(s[u],e):n},{assign:function(n,i,o){var a=Ve(r(n,o),e),s=De(t(n,o),e);return s||t.assign(n,s={},o),s[a]=i}})},functionCall:function(t,e){var r=[];if(\")\"!==this.peekToken().text)do r.push(this.expression());while(this.expect(\",\"));this.consume(\")\");var i=this.text,o=r.length?[]:null;return function(a,s){var u=e?e(a,s):g(e)?n:a,c=t(a,s,u)||p;if(o)for(var l=r.length;l--;)o[l]=De(r[l](a,s),i);De(u,i),je(c,i);var f=c.apply?c.apply(u,o):c(o[0],o[1],o[2],o[3],o[4]);return o&&(o.length=0),De(f,i)}},arrayDeclaration:function(){var t=[];if(\"]\"!==this.peekToken().text)do{if(this.peek(\"]\"))break;t.push(this.expression())}while(this.expect(\",\"));return this.consume(\"]\"),f(function(e,n){for(var r=[],i=0,o=t.length;o>i;i++)r.push(t[i](e,n));return r},{literal:!0,constant:t.every(Re),inputs:t})},object:function(){var t=[],e=[];if(\"}\"!==this.peekToken().text)do{if(this.peek(\"}\"))break;var n=this.consume();n.constant?t.push(n.value):n.identifier?t.push(n.text):this.throwError(\"invalid key\",n),this.consume(\":\"),e.push(this.expression())}while(this.expect(\",\"));return this.consume(\"}\"),f(function(n,r){for(var i={},o=0,a=e.length;a>o;o++)i[t[o]]=e[o](n,r);return i},{literal:!0,constant:e.every(Re),inputs:e})}};var mi=ct(),gi=ct(),yi=Object.prototype.valueOf,wi=r(\"$sce\"),bi={HTML:\"html\",CSS:\"css\",URL:\"url\",RESOURCE_URL:\"resourceUrl\",JS:\"js\"},Jr=r(\"$compile\"),xi=e.createElement(\"a\"),Si=rn(t.location.href);sn.$inject=[\"$provide\"],fn.$inject=[\"$locale\"],hn.$inject=[\"$locale\"];var Ci=\".\",Ai={yyyy:dn(\"FullYear\",4),yy:dn(\"FullYear\",2,0,!0),y:dn(\"FullYear\",1),MMMM:vn(\"Month\"),MMM:vn(\"Month\",!0),MM:dn(\"Month\",2,1),M:dn(\"Month\",1,1),dd:dn(\"Date\",2),d:dn(\"Date\",1),HH:dn(\"Hours\",2),H:dn(\"Hours\",1),hh:dn(\"Hours\",2,-12),h:dn(\"Hours\",1,-12),mm:dn(\"Minutes\",2),m:dn(\"Minutes\",1),ss:dn(\"Seconds\",2),s:dn(\"Seconds\",1),sss:dn(\"Milliseconds\",3),EEEE:vn(\"Day\"),EEE:vn(\"Day\",!0),a:bn,Z:mn,ww:wn(2),w:wn(1),G:xn,GG:xn,GGG:xn,GGGG:Sn},Ei=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,ki=/^\\-?\\d+$/;Cn.$inject=[\"$locale\"];var Oi=v(Jn),Ti=v(Kn);kn.$inject=[\"$parse\"];var Mi=v({restrict:\"E\",compile:function(t,e){return e.href||e.xlinkHref||e.name?void 0:function(t,e){if(\"a\"===e[0].nodeName.toLowerCase()){var n=\"[object SVGAnimatedString]\"===sr.call(e.prop(\"href\"))?\"xlink:href\":\"href\";e.on(\"click\",function(t){e.attr(n)||t.preventDefault()})}}}}),Ni={};o(qr,function(t,e){if(\"multiple\"!=t){var n=Xt(\"ng-\"+e);Ni[n]=function(){return{restrict:\"A\",priority:100,link:function(t,r,i){t.$watch(i[n],function(t){i.$set(e,!!t)})}}}}}),o(Fr,function(t,e){Ni[e]=function(){return{priority:100,link:function(t,n,r){if(\"ngPattern\"===e&&\"/\"==r.ngPattern.charAt(0)){var i=r.ngPattern.match(Wn);if(i)return void r.$set(\"ngPattern\",new RegExp(i[1],i[2]))}t.$watch(r[e],function(t){r.$set(e,t)})}}}}),o([\"src\",\"srcset\",\"href\"],function(t){var e=Xt(\"ng-\"+t);Ni[e]=function(){return{priority:99,link:function(n,r,i){var o=t,a=t;\"href\"===t&&\"[object SVGAnimatedString]\"===sr.call(r.prop(\"href\"))&&(a=\"xlinkHref\",i.$attr[a]=\"xlink:href\",o=null),i.$observe(e,function(e){return e?(i.$set(a,e),void(tr&&o&&r.prop(o,i[a]))):void(\"href\"===t&&i.$set(a,null))})}}}});var Vi={$addControl:p,$$renameControl:Tn,$removeControl:p,$setValidity:p,$setDirty:p,$setPristine:p,$setSubmitted:p},Di=\"ng-submitted\";Mn.$inject=[\"$element\",\"$attrs\",\"$scope\",\"$animate\",\"$interpolate\"];var ji=function(t){return[\"$timeout\",function(e){var r={name:\"form\",restrict:t?\"EAC\":\"E\",controller:Mn,compile:function(r,i){r.addClass(po).addClass(ho);var o=i.name?\"name\":t&&i.ngForm?\"ngForm\":!1;return{pre:function(t,r,i,a){if(!(\"action\"in i)){var s=function(e){t.$apply(function(){a.$commitViewValue(),a.$setSubmitted()}),e.preventDefault()};kr(r[0],\"submit\",s),r.on(\"$destroy\",function(){e(function(){Or(r[0],\"submit\",s)},0,!1)})}var u=a.$$parentForm;o&&(Pe(t,null,a.$name,a,a.$name),i.$observe(o,function(e){a.$name!==e&&(Pe(t,null,a.$name,n,a.$name),u.$$renameControl(a,e),Pe(t,null,a.$name,a,a.$name))})),r.on(\"$destroy\",function(){u.$removeControl(a),o&&Pe(t,null,i[o],n,a.$name),f(a,Vi)})}}}};return r}]},Ri=ji(),Pi=ji(!0),_i=/\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/,Ii=/^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/,qi=/^[a-z0-9!#$%&'*+\\/=?^_` + \"`\" + `{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Ui=/^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/,Fi=/^(\\d{4})-(\\d{2})-(\\d{2})$/,Hi=/^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,Bi=/^(\\d{4})-W(\\d\\d)$/,Li=/^(\\d{4})-(\\d\\d)$/,zi=/^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,Gi={text:Vn,date:Pn(\"date\",Fi,Rn(Fi,[\"yyyy\",\"MM\",\"dd\"]),\"yyyy-MM-dd\"),\"datetime-local\":Pn(\"datetimelocal\",Hi,Rn(Hi,[\"yyyy\",\"MM\",\"dd\",\"HH\",\"mm\",\"ss\",\"sss\"]),\"yyyy-MM-ddTHH:mm:ss.sss\"),time:Pn(\"time\",zi,Rn(zi,[\"HH\",\"mm\",\"ss\",\"sss\"]),\"HH:mm:ss.sss\"),week:Pn(\"week\",Bi,jn,\"yyyy-Www\"),month:Pn(\"month\",Li,Rn(Li,[\"yyyy\",\"MM\"]),\"yyyy-MM\"),number:In,url:qn,email:Un,radio:Fn,checkbox:Bn,hidden:p,button:p,submit:p,reset:p,file:p},Wi=[\"$browser\",\"$sniffer\",\"$filter\",\"$parse\",function(t,e,n,r){return{restrict:\"E\",require:[\"?ngModel\"],link:{pre:function(i,o,a,s){s[0]&&(Gi[Jn(a.type)]||Gi.text)(i,o,a,s[0],e,t,n,r)}}}}],Yi=/^(true|false|\\d+)$/,Ji=function(){return{restrict:\"A\",priority:100,compile:function(t,e){return Yi.test(e.ngValue)?function(t,e,n){n.$set(\"value\",t.$eval(n.ngValue))}:function(t,e,n){t.$watch(n.ngValue,function(t){n.$set(\"value\",t)})}}}},Zi=[\"$compile\",function(t){return{restrict:\"AC\",compile:function(e){return t.$$addBindingClass(e),function(e,r,i){t.$$addBindingInfo(r,i.ngBind),r=r[0],e.$watch(i.ngBind,function(t){r.textContent=t===n?\"\":t})}}}}],Ki=[\"$interpolate\",\"$compile\",function(t,e){return{compile:function(r){return e.$$addBindingClass(r),function(r,i,o){var a=t(i.attr(o.$attr.ngBindTemplate));e.$$addBindingInfo(i,a.expressions),i=i[0],o.$observe(\"ngBindTemplate\",function(t){i.textContent=t===n?\"\":t})}}}}],Xi=[\"$sce\",\"$parse\",\"$compile\",function(t,e,n){return{restrict:\"A\",compile:function(r,i){var o=e(i.ngBindHtml),a=e(i.ngBindHtml,function(t){return(t||\"\").toString()});return n.$$addBindingClass(r),function(e,r,i){n.$$addBindingInfo(r,i.ngBindHtml),e.$watch(a,function(){r.html(t.getTrustedHtml(o(e))||\"\")})}}}}],Qi=v({restrict:\"A\",require:\"ngModel\",link:function(t,e,n,r){r.$viewChangeListeners.push(function(){t.$eval(n.ngChange)})}}),to=Ln(\"\",!0),eo=Ln(\"Odd\",0),no=Ln(\"Even\",1),ro=On({compile:function(t,e){e.$set(\"ngCloak\",n),t.removeClass(\"ng-cloak\")}}),io=[function(){return{restrict:\"A\",scope:!0,controller:\"@\",priority:500}}],oo={},ao={blur:!0,focus:!0};o(\"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste\".split(\" \"),function(t){var e=Xt(\"ng-\"+t);oo[e]=[\"$parse\",\"$rootScope\",function(n,r){return{restrict:\"A\",compile:function(i,o){var a=n(o[e],null,!0);return function(e,n){n.on(t,function(n){var i=function(){a(e,{$event:n})};ao[t]&&r.$$phase?e.$evalAsync(i):e.$apply(i)})}}}}]});var so=[\"$animate\",function(t){return{multiElement:!0,transclude:\"element\",priority:600,terminal:!0,restrict:\"A\",$$tlb:!0,link:function(n,r,i,o,a){var s,u,c;n.$watch(i.ngIf,function(n){n?u||a(function(n,o){u=o,n[n.length++]=e.createComment(\" end ngIf: \"+i.ngIf+\" \"),s={clone:n},t.enter(n,r.parent(),r)}):(c&&(c.remove(),c=null),u&&(u.$destroy(),u=null),s&&(c=ut(s.clone),t.leave(c).then(function(){c=null}),s=null))})}}}],uo=[\"$templateRequest\",\"$anchorScroll\",\"$animate\",\"$sce\",function(t,e,n,r){return{restrict:\"ECA\",priority:400,terminal:!0,transclude:\"element\",controller:cr.noop,compile:function(i,o){var a=o.ngInclude||o.src,s=o.onload||\"\",u=o.autoscroll;return function(i,o,c,l,f){var h,$,p,d=0,v=function(){$&&($.remove(),$=null),h&&(h.$destroy(),h=null),p&&(n.leave(p).then(function(){$=null}),$=p,p=null)};i.$watch(r.parseAsResourceUrl(a),function(r){var a=function(){!g(u)||u&&!i.$eval(u)||e()},c=++d;r?(t(r,!0).then(function(t){if(c===d){var e=i.$new();l.template=t;var u=f(e,function(t){v(),n.enter(t,null,o).then(a)});h=e,p=u,h.$emit(\"$includeContentLoaded\",r),i.$eval(s)}},function(){c===d&&(v(),i.$emit(\"$includeContentError\",r))}),i.$emit(\"$includeContentRequested\",r)):(v(),l.template=null)})}}}}],co=[\"$compile\",function(t){return{restrict:\"ECA\",priority:-400,require:\"ngInclude\",link:function(n,r,i,o){return/SVG/.test(r[0].toString())?(r.empty(),void t(gt(o.template,e).childNodes)(n,function(t){r.append(t)},{futureParentElement:r})):(r.html(o.template),void t(r.contents())(n))}}}],lo=On({priority:450,compile:function(){return{pre:function(t,e,n){t.$eval(n.ngInit)}}}}),fo=function(){return{restrict:\"A\",priority:100,require:\"ngModel\",link:function(t,e,r,i){var a=e.attr(r.$attr.ngList)||\", \",s=\"false\"!==r.ngTrim,u=s?$r(a):a,c=function(t){if(!m(t)){var e=[];return t&&o(t.split(u),function(t){t&&e.push(s?$r(t):t)}),e}};i.$parsers.push(c),i.$formatters.push(function(t){return hr(t)?t.join(a):n}),i.$isEmpty=function(t){return!t||!t.length}}}},ho=\"ng-valid\",$o=\"ng-invalid\",po=\"ng-pristine\",vo=\"ng-dirty\",mo=\"ng-untouched\",go=\"ng-touched\",yo=\"ng-pending\",wo=new r(\"ngModel\"),bo=[\"$scope\",\"$exceptionHandler\",\"$attrs\",\"$element\",\"$parse\",\"$animate\",\"$timeout\",\"$rootScope\",\"$q\",\"$interpolate\",function(t,e,r,i,a,s,u,c,l,f){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=n,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=n,this.$name=f(r.name||\"\",!1)(t);var h,$=a(r.ngModel),d=$.assign,v=$,y=d,w=null,x=this;this.$$setOptions=function(t){if(x.$options=t,t&&t.getterSetter){var e=a(r.ngModel+\"()\"),n=a(r.ngModel+\"($$$p)\");v=function(t){var n=$(t);return S(n)&&(n=e(t)),n},y=function(t,e){S($(t))?n(t,{$$$p:x.$modelValue}):d(t,x.$modelValue)}}else if(!$.assign)throw wo(\"nonassign\",\"Expression '{0}' is non-assignable. Element: {1}\",r.ngModel,z(i))},this.$render=p,this.$isEmpty=function(t){return m(t)||\"\"===t||null===t||t!==t};var C=i.inheritedData(\"$formController\")||Vi,A=0;zn({ctrl:this,$element:i,set:function(t,e){t[e]=!0},unset:function(t,e){delete t[e]},parentForm:C,$animate:s}),this.$setPristine=function(){x.$dirty=!1,x.$pristine=!0,s.removeClass(i,vo),s.addClass(i,po)},this.$setDirty=function(){x.$dirty=!0,x.$pristine=!1,s.removeClass(i,po),s.addClass(i,vo),C.$setDirty()},this.$setUntouched=function(){x.$touched=!1,x.$untouched=!0,s.setClass(i,mo,go)},this.$setTouched=function(){x.$touched=!0,x.$untouched=!1,s.setClass(i,go,mo)},this.$rollbackViewValue=function(){u.cancel(w),x.$viewValue=x.$$lastCommittedViewValue,x.$render()},this.$validate=function(){if(!b(x.$modelValue)||!isNaN(x.$modelValue)){var t=x.$$lastCommittedViewValue,e=x.$$rawModelValue,r=x.$valid,i=x.$modelValue,o=x.$options&&x.$options.allowInvalid;x.$$runValidators(e,t,function(t){o||r===t||(x.$modelValue=t?e:n,x.$modelValue!==i&&x.$$writeModelToScope())})}},this.$$runValidators=function(t,e,r){function i(){var t=x.$$parserName||\"parse\";return h!==n?(h||(o(x.$validators,function(t,e){u(e,null)}),o(x.$asyncValidators,function(t,e){u(e,null)})),u(t,h),h):(u(t,null),!0)}function a(){var n=!0;return o(x.$validators,function(r,i){var o=r(t,e);n=n&&o,u(i,o)}),n?!0:(o(x.$asyncValidators,function(t,e){u(e,null)}),!1)}function s(){var r=[],i=!0;o(x.$asyncValidators,function(o,a){var s=o(t,e);if(!N(s))throw wo(\"$asyncValidators\",\"Expected asynchronous validator to return a promise but got '{0}' instead.\",s);u(a,n),r.push(s.then(function(){u(a,!0)},function(t){i=!1,u(a,!1)}))}),r.length?l.all(r).then(function(){c(i)},p):c(!0)}function u(t,e){f===A&&x.$setValidity(t,e)}function c(t){f===A&&r(t)}A++;var f=A;return i()&&a()?void s():void c(!1)},this.$commitViewValue=function(){var t=x.$viewValue;u.cancel(w),(x.$$lastCommittedViewValue!==t||\"\"===t&&x.$$hasNativeValidators)&&(x.$$lastCommittedViewValue=t,x.$pristine&&this.$setDirty(),this.$$parseAndValidate())},this.$$parseAndValidate=function(){function e(){x.$modelValue!==a&&x.$$writeModelToScope()}var r=x.$$lastCommittedViewValue,i=r;if(h=m(i)?n:!0)for(var o=0;o<x.$parsers.length;o++)if(i=x.$parsers[o](i),m(i)){h=!1;break}b(x.$modelValue)&&isNaN(x.$modelValue)&&(x.$modelValue=v(t));var a=x.$modelValue,s=x.$options&&x.$options.allowInvalid;x.$$rawModelValue=i,s&&(x.$modelValue=i,e()),x.$$runValidators(i,x.$$lastCommittedViewValue,function(t){s||(x.$modelValue=t?i:n,e())})},this.$$writeModelToScope=function(){y(t,x.$modelValue),o(x.$viewChangeListeners,function(t){try{t()}catch(n){e(n)}})},this.$setViewValue=function(t,e){x.$viewValue=t,(!x.$options||x.$options.updateOnDefault)&&x.$$debounceViewValueCommit(e)},this.$$debounceViewValueCommit=function(e){var n,r=0,i=x.$options;i&&g(i.debounce)&&(n=i.debounce,b(n)?r=n:b(n[e])?r=n[e]:b(n[\"default\"])&&(r=n[\"default\"])),u.cancel(w),r?w=u(function(){x.$commitViewValue()},r):c.$$phase?x.$commitViewValue():t.$apply(function(){x.$commitViewValue()})},t.$watch(function(){var e=v(t);if(e!==x.$modelValue){x.$modelValue=x.$$rawModelValue=e,h=n;for(var r=x.$formatters,i=r.length,o=e;i--;)o=r[i](o);x.$viewValue!==o&&(x.$viewValue=x.$$lastCommittedViewValue=o,x.$render(),x.$$runValidators(e,o,p))}return e})}],xo=[\"$rootScope\",function(t){return{restrict:\"A\",require:[\"ngModel\",\"^?form\",\"^?ngModelOptions\"],controller:bo,priority:1,compile:function(e){return e.addClass(po).addClass(mo).addClass(ho),{pre:function(t,e,n,r){var i=r[0],o=r[1]||Vi;i.$$setOptions(r[2]&&r[2].$options),o.$addControl(i),n.$observe(\"name\",function(t){i.$name!==t&&o.$$renameControl(i,t)}),t.$on(\"$destroy\",function(){o.$removeControl(i)})},post:function(e,n,r,i){var o=i[0];o.$options&&o.$options.updateOn&&n.on(o.$options.updateOn,function(t){o.$$debounceViewValueCommit(t&&t.type)}),n.on(\"blur\",function(n){o.$touched||(t.$$phase?e.$evalAsync(o.$setTouched):e.$apply(o.$setTouched))})}}}}}],So=/(\\s+|^)default(\\s+|$)/,Co=function(){return{restrict:\"A\",controller:[\"$scope\",\"$attrs\",function(t,e){var r=this;this.$options=t.$eval(e.ngModelOptions),this.$options.updateOn!==n?(this.$options.updateOnDefault=!1,this.$options.updateOn=$r(this.$options.updateOn.replace(So,function(){return r.$options.updateOnDefault=!0,\" \"}))):this.$options.updateOnDefault=!0}]}},Ao=On({terminal:!0,priority:1e3}),Eo=[\"$locale\",\"$interpolate\",function(t,e){var n=/{}/g,r=/^when(Minus)?(.+)$/;return{restrict:\"EA\",link:function(i,a,s){function u(t){a.text(t||\"\")}var c,l=s.count,f=s.$attr.when&&a.attr(s.$attr.when),h=s.offset||0,$=i.$eval(f)||{},p={},d=e.startSymbol(),v=e.endSymbol(),m=d+l+\"-\"+h+v,g=cr.noop;o(s,function(t,e){var n=r.exec(e);if(n){var i=(n[1]?\"-\":\"\")+Jn(n[2]);$[i]=a.attr(s.$attr[e])}}),o($,function(t,r){p[r]=e(t.replace(n,m))}),i.$watch(l,function(e){var n=parseFloat(e),r=isNaN(n);r||n in $||(n=t.pluralCat(n-h)),n===c||r&&isNaN(c)||(g(),g=i.$watch(p[n],u),c=n)})}}}],ko=[\"$parse\",\"$animate\",function(t,a){var s=\"$$NG_REMOVED\",u=r(\"ngRepeat\"),c=function(t,e,n,r,i,o,a){t[n]=r,i&&(t[i]=o),t.$index=e,t.$first=0===e,t.$last=e===a-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&e))},l=function(t){return t.clone[0]},f=function(t){return t.clone[t.clone.length-1]};return{restrict:\"A\",multiElement:!0,transclude:\"element\",priority:1e3,terminal:!0,$$tlb:!0,compile:function(r,h){var $=h.ngRepeat,p=e.createComment(\" end ngRepeat: \"+$+\" \"),d=$.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);if(!d)throw u(\"iexp\",\"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",$);var v=d[1],m=d[2],g=d[3],y=d[4];if(d=v.match(/^(?:(\\s*[\\$\\w]+)|\\(\\s*([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\s*\\))$/),!d)throw u(\"iidexp\",\"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",v);var w=d[3]||d[1],b=d[2];if(g&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(g)||/^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(g)))throw u(\"badident\",\"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",g);var x,S,C,A,E={$id:Ut};return y?x=t(y):(C=function(t,e){return Ut(e)},A=function(t){return t}),function(t,e,r,h,d){x&&(S=function(e,n,r){return b&&(E[b]=e),E[w]=n,E.$index=r,x(t,E)});var v=ct();t.$watchCollection(m,function(r){var h,m,y,x,E,k,O,T,M,N,V,D,j=e[0],R=ct();if(g&&(t[g]=r),i(r))M=r,T=S||C;else{T=S||A,M=[];for(var P in r)r.hasOwnProperty(P)&&\"$\"!=P.charAt(0)&&M.push(P);M.sort()}for(x=M.length,V=new Array(x),h=0;x>h;h++)if(E=r===M?h:M[h],k=r[E],O=T(E,k,h),v[O])N=v[O],delete v[O],R[O]=N,V[h]=N;else{if(R[O])throw o(V,function(t){t&&t.scope&&(v[t.id]=t)}),u(\"dupes\",\"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",$,O,k);V[h]={id:O,scope:n,clone:n},R[O]=!0}for(var _ in v){if(N=v[_],D=ut(N.clone),a.leave(D),D[0].parentNode)for(h=0,m=D.length;m>h;h++)D[h][s]=!0;N.scope.$destroy()}for(h=0;x>h;h++)if(E=r===M?h:M[h],k=r[E],N=V[h],N.scope){y=j;do y=y.nextSibling;while(y&&y[s]);l(N)!=y&&a.move(ut(N.clone),null,er(j)),j=f(N),c(N.scope,h,w,k,b,E,x)}else d(function(t,e){N.scope=e;var n=p.cloneNode(!1);t[t.length++]=n,a.enter(t,null,er(j)),j=n,N.clone=t,R[N.id]=N,c(N.scope,h,w,k,b,E,x)});v=R})}}}}],Oo=\"ng-hide\",To=\"ng-hide-animate\",Mo=[\"$animate\",function(t){return{restrict:\"A\",multiElement:!0,link:function(e,n,r){e.$watch(r.ngShow,function(e){t[e?\"removeClass\":\"addClass\"](n,Oo,{tempClasses:To})})}}}],No=[\"$animate\",function(t){return{restrict:\"A\",multiElement:!0,link:function(e,n,r){e.$watch(r.ngHide,function(e){t[e?\"addClass\":\"removeClass\"](n,Oo,{tempClasses:To})})}}}],Vo=On(function(t,e,n){t.$watchCollection(n.ngStyle,function(t,n){n&&t!==n&&o(n,function(t,n){e.css(n,\"\")}),t&&e.css(t)})}),Do=[\"$animate\",function(t){return{restrict:\"EA\",require:\"ngSwitch\",controller:[\"$scope\",function(){this.cases={}}],link:function(n,r,i,a){var s=i.ngSwitch||i.on,u=[],c=[],l=[],f=[],h=function(t,e){return function(){t.splice(e,1)}};n.$watch(s,function(n){var r,i;for(r=0,i=l.length;i>r;++r)t.cancel(l[r]);for(l.length=0,r=0,i=f.length;i>r;++r){var s=ut(c[r].clone);f[r].$destroy();var $=l[r]=t.leave(s);$.then(h(l,r))}c.length=0,f.length=0,(u=a.cases[\"!\"+n]||a.cases[\"?\"])&&o(u,function(n){n.transclude(function(r,i){f.push(i);var o=n.element;r[r.length++]=e.createComment(\" end ngSwitchWhen: \");var a={clone:r};c.push(a),t.enter(r,o.parent(),o)})})})}}}],jo=On({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(t,e,n,r,i){r.cases[\"!\"+n.ngSwitchWhen]=r.cases[\"!\"+n.ngSwitchWhen]||[],r.cases[\"!\"+n.ngSwitchWhen].push({transclude:i,element:e})}}),Ro=On({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(t,e,n,r,i){r.cases[\"?\"]=r.cases[\"?\"]||[],r.cases[\"?\"].push({transclude:i,element:e})}}),Po=On({restrict:\"EAC\",link:function(t,e,n,i,o){if(!o)throw r(\"ngTransclude\")(\"orphan\",\"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}\",z(e));o(function(t){e.empty(),e.append(t)})}}),_o=[\"$templateCache\",function(t){return{restrict:\"E\",terminal:!0,compile:function(e,n){if(\"text/ng-template\"==n.type){var r=n.id,i=e[0].text;t.put(r,i)}}}}],Io=r(\"ngOptions\"),qo=v({restrict:\"A\",terminal:!0}),Uo=[\"$compile\",\"$parse\",function(t,r){var i=/^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,s={$setViewValue:p};return{restrict:\"E\",require:[\"select\",\"?ngModel\"],controller:[\"$element\",\"$scope\",\"$attrs\",function(t,e,n){var r,i,o=this,a={},u=s;o.databound=n.ngModel,o.init=function(t,e,n){u=t,r=e,i=n},o.addOption=function(e,n){at(e,'\"option value\"'),a[e]=!0,u.$viewValue==e&&(t.val(e),i.parent()&&i.remove()),n&&n[0].hasAttribute(\"selected\")&&(n[0].selected=!0)},o.removeOption=function(t){this.hasOption(t)&&(delete a[t],u.$viewValue===t&&this.renderUnknownOption(t))},o.renderUnknownOption=function(e){var n=\"? \"+Ut(e)+\" ?\";i.val(n),t.prepend(i),t.val(n),i.prop(\"selected\",!0)},o.hasOption=function(t){return a.hasOwnProperty(t)},e.$on(\"$destroy\",function(){o.renderUnknownOption=p})}],link:function(s,u,c,l){function f(t,e,n,r){n.$render=function(){var t=n.$viewValue;r.hasOption(t)?(A.parent()&&A.remove(),e.val(t),\"\"===t&&p.prop(\"selected\",!0)):m(t)&&p?e.val(\"\"):r.renderUnknownOption(t)},e.on(\"change\",function(){t.$apply(function(){A.parent()&&A.remove(),n.$setViewValue(e.val())})})}function h(t,e,n){var r;n.$render=function(){var t=new Ft(n.$viewValue);o(e.find(\"option\"),function(e){e.selected=g(t.get(e.value))})},t.$watch(function(){I(r,n.$viewValue)||(r=_(n.$viewValue),n.$render())}),e.on(\"change\",function(){t.$apply(function(){var t=[];o(e.find(\"option\"),function(e){e.selected&&t.push(e.value)}),n.$setViewValue(t)})})}function $(e,s,u){function c(t,n,r){return I[k]=r,M&&(I[M]=n),t(e,I)}function l(){e.$apply(function(){var t,n=D(e)||[];if(y)t=[],o(s.val(),function(e){e=R?P[e]:e,t.push(f(e,n[e]))});else{var r=R?P[s.val()]:s.val();t=f(r,n[r])}u.$setViewValue(t),m()})}function f(t,e){if(\"?\"===t)return n;if(\"\"===t)return null;var r=T?T:V;return c(r,t,e)}function h(){var t,n=D(e);if(n&&hr(n)){t=new Array(n.length);for(var r=0,i=n.length;i>r;r++)t[r]=c(E,r,n[r]);return t}if(n){t={};for(var o in n)n.hasOwnProperty(o)&&(t[o]=c(E,o,n[o]))}return t}\nfunction $(t){var e;if(y)if(R&&hr(t)){e=new Ft([]);for(var n=0;n<t.length;n++)e.put(c(R,null,t[n]),!0)}else e=new Ft(t);else R&&(t=c(R,null,t));return function(n,r){var i;return i=R?R:T?T:V,y?g(e.remove(c(i,n,r))):t===c(i,n,r)}}function p(){x||(e.$$postDigest(m),x=!0)}function v(t,e,n){t[e]=t[e]||0,t[e]+=n?1:-1}function m(){x=!1;var t,n,r,i,l,f,h,p,m,w,A,k,O,T,V,j,q,U={\"\":[]},F=[\"\"],H=u.$viewValue,B=D(e)||[],L=M?a(B):B,z={},G=$(H),W=!1;for(P={},k=0;w=L.length,w>k;k++)h=k,M&&(h=L[k],\"$\"===h.charAt(0))||(p=B[h],t=c(N,h,p)||\"\",(n=U[t])||(n=U[t]=[],F.push(t)),O=G(h,p),W=W||O,j=c(E,h,p),j=g(j)?j:\"\",q=R?R(e,I):M?L[k]:k,R&&(P[q]=h),n.push({id:q,label:j,selected:O}));for(y||(b||null===H?U[\"\"].unshift({id:\"\",label:\"\",selected:!W}):W||U[\"\"].unshift({id:\"?\",label:\"\",selected:!0})),A=0,m=F.length;m>A;A++){for(t=F[A],n=U[t],_.length<=A?(i={element:C.clone().attr(\"label\",t),label:n.label},l=[i],_.push(l),s.append(i.element)):(l=_[A],i=l[0],i.label!=t&&i.element.attr(\"label\",i.label=t)),T=null,k=0,w=n.length;w>k;k++)r=n[k],(f=l[k+1])?(T=f.element,f.label!==r.label&&(v(z,f.label,!1),v(z,r.label,!0),T.text(f.label=r.label),T.prop(\"label\",f.label)),f.id!==r.id&&T.val(f.id=r.id),T[0].selected!==r.selected&&(T.prop(\"selected\",f.selected=r.selected),tr&&T.prop(\"selected\",f.selected))):(\"\"===r.id&&b?V=b:(V=S.clone()).val(r.id).prop(\"selected\",r.selected).attr(\"selected\",r.selected).prop(\"label\",r.label).text(r.label),l.push(f={element:V,label:r.label,id:r.id,selected:r.selected}),v(z,r.label,!0),T?T.after(V):i.element.append(V),T=V);for(k++;l.length>k;)r=l.pop(),v(z,r.label,!1),r.element.remove()}for(;_.length>A;){for(n=_.pop(),k=1;k<n.length;++k)v(z,n[k].label,!1);n[0].element.remove()}o(z,function(t,e){t>0?d.addOption(e):0>t&&d.removeOption(e)})}var A;if(!(A=w.match(i)))throw Io(\"iexp\",\"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}\",w,z(s));var E=r(A[2]||A[1]),k=A[4]||A[6],O=/ as /.test(A[0])&&A[1],T=O?r(O):null,M=A[5],N=r(A[3]||\"\"),V=r(A[2]?A[1]:k),D=r(A[7]),j=A[8],R=j?r(A[8]):null,P={},_=[[{element:s,label:\"\"}]],I={};b&&(t(b)(e),b.removeClass(\"ng-scope\"),b.remove()),s.empty(),s.on(\"change\",l),u.$render=m,e.$watchCollection(D,p),e.$watchCollection(h,p),y&&e.$watchCollection(function(){return u.$modelValue},p)}if(l[1]){for(var p,d=l[0],v=l[1],y=c.multiple,w=c.ngOptions,b=!1,x=!1,S=er(e.createElement(\"option\")),C=er(e.createElement(\"optgroup\")),A=S.clone(),E=0,k=u.children(),O=k.length;O>E;E++)if(\"\"===k[E].value){p=b=k.eq(E);break}d.init(v,b,A),y&&(v.$isEmpty=function(t){return!t||0===t.length}),w?$(s,u,v):y?h(s,u,v):f(s,u,v,d)}}}}],Fo=[\"$interpolate\",function(t){var e={addOption:p,removeOption:p};return{restrict:\"E\",priority:100,compile:function(n,r){if(m(r.value)){var i=t(n.text(),!0);i||r.$set(\"value\",n.text())}return function(t,n,r){var o=\"$selectController\",a=n.parent(),s=a.data(o)||a.parent().data(o);s&&s.databound||(s=e),i?t.$watch(i,function(t,e){r.$set(\"value\",t),e!==t&&s.removeOption(e),s.addOption(t,n)}):s.addOption(r.value,n),n.on(\"$destroy\",function(){s.removeOption(r.value)})}}}}],Ho=v({restrict:\"E\",terminal:!1}),Bo=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(t,e,n,r){r&&(n.required=!0,r.$validators.required=function(t,e){return!n.required||!r.$isEmpty(e)},n.$observe(\"required\",function(){r.$validate()}))}}},Lo=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(t,e,i,o){if(o){var a,s=i.ngPattern||i.pattern;i.$observe(\"pattern\",function(t){if(w(t)&&t.length>0&&(t=new RegExp(\"^\"+t+\"$\")),t&&!t.test)throw r(\"ngPattern\")(\"noregexp\",\"Expected {0} to be a RegExp but was {1}. Element: {2}\",s,t,z(e));a=t||n,o.$validate()}),o.$validators.pattern=function(t){return o.$isEmpty(t)||m(a)||a.test(t)}}}}},zo=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(t,e,n,r){if(r){var i=-1;n.$observe(\"maxlength\",function(t){var e=h(t);i=isNaN(e)?-1:e,r.$validate()}),r.$validators.maxlength=function(t,e){return 0>i||r.$isEmpty(e)||e.length<=i}}}}},Go=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(t,e,n,r){if(r){var i=0;n.$observe(\"minlength\",function(t){i=h(t)||0,r.$validate()}),r.$validators.minlength=function(t,e){return r.$isEmpty(e)||e.length>=i}}}}};return t.angular.bootstrap?void console.log(\"WARNING: Tried to load angular more than once.\"):(rt(),$t(cr),void er(e).ready(function(){X(e,Q)}))}(window,document),!window.angular.$$csp()&&window.angular.element(document).find(\"head\").prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}</style>');\n!function(o,n,e){\"use strict\";n.module(\"ngCookies\",[\"ng\"]).factory(\"$cookies\",[\"$rootScope\",\"$browser\",function(o,i){function r(){var o,r,t,u;for(o in f)a(c[o])&&i.cookies(o,e);for(o in c)r=c[o],n.isString(r)||(r=\"\"+r,c[o]=r),r!==f[o]&&(i.cookies(o,r),u=!0);if(u){u=!1,t=i.cookies();for(o in c)c[o]!==t[o]&&(a(t[o])?delete c[o]:c[o]=t[o],u=!0)}}var t,c={},f={},u=!1,s=n.copy,a=n.isUndefined;return i.addPollFn(function(){var n=i.cookies();t!=n&&(t=n,s(n,f),s(n,c),u&&o.$apply())})(),u=!0,o.$watch(r),c}]).factory(\"$cookieStore\",[\"$cookies\",function(o){return{get:function(e){var i=o[e];return i?n.fromJson(i):i},put:function(e,i){o[e]=n.toJson(i)},remove:function(n){delete o[n]}}}])}(window,window.angular);\n!function(n,t,e){\"use strict\";t.module(\"ngAnimate\",[\"ng\"]).directive(\"ngAnimateChildren\",function(){var n=\"$$ngAnimateChildren\";return function(e,a,i){var r=i.ngAnimateChildren;t.isString(r)&&0===r.length?a.data(n,!0):e.$watch(r,function(t){a.data(n,!!t)})}}).factory(\"$$animateReflow\",[\"$$rAF\",\"$document\",function(n,t){var e=t[0].body;return function(t){return n(function(){e.offsetWidth+1;t()})}}]).config([\"$provide\",\"$animateProvider\",function(a,i){function r(n){for(var t=0;t<n.length;t++){var e=n[t];if(e.nodeType==p)return e}}function s(n){return n&&t.element(n)}function o(n){return t.element(r(n))}function u(n,t){return r(n)==r(t)}var l,c=t.noop,f=t.forEach,v=i.$$selectors,d=t.isArray,m=t.isString,g=t.isObject,p=1,C=\"$$ngAnimateState\",h=\"$$ngAnimateChildren\",$=\"ng-animate\",b={running:!0};a.decorator(\"$animate\",[\"$delegate\",\"$$q\",\"$injector\",\"$sniffer\",\"$rootElement\",\"$$asyncCallback\",\"$rootScope\",\"$document\",\"$templateRequest\",\"$$jqLite\",function(n,e,a,p,y,D,A,w,k,x){function S(n,t){var e=n.data(C)||{};return t&&(e.running=!0,e.structural=!0,n.data(C,e)),e.disabled||e.running&&e.structural}function B(n){var t,a=e.defer();return a.promise.$$cancelFn=function(){t&&t()},A.$$postDigest(function(){t=n(function(){a.resolve()})}),a.promise}function F(n){return g(n)?(n.tempClasses&&m(n.tempClasses)&&(n.tempClasses=n.tempClasses.split(/\\s+/)),n):void 0}function M(n,t,e){e=e||{};var a={};f(e,function(n,t){f(t.split(\" \"),function(t){a[t]=n})});var i=Object.create(null);f((n.attr(\"class\")||\"\").split(/\\s+/),function(n){i[n]=!0});var r=[],s=[];return f(t&&t.classes||[],function(n,t){var e=i[t],o=a[t]||{};n===!1?(e||\"addClass\"==o.event)&&s.push(t):n===!0&&(e&&\"removeClass\"!=o.event||r.push(t))}),r.length+s.length>0&&[r.join(\" \"),s.join(\" \")]}function E(n){if(n){var t=[],e={},i=n.substr(1).split(\".\");(p.transitions||p.animations)&&t.push(a.get(v[\"\"]));for(var r=0;r<i.length;r++){var s=i[r],o=v[s];o&&!e[s]&&(t.push(a.get(o)),e[s]=!0)}return t}}function R(n,e,a,i){function r(n,t){var e=n[t],a=n[\"before\"+t.charAt(0).toUpperCase()+t.substr(1)];return e||a?(\"leave\"==t&&(a=e,e=null),D.push({event:t,fn:e}),$.push({event:t,fn:a}),!0):void 0}function s(t,e,r){function s(n){if(e){if((e[n]||c)(),++v<o.length)return;e=null}r()}var o=[];f(t,function(n){n.fn&&o.push(n)});var v=0;f(o,function(t,r){var o=function(){s(r)};switch(t.event){case\"setClass\":e.push(t.fn(n,u,l,o,i));break;case\"animate\":e.push(t.fn(n,a,i.from,i.to,o));break;case\"addClass\":e.push(t.fn(n,u||a,o,i));break;case\"removeClass\":e.push(t.fn(n,l||a,o,i));break;default:e.push(t.fn(n,o,i))}}),e&&0===e.length&&r()}var o=n[0];if(o){i&&(i.to=i.to||{},i.from=i.from||{});var u,l;d(a)&&(u=a[0],l=a[1],u?l?a=u+\" \"+l:(a=u,e=\"addClass\"):(a=l,e=\"removeClass\"));var v=\"setClass\"==e,m=v||\"addClass\"==e||\"removeClass\"==e||\"animate\"==e,g=n.attr(\"class\"),p=g+\" \"+a;if(K(p)){var C=c,h=[],$=[],b=c,y=[],D=[],A=(\" \"+p).replace(/\\s+/g,\".\");return f(E(A),function(n){var t=r(n,e);!t&&v&&(r(n,\"addClass\"),r(n,\"removeClass\"))}),{node:o,event:e,className:a,isClassBased:m,isSetClassOperation:v,applyStyles:function(){i&&n.css(t.extend(i.from||{},i.to||{}))},before:function(n){C=n,s($,h,function(){C=c,n()})},after:function(n){b=n,s(D,y,function(){b=c,n()})},cancel:function(){h&&(f(h,function(n){(n||c)(!0)}),C(!0)),y&&(f(y,function(n){(n||c)(!0)}),b(!0))}}}}}function N(n,e,a,i,r,s,o,u){function v(t){var i=\"$animate:\"+t;A&&A[i]&&A[i].length>0&&D(function(){a.triggerHandler(i,{event:n,className:e})})}function d(){v(\"before\")}function m(){v(\"after\")}function g(){v(\"close\"),u()}function p(){p.hasBeenRun||(p.hasBeenRun=!0,s())}function h(){if(!h.hasBeenRun){y&&y.applyStyles(),h.hasBeenRun=!0,o&&o.tempClasses&&f(o.tempClasses,function(n){l.removeClass(a,n)});var t=a.data(C);t&&(y&&y.isClassBased?T(a,e):(D(function(){var t=a.data(C)||{};N==t.index&&T(a,e,n)}),a.data(C,t))),g()}}var b=c,y=R(a,n,e,o);if(!y)return p(),d(),m(),h(),b;n=y.event,e=y.className;var A=t.element._data(y.node);if(A=A&&A.events,i||(i=r?r.parent():a.parent()),j(a,i))return p(),d(),m(),h(),b;var w=a.data(C)||{},k=w.active||{},x=w.totalActive||0,S=w.last,B=!1;if(x>0){var F=[];if(y.isClassBased){if(\"setClass\"==S.event)F.push(S),T(a,e);else if(k[e]){var M=k[e];M.event==n?B=!0:(F.push(M),T(a,e))}}else if(\"leave\"==n&&k[\"ng-leave\"])B=!0;else{for(var E in k)F.push(k[E]);w={},T(a,!0)}F.length>0&&f(F,function(n){n.cancel()})}if(!y.isClassBased||y.isSetClassOperation||\"animate\"==n||B||(B=\"addClass\"==n==a.hasClass(e)),B)return p(),d(),m(),g(),b;k=w.active||{},x=w.totalActive||0,\"leave\"==n&&a.one(\"$destroy\",function(n){var e=t.element(this),a=e.data(C);if(a){var i=a.active[\"ng-leave\"];i&&(i.cancel(),T(e,\"ng-leave\"))}}),l.addClass(a,$),o&&o.tempClasses&&f(o.tempClasses,function(n){l.addClass(a,n)});var N=P++;return x++,k[e]=y,a.data(C,{last:y,active:k,index:N,totalActive:x}),d(),y.before(function(t){var i=a.data(C);t=t||!i||!i.active[e]||y.isClassBased&&i.active[e].event!=n,p(),t===!0?h():(m(),y.after(h))}),y.cancel}function O(n){var e=r(n);if(e){var a=t.isFunction(e.getElementsByClassName)?e.getElementsByClassName($):e.querySelectorAll(\".\"+$);f(a,function(n){n=t.element(n);var e=n.data(C);e&&e.active&&f(e.active,function(n){n.cancel()})})}}function T(n,t){if(u(n,y))b.disabled||(b.running=!1,b.structural=!1);else if(t){var e=n.data(C)||{},a=t===!0;!a&&e.active&&e.active[t]&&(e.totalActive--,delete e.active[t]),(a||!e.totalActive)&&(l.removeClass(n,$),n.removeData(C))}}function j(n,e){if(b.disabled)return!0;if(u(n,y))return b.running;var a,i,r;do{if(0===e.length)break;var s=u(e,y),o=s?b:e.data(C)||{};if(o.disabled)return!0;if(s&&(r=!0),a!==!1){var l=e.data(h);t.isDefined(l)&&(a=l)}i=i||o.running||o.last&&!o.last.isClassBased}while(e=e.parent());return!r||!a&&i}l=x,y.data(C,b);var I=A.$watch(function(){return k.totalPendingRequests},function(n,t){0===n&&(I(),A.$$postDigest(function(){A.$$postDigest(function(){b.running=!1})}))}),P=0,q=i.classNameFilter(),K=q?function(n){return q.test(n)}:function(){return!0};return{animate:function(n,t,e,a,i){return a=a||\"ng-inline-animate\",i=F(i)||{},i.from=e?t:null,i.to=e?e:t,B(function(t){return N(\"animate\",a,o(n),null,null,c,i,t)})},enter:function(e,a,i,r){return r=F(r),e=t.element(e),a=s(a),i=s(i),S(e,!0),n.enter(e,a,i),B(function(n){return N(\"enter\",\"ng-enter\",o(e),a,i,c,r,n)})},leave:function(e,a){return a=F(a),e=t.element(e),O(e),S(e,!0),B(function(t){return N(\"leave\",\"ng-leave\",o(e),null,null,function(){n.leave(e)},a,t)})},move:function(e,a,i,r){return r=F(r),e=t.element(e),a=s(a),i=s(i),O(e),S(e,!0),n.move(e,a,i),B(function(n){return N(\"move\",\"ng-move\",o(e),a,i,c,r,n)})},addClass:function(n,t,e){return this.setClass(n,t,[],e)},removeClass:function(n,t,e){return this.setClass(n,[],t,e)},setClass:function(e,a,i,s){s=F(s);var u=\"$$animateClasses\";if(e=t.element(e),e=o(e),S(e))return n.$$setClassImmediately(e,a,i,s);var l,c=e.data(u),v=!!c;return c||(c={},c.classes={}),l=c.classes,a=d(a)?a:a.split(\" \"),f(a,function(n){n&&n.length&&(l[n]=!0)}),i=d(i)?i:i.split(\" \"),f(i,function(n){n&&n.length&&(l[n]=!1)}),v?(s&&c.options&&(c.options=t.extend(c.options||{},s)),c.promise):(e.data(u,c={classes:l,options:s}),c.promise=B(function(t){var a=e.parent(),i=r(e),s=i.parentNode;if(!s||s.$$NG_REMOVED||i.$$NG_REMOVED)return void t();var o=e.data(u);e.removeData(u);var l=e.data(C)||{},c=M(e,o,l.active);return c?N(\"setClass\",c,e,a,null,function(){c[0]&&n.$$addClassImmediately(e,c[0]),c[1]&&n.$$removeClassImmediately(e,c[1])},o.options,t):t()}))},cancel:function(n){n.$$cancelFn()},enabled:function(n,t){switch(arguments.length){case 2:if(n)T(t);else{var e=t.data(C)||{};e.disabled=!0,t.data(C,e)}break;case 1:b.disabled=!n;break;default:n=!b.disabled}return!!n}}}]),i.register(\"\",[\"$window\",\"$sniffer\",\"$timeout\",\"$$animateReflow\",function(a,i,s,o){function u(){T||(T=o(function(){z=[],T=null,L={}}))}function v(n,t){T&&T(),z.push(t),T=o(function(){f(z,function(n){n()}),z=[],T=null,L={}})}function g(n,e){var a=r(n);n=t.element(a),X.push(n);var i=Date.now()+e;Q>=i||(s.cancel(J),Q=i,J=s(function(){C(X),X=[]},e,!1))}function C(n){f(n,function(n){var t=n.data(_);t&&f(t.closeAnimationFns,function(n){n()})})}function h(n,t){var e=t?L[t]:null;if(!e){var i=0,r=0,s=0,o=0;f(n,function(n){if(n.nodeType==p){var t=a.getComputedStyle(n)||{},e=t[M+j];i=Math.max($(e),i);var u=t[M+P];r=Math.max($(u),r);t[R+P];o=Math.max($(t[R+P]),o);var l=$(t[R+j]);l>0&&(l*=parseInt(t[R+q],10)||1),s=Math.max(l,s)}}),e={total:0,transitionDelay:r,transitionDuration:i,animationDelay:o,animationDuration:s},t&&(L[t]=e)}return e}function $(n){var t=0,e=m(n)?n.split(/\\s*,\\s*/):[];return f(e,function(n){t=Math.max(parseFloat(n)||0,t)}),t}function b(n){var t=n.parent(),e=t.data(W);return e||(t.data(W,++U),e=U),e+\"-\"+r(n).getAttribute(\"class\")}function y(n,t,e,a){var i=[\"ng-enter\",\"ng-leave\",\"ng-move\"].indexOf(e)>=0,s=b(t),o=s+\" \"+e,u=L[o]?++L[o].total:0,c={};if(u>0){var f=e+\"-stagger\",v=s+\" \"+f,d=!L[v];d&&l.addClass(t,f),c=h(t,v),d&&l.removeClass(t,f)}l.addClass(t,e);var m=t.data(_)||{},g=h(t,o),p=g.transitionDuration,C=g.animationDuration;if(i&&0===p&&0===C)return l.removeClass(t,e),!1;var $=a||i&&p>0,y=C>0&&c.animationDelay>0&&0===c.animationDuration,D=m.closeAnimationFns||[];t.data(_,{stagger:c,cacheKey:o,running:m.running||0,itemIndex:u,blockTransition:$,closeAnimationFns:D});var k=r(t);return $&&(A(k,!0),a&&t.css(a)),y&&w(k,!0),!0}function D(n,t,e,a,i){function o(){t.off(P,u),l.removeClass(t,d),l.removeClass(t,m),j&&s.cancel(j),B(t,e);var n=r(t);for(var a in C)n.style.removeProperty(C[a])}function u(n){n.stopPropagation();var t=n.originalEvent||n,e=t.$manualTimeStamp||t.timeStamp||Date.now(),i=parseFloat(t.elapsedTime.toFixed(G));Math.max(e-I,0)>=R&&i>=F&&a()}var c=r(t),v=t.data(_);if(-1==c.getAttribute(\"class\").indexOf(e)||!v)return void a();var d=\"\",m=\"\";f(e.split(\" \"),function(n,t){var e=(t>0?\" \":\"\")+n;d+=e+\"-active\",m+=e+\"-pending\"});var p=\"\",C=[],$=v.itemIndex,b=v.stagger,y=0;if($>0){var D=0;b.transitionDelay>0&&0===b.transitionDuration&&(D=b.transitionDelay*$);var k=0;b.animationDelay>0&&0===b.animationDuration&&(k=b.animationDelay*$,C.push(O+\"animation-play-state\")),y=Math.round(100*Math.max(D,k))/100}y||(l.addClass(t,d),v.blockTransition&&A(c,!1));var x=v.cacheKey+\" \"+d,S=h(t,x),F=Math.max(S.transitionDuration,S.animationDuration);if(0===F)return l.removeClass(t,d),B(t,e),void a();!y&&i&&Object.keys(i).length>0&&(S.transitionDuration||(t.css(\"transition\",S.animationDuration+\"s linear all\"),C.push(\"transition\")),t.css(i));var M=Math.max(S.transitionDelay,S.animationDelay),R=M*H;if(C.length>0){var T=c.getAttribute(\"style\")||\"\";\";\"!==T.charAt(T.length-1)&&(T+=\";\"),c.setAttribute(\"style\",T+\" \"+p)}var j,I=Date.now(),P=N+\" \"+E,q=(M+F)*V,K=(y+q)*H;return y>0&&(l.addClass(t,m),j=s(function(){j=null,S.transitionDuration>0&&A(c,!1),S.animationDuration>0&&w(c,!1),l.addClass(t,d),l.removeClass(t,m),i&&(0===S.transitionDuration&&t.css(\"transition\",S.animationDuration+\"s linear all\"),t.css(i),C.push(\"transition\"))},y*H,!1)),t.on(P,u),v.closeAnimationFns.push(function(){o(),a()}),v.running++,g(t,K),o}function A(n,t){n.style[M+I]=t?\"none\":\"\"}function w(n,t){n.style[R+K]=t?\"paused\":\"\"}function k(n,t,e,a){return y(n,t,e,a)?function(n){n&&B(t,e)}:void 0}function x(n,t,e,a,i){return t.data(_)?D(n,t,e,a,i):(B(t,e),void a())}function S(n,t,e,a,i){var r=k(n,t,e,i.from);if(!r)return u(),void a();var s=r;return v(t,function(){s=x(n,t,e,a,i.to)}),function(n){(s||c)(n)}}function B(n,t){l.removeClass(n,t);var e=n.data(_);e&&(e.running&&e.running--,e.running&&0!==e.running||n.removeData(_))}function F(n,t){var e=\"\";return n=d(n)?n:n.split(/\\s+/),f(n,function(n,a){n&&n.length>0&&(e+=(a>0?\" \":\"\")+n+t)}),e}var M,E,R,N,O=\"\";n.ontransitionend===e&&n.onwebkittransitionend!==e?(O=\"-webkit-\",M=\"WebkitTransition\",E=\"webkitTransitionEnd transitionend\"):(M=\"transition\",E=\"transitionend\"),n.onanimationend===e&&n.onwebkitanimationend!==e?(O=\"-webkit-\",R=\"WebkitAnimation\",N=\"webkitAnimationEnd animationend\"):(R=\"animation\",N=\"animationend\");var T,j=\"Duration\",I=\"Property\",P=\"Delay\",q=\"IterationCount\",K=\"PlayState\",W=\"$$ngAnimateKey\",_=\"$$ngAnimateCSS3Data\",G=3,V=1.5,H=1e3,L={},U=0,z=[],J=null,Q=0,X=[];return{animate:function(n,t,e,a,i,r){return r=r||{},r.from=e,r.to=a,S(\"animate\",n,t,i,r)},enter:function(n,t,e){return e=e||{},S(\"enter\",n,\"ng-enter\",t,e)},leave:function(n,t,e){return e=e||{},S(\"leave\",n,\"ng-leave\",t,e)},move:function(n,t,e){return e=e||{},S(\"move\",n,\"ng-move\",t,e)},beforeSetClass:function(n,t,e,a,i){i=i||{};var r=F(e,\"-remove\")+\" \"+F(t,\"-add\"),s=k(\"setClass\",n,r,i.from);return s?(v(n,a),s):(u(),void a())},beforeAddClass:function(n,t,e,a){a=a||{};var i=k(\"addClass\",n,F(t,\"-add\"),a.from);return i?(v(n,e),i):(u(),void e())},beforeRemoveClass:function(n,t,e,a){a=a||{};var i=k(\"removeClass\",n,F(t,\"-remove\"),a.from);return i?(v(n,e),i):(u(),void e())},setClass:function(n,t,e,a,i){i=i||{},e=F(e,\"-remove\"),t=F(t,\"-add\");var r=e+\" \"+t;return x(\"setClass\",n,r,a,i.to)},addClass:function(n,t,e,a){return a=a||{},x(\"addClass\",n,F(t,\"-add\"),e,a.to)},removeClass:function(n,t,e,a){return a=a||{},x(\"removeClass\",n,F(t,\"-remove\"),e,a.to)}}}])}])}(window,window.angular);\n\"use strict\";angular.module(\"yaru22.jsonHuman\",[\"yaru22.jsonHuman.tmpls\"]).factory(\"RecursionHelper\",[\"$compile\",function(t){var e={compile:function(e){var n,s=e.contents().remove();return function(e,a){n||(n=t(s)),n(e,function(t){a.append(t)});var r=e.json;e.isBoolean=_.isBoolean(r),e.isNumber=_.isNumber(r),e.isString=_.isString(r),e.isPrimitive=e.isBoolean||e.isNumber||e.isString,e.isObject=_.isPlainObject(r),e.isArray=_.isArray(r),e.isEmpty=_.isEmpty(r)}}};return e}]).directive(\"jsonHuman\",function(){return{restrict:\"A\",scope:{data:\"=jsonHuman\"},templateUrl:\"template/angular-json-human-root.tmpl\",link:function(t){t.$watch(\"data\",function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(n){}t.json=e,t.isObject=_.isPlainObject(e),t.isArray=_.isArray(e)})}}}).directive(\"jsonHumanHelper\",[\"RecursionHelper\",function(t){return{restrict:\"A\",scope:{json:\"=jsonHumanHelper\"},templateUrl:\"template/angular-json-human.tmpl\",compile:function(e){return t.compile(e)}}}]),angular.module(\"yaru22.jsonHuman.tmpls\",[]).run([\"$templateCache\",function(t){t.put(\"template/angular-json-human-root.tmpl\",\"<table class=jh-root ng-class=\\\"{ 'jh-type-array': isArray, 'jh-type-object': isObject }\\\" json-human-helper=json></table>\"),t.put(\"template/angular-json-human.tmpl\",\"<span ng-if=isPrimitive ng-class=\\\"{ 'jh-type-bool': isBoolean, 'jh-type-number': isNumber, 'jh-type-string': isString, 'jh-type-array': isArray, 'jh-type-object': isObject }\\\">{{ json }} <span ng-if=\\\"isEmpty && isString\\\" class=jh-empty>(Empty String)</span></span> <span ng-if=\\\"isEmpty && isArray\\\" class=jh-empty>(Empty List)</span> <span ng-if=\\\"isEmpty && isObject\\\" class=jh-empty>(Empty Object)</span><table ng-if=\\\"!isEmpty && !isPrimitive\\\" ng-class=\\\"{ 'jh-type-array': isArray, 'jh-type-object': isObject }\\\"><tbody><tr ng-repeat=\\\"(key, val) in json track by $index\\\"><th class=jh-key ng-class=\\\"{ 'jh-array-key': isArray, 'jh-object-key': isObject }\\\">{{ key }}</th><td class=jh-value ng-class=\\\"{ 'jh-array-value': isArray, 'jh-object-value': isObject }\\\" json-human-helper=val></td></tr></tbody></table>\")}]);\n!function(e,r,t){\"use strict\";function n(){function e(e,t){return r.extend(Object.create(e),t)}function t(e,r){var t=r.caseInsensitiveMatch,n={originalPath:e,regexp:e},a=n.keys=[];return e=e.replace(/([().])/g,\"\\\\$1\").replace(/(\\/)?:(\\w+)([\\?\\*])?/g,function(e,r,t,n){var o=\"?\"===n?n:null,i=\"*\"===n?n:null;return a.push({name:t,optional:!!o}),r=r||\"\",\"\"+(o?\"\":r)+\"(?:\"+(o?r:\"\")+(i&&\"(.+?)\"||\"([^/]+)\")+(o||\"\")+\")\"+(o||\"\")}).replace(/([\\/$\\*])/g,\"\\\\$1\"),n.regexp=new RegExp(\"^\"+e+\"$\",t?\"i\":\"\"),n}var n={};this.when=function(e,a){var o=r.copy(a);if(r.isUndefined(o.reloadOnSearch)&&(o.reloadOnSearch=!0),r.isUndefined(o.caseInsensitiveMatch)&&(o.caseInsensitiveMatch=this.caseInsensitiveMatch),n[e]=r.extend(o,e&&t(e,o)),e){var i=\"/\"==e[e.length-1]?e.substr(0,e.length-1):e+\"/\";n[i]=r.extend({redirectTo:e},t(i,o))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(e){return\"string\"==typeof e&&(e={redirectTo:e}),this.when(null,e),this},this.$get=[\"$rootScope\",\"$location\",\"$routeParams\",\"$q\",\"$injector\",\"$templateRequest\",\"$sce\",function(t,a,o,i,c,l,s){function h(e,r){var t=r.keys,n={};if(!r.regexp)return null;var a=r.regexp.exec(e);if(!a)return null;for(var o=1,i=a.length;i>o;++o){var c=t[o-1],u=a[o];c&&u&&(n[c.name]=u)}return n}function $(e){var n=w.current;v=f(),m=v&&n&&v.$$route===n.$$route&&r.equals(v.pathParams,n.pathParams)&&!v.reloadOnSearch&&!g,m||!n&&!v||t.$broadcast(\"$routeChangeStart\",v,n).defaultPrevented&&e&&e.preventDefault()}function p(){var e=w.current,n=v;m?(e.params=n.params,r.copy(e.params,o),t.$broadcast(\"$routeUpdate\",e)):(n||e)&&(g=!1,w.current=n,n&&n.redirectTo&&(r.isString(n.redirectTo)?a.path(d(n.redirectTo,n.params)).search(n.params).replace():a.url(n.redirectTo(n.pathParams,a.path(),a.search())).replace()),i.when(n).then(function(){if(n){var e,t,a=r.extend({},n.resolve);return r.forEach(a,function(e,t){a[t]=r.isString(e)?c.get(e):c.invoke(e,null,null,t)}),r.isDefined(e=n.template)?r.isFunction(e)&&(e=e(n.params)):r.isDefined(t=n.templateUrl)&&(r.isFunction(t)&&(t=t(n.params)),t=s.getTrustedResourceUrl(t),r.isDefined(t)&&(n.loadedTemplateUrl=t,e=l(t))),r.isDefined(e)&&(a.$template=e),i.all(a)}}).then(function(a){n==w.current&&(n&&(n.locals=a,r.copy(n.params,o)),t.$broadcast(\"$routeChangeSuccess\",n,e))},function(r){n==w.current&&t.$broadcast(\"$routeChangeError\",n,e,r)}))}function f(){var t,o;return r.forEach(n,function(n,i){!o&&(t=h(a.path(),n))&&(o=e(n,{params:r.extend({},a.search(),t),pathParams:t}),o.$$route=n)}),o||n[null]&&e(n[null],{params:{},pathParams:{}})}function d(e,t){var n=[];return r.forEach((e||\"\").split(\":\"),function(e,r){if(0===r)n.push(e);else{var a=e.match(/(\\w+)(?:[?*])?(.*)/),o=a[1];n.push(t[o]),n.push(a[2]||\"\"),delete t[o]}}),n.join(\"\")}var v,m,g=!1,w={routes:n,reload:function(){g=!0,t.$evalAsync(function(){$(),p()})},updateParams:function(e){if(!this.current||!this.current.$$route)throw u(\"norout\",\"Tried updating route when with no current route\");e=r.extend({},this.current.params,e),a.path(d(this.current.$$route.originalPath,e)),a.search(e)}};return t.$on(\"$locationChangeStart\",$),t.$on(\"$locationChangeSuccess\",p),w}]}function a(){this.$get=function(){return{}}}function o(e,t,n){return{restrict:\"ECA\",terminal:!0,priority:400,transclude:\"element\",link:function(a,o,i,c,u){function l(){p&&(n.cancel(p),p=null),h&&(h.$destroy(),h=null),$&&(p=n.leave($),p.then(function(){p=null}),$=null)}function s(){var i=e.current&&e.current.locals,c=i&&i.$template;if(r.isDefined(c)){var s=a.$new(),p=e.current,v=u(s,function(e){n.enter(e,null,$||o).then(function(){!r.isDefined(f)||f&&!a.$eval(f)||t()}),l()});$=v,h=p.scope=s,h.$emit(\"$viewContentLoaded\"),h.$eval(d)}else l()}var h,$,p,f=i.autoscroll,d=i.onload||\"\";a.$on(\"$routeChangeSuccess\",s),s()}}}function i(e,r,t){return{restrict:\"ECA\",priority:-400,link:function(n,a){var o=t.current,i=o.locals;a.html(i.$template);var c=e(a.contents());if(o.controller){i.$scope=n;var u=r(o.controller,i);o.controllerAs&&(n[o.controllerAs]=u),a.data(\"$ngControllerController\",u),a.children().data(\"$ngControllerController\",u)}c(n)}}}var c=r.module(\"ngRoute\",[\"ng\"]).provider(\"$route\",n),u=r.$$minErr(\"ngRoute\");c.provider(\"$routeParams\",a),c.directive(\"ngView\",o),c.directive(\"ngView\",i),o.$inject=[\"$route\",\"$anchorScroll\",\"$animate\"],i.$inject=[\"$compile\",\"$controller\",\"$route\"]}(window,window.angular);\n\"use strict\";!function(e){var t=e.module(\"door3.css\",[]);t.config([\"$logProvider\",function(e){e.debugEnabled(!1)}]),t.provider(\"$css\",[function(){var t=this.defaults={element:\"link\",rel:\"stylesheet\",type:\"text/css\",container:\"head\",method:\"append\",weight:0};this.$get=[\"$rootScope\",\"$injector\",\"$q\",\"$window\",\"$timeout\",\"$compile\",\"$http\",\"$filter\",\"$log\",function(s,n,o,i,c,u,a,h,f){function d(e,t,r){r&&t.hasOwnProperty(\"css\")&&A.bind([m(t.css)],r)}function l(e,t,r){r&&(A.remove(A.getFromRoute(r).concat(O)),O.length=0),t&&A.add(A.getFromRoute(t))}function p(e,t,r,s){s&&(A.remove(A.getFromState(s).concat(O)),O.length=0),t&&A.add(A.getFromState(t))}function y(t){e.isDefined(w.breakpoints)&&(t.breakpoint in w.breakpoints&&(t.media=w.breakpoints[t.breakpoint]),delete t.breakpoints)}function m(t){return t?(e.isFunction(t)&&(t=e.copy(n.invoke(t))),e.isString(t)&&(t=e.extend({href:t},w)),e.isArray(t)&&e.isString(t[0])&&e.forEach(t,function(r){t=e.extend({href:r},w)}),e.isObject(t)&&!e.isArray(t)&&(t=e.extend(t,w)),e.isArray(t)&&e.isObject(t[0])&&e.forEach(t,function(r){t=e.extend(r,w)}),y(t),t):void 0}function v(e){if(!e)return f.error(\"No stylesheets provided\");var t=\"?cache=\";-1===e.href.indexOf(t)&&(e.href=e.href+(e.bustCache?t+(new Date).getTime():\"\"))}function g(e,t){return e&&t?h(\"filter\")(e,function(e){return e[t]}):f.error(\"filterBy: missing array or property\")}function $(e){return e?(S[e.href]=i.matchMedia(e.media),N[e.href]=function(t){c(function(){if(t.matches)s.stylesheets.push(e);else{var r=s.stylesheets.indexOf(h(\"filter\")(s.stylesheets,{href:e.href})[0]);-1!==r&&s.stylesheets.splice(r,1)}})},S[e.href].addListener(N[e.href]),void N[e.href](S[e.href])):f.error(\"No stylesheet provided\")}function F(t){return t?void(s&&e.isDefined(S)&&S[t.href]&&e.isDefined(N)&&S[t.href].removeListener(N[t.href])):f.error(\"No stylesheet provided\")}function b(e){return e?!(!e.media||-1!==k.indexOf(e.media)||!i.matchMedia):f.error(\"No stylesheet provided\")}var A={},E='<link ng-repeat=\"stylesheet in stylesheets track by $index | orderBy: \\'weight\\' \" rel=\"{{ stylesheet.rel }}\" type=\"{{ stylesheet.type }}\" ng-href=\"{{ stylesheet.href }}\" ng-attr-media=\"{{ stylesheet.media }}\">',S={},N={},k=[\"print\"],w=e.extend({},t),x=e.element(document.querySelector?document.querySelector(w.container):document.getElementsByTagName(w.container)[0]),O=[];return e.forEach(r,function(e,t){e.hasOwnProperty(\"css\")&&(r[t]=m(e.css))}),s.stylesheets=[],x[w.method](u(E)(s)),s.$on(\"$directiveAdd\",d),s.$on(\"$routeChangeSuccess\",l),s.$on(\"$stateChangeSuccess\",p),A.getFromRoute=function(t){if(!t)return f.error(\"Get From Route: No route provided\");var r=null,s=[];return t.$$route&&t.$$route.css?r=t.$$route.css:t.css&&(r=t.css),r&&(e.isArray(r)?e.forEach(r,function(t){e.isFunction(t)&&O.push(m(t)),s.push(m(t))}):(e.isFunction(r)&&O.push(m(r)),s.push(m(r)))),s},A.getFromRoutes=function(t){if(!t)return f.error(\"Get From Routes: No routes provided\");var r=[];return e.forEach(t,function(e){var t=A.getFromRoute(e);t.length&&r.push(t[0])}),r},A.getFromState=function(t){if(!t)return f.error(\"Get From State: No state provided\");var r=[];return e.isDefined(t.views)&&e.forEach(t.views,function(t){t.css&&(e.isFunction(t.css)&&O.push(m(t.css)),r.push(m(t.css)))}),e.isDefined(t.children)&&e.forEach(t.children,function(t){t.css&&(e.isFunction(t.css)&&O.push(m(t.css)),r.push(m(t.css))),e.isDefined(t.children)&&e.forEach(t.children,function(t){t.css&&(e.isFunction(t.css)&&O.push(m(t.css)),r.push(m(t.css)))})}),e.isDefined(t.css)&&(e.isArray(t.css)?e.forEach(t.css,function(t){e.isFunction(t)&&O.push(m(t)),r.push(m(t))}):(e.isFunction(t.css)&&O.push(m(t.css)),r.push(m(t.css)))),r},A.getFromStates=function(t){if(!t)return f.error(\"Get From States: No states provided\");var r=[];return e.forEach(t,function(t){var s=A.getFromState(t);e.isArray(s)?e.forEach(s,function(e){r.push(e)}):r.push(s)}),r},A.preload=function(t,s){t||(t=[],r.length&&Array.prototype.push.apply(t,r),n.has(\"$route\")&&Array.prototype.push.apply(t,A.getFromRoutes(n.get(\"$route\").routes)),n.has(\"$state\")&&Array.prototype.push.apply(t,A.getFromStates(n.get(\"$state\").get())),t=g(t,\"preload\")),e.isArray(t)||(t=[t]);var i=[];e.forEach(t,function(e,r){e=t[r]=m(e),i.push(a.get(e.href).error(function(t){f.error(\"AngularCSS: Incorrect path for \"+e.href)}))}),e.isFunction(s)&&o.all(i).then(function(){s(t)})},A.bind=function(t,r){if(!t||!r)return f.error(\"No scope or stylesheets provided\");var s=[];e.isArray(t)?e.forEach(t,function(e){s.push(m(e))}):s.push(m(t)),A.add(s),f.debug(\"$css.bind(): Added\",s),r.$on(\"$destroy\",function(){A.remove(s),f.debug(\"$css.bind(): Removed\",s)})},A.add=function(t,r){return t?(e.isArray(t)||(t=[t]),e.forEach(t,function(e){e=m(e),e.href&&!h(\"filter\")(s.stylesheets,{href:e.href}).length&&(v(e),b(e)?$(e):s.stylesheets.push(e),f.debug(\"$css.add(): \"+e.href))}),void s.$broadcast(\"$cssAdd\",t,s.stylesheets)):f.error(\"No stylesheets provided\")},A.remove=function(t,r){return t?(e.isArray(t)||(t=[t]),t=h(\"filter\")(t,function(e){return!e.persist}),e.forEach(t,function(e){e=m(e);var t=s.stylesheets.indexOf(h(\"filter\")(s.stylesheets,{href:e.href})[0]);-1!==t&&s.stylesheets.splice(t,1),F(e),f.debug(\"$css.remove(): \"+e.href)}),void s.$broadcast(\"$cssRemove\",t,s.stylesheets)):f.error(\"No stylesheets provided\")},A.removeAll=function(){s&&s.hasOwnProperty(\"stylesheets\")&&(s.stylesheets.length=0),f.debug(\"all stylesheets removed\")},A.preload(),A}]}]),t.filter(\"$cssLinks\",function(){return function(t){if(!t||!e.isArray(t))return t;var r=\"\";return e.forEach(t,function(e){r+='<link rel=\"'+e.rel+'\" type=\"'+e.type+'\" href=\"'+e.href+'\"',r+=e.media?' media=\"'+e.media+'\"':\"\",r+=\">\\n\\n\"}),r}}),t.run([\"$css\",function(e){}]);var r=[],s=e.module;e.module=function(){var t=s.apply(this,arguments),n=t.directive;return t.directive=function(t,s){var o=e.isFunction(s)?s:s[s.length-1];try{var i=e.copy(o)();i.directiveName=t,i.hasOwnProperty(\"css\")&&r.push(i)}catch(c){}return n.apply(this,arguments)},t.config([\"$provide\",\"$injector\",function(t,s){e.forEach(r,function(e){var r=e.directiveName+\"Directive\";s.has(r)&&t.decorator(r,[\"$delegate\",\"$rootScope\",\"$timeout\",function(t,r,s){var n=t[0],o=n.compile;return n.css&&(e.css=n.css),n.compile=function(){var e=o?o.apply(this,arguments):!1;return function(t){var o=arguments;s(function(){e&&e.apply(this,o)}),r.$broadcast(\"$directiveAdd\",n,t)}},t}])})}]),t}}(angular);\n!function(a,i,r){\"use strict\";function e(){function a(a,i,e){return function(t,n,c){var u=c.$normalize(i);r[u]&&!c[u]&&t.$watch(c[a],function(a){e&&(a=!a),n.attr(i,a)})}}var r={ariaHidden:!0,ariaChecked:!0,ariaDisabled:!0,ariaRequired:!0,ariaInvalid:!0,ariaMultiline:!0,ariaValue:!0,tabindex:!0,bindKeypress:!0};this.config=function(a){r=i.extend(r,a)},this.$get=function(){return{config:function(a){return r[a]},$$watchExpr:a}}}var t=i.module(\"ngAria\",[\"ng\"]).provider(\"$aria\",e);t.directive(\"ngShow\",[\"$aria\",function(a){return a.$$watchExpr(\"ngShow\",\"aria-hidden\",!0)}]).directive(\"ngHide\",[\"$aria\",function(a){return a.$$watchExpr(\"ngHide\",\"aria-hidden\",!1)}]).directive(\"ngModel\",[\"$aria\",function(a){function i(i,r,e){return a.config(r)&&!e.attr(i)}function r(a,i){return!i.attr(\"role\")&&i.attr(\"type\")===a&&\"INPUT\"!==i[0].nodeName}function e(a,i){var r=a.type,e=a.role;return\"checkbox\"===(r||e)||\"menuitemcheckbox\"===e?\"checkbox\":\"radio\"===(r||e)||\"menuitemradio\"===e?\"radio\":\"range\"===r||\"progressbar\"===e||\"slider\"===e?\"range\":\"textbox\"===(r||e)||\"TEXTAREA\"===i[0].nodeName?\"multiline\":\"\"}return{restrict:\"A\",require:\"?ngModel\",priority:200,link:function(t,n,c,u){function o(){return u.$modelValue}function d(){return s?(s=!1,function(a){var i=c.value==u.$viewValue;n.attr(\"aria-checked\",i),n.attr(\"tabindex\",0-!i)}):function(a){n.attr(\"aria-checked\",c.value==u.$viewValue)}}function l(a){n.attr(\"aria-checked\",!u.$isEmpty(u.$viewValue))}var f=e(c,n),s=i(\"tabindex\",\"tabindex\",n);switch(f){case\"radio\":case\"checkbox\":r(f,n)&&n.attr(\"role\",f),i(\"aria-checked\",\"ariaChecked\",n)&&t.$watch(o,\"radio\"===f?d():l);break;case\"range\":r(f,n)&&n.attr(\"role\",\"slider\"),a.config(\"ariaValue\")&&(c.min&&!n.attr(\"aria-valuemin\")&&n.attr(\"aria-valuemin\",c.min),c.max&&!n.attr(\"aria-valuemax\")&&n.attr(\"aria-valuemax\",c.max),n.attr(\"aria-valuenow\")||t.$watch(o,function(a){n.attr(\"aria-valuenow\",a)}));break;case\"multiline\":i(\"aria-multiline\",\"ariaMultiline\",n)&&n.attr(\"aria-multiline\",!0)}s&&n.attr(\"tabindex\",0),u.$validators.required&&i(\"aria-required\",\"ariaRequired\",n)&&t.$watch(function(){return u.$error.required},function(a){n.attr(\"aria-required\",!!a)}),i(\"aria-invalid\",\"ariaInvalid\",n)&&t.$watch(function(){return u.$invalid},function(a){n.attr(\"aria-invalid\",!!a)})}}}]).directive(\"ngDisabled\",[\"$aria\",function(a){return a.$$watchExpr(\"ngDisabled\",\"aria-disabled\")}]).directive(\"ngMessages\",function(){return{restrict:\"A\",require:\"?ngMessages\",link:function(a,i,r,e){i.attr(\"aria-live\")||i.attr(\"aria-live\",\"assertive\")}}}).directive(\"ngClick\",[\"$aria\",\"$parse\",function(a,i){return{restrict:\"A\",compile:function(r,e){var t=i(e.ngClick,null,!0);return function(i,r,e){function n(a,i){return-1!==i.indexOf(a[0].nodeName)?!0:void 0}var c=[\"BUTTON\",\"A\",\"INPUT\",\"TEXTAREA\"];r.attr(\"role\")||n(r,c)||r.attr(\"role\",\"button\"),a.config(\"tabindex\")&&!r.attr(\"tabindex\")&&r.attr(\"tabindex\",0),!a.config(\"bindKeypress\")||e.ngKeypress||n(r,c)||r.on(\"keypress\",function(a){function r(){t(i,{$event:a})}(32===a.keyCode||13===a.keyCode)&&i.$apply(r)})}}}}]).directive(\"ngDblclick\",[\"$aria\",function(a){return function(i,r,e){a.config(\"tabindex\")&&!r.attr(\"tabindex\")&&r.attr(\"tabindex\",0)}}])}(window,window.angular);\nfunction mdMediaFactory(e,t,n){function r(e){var t=m[e];angular.isUndefined(t)&&(t=m[e]=o(e));var n=f[t];return angular.isUndefined(n)&&(n=a(t)),n}function o(t){return e.MEDIA[t]||(\"(\"!==t.charAt(0)?\"(\"+t+\")\":t)}function a(e){var t=u[e]=n.matchMedia(e);return t.addListener(i),f[t.media]=!!t.matches}function i(e){t.$evalAsync(function(){f[e.media]=!!e.matches})}function c(e){return u[e]}function d(t,n){for(var r=0;r<e.MEDIA_PRIORITY.length;r++){var o=e.MEDIA_PRIORITY[r];if(u[m[o]].matches){var a=s(t,n+\"-\"+o);if(t[a])return t[a]}}return t[s(t,n)]}function l(t,n,r){var o=[];return t.forEach(function(t){var a=s(n,t);n[a]&&o.push(n.$observe(a,angular.bind(void 0,r,null)));for(var i in e.MEDIA){var a=s(n,t+\"-\"+i);if(!n[a])return;o.push(n.$observe(a,angular.bind(void 0,r,i)))}}),function(){o.forEach(function(e){e()})}}function s(e,t){return p[t]||(p[t]=e.$normalize(t))}var m={},u={},f={},p={};return r.getResponsiveAttribute=d,r.getQuery=c,r.watchResponsiveAttributes=l,r}angular.module(\"ngMaterial\",[\"ng\",\"ngAnimate\",\"ngAria\",\"material.core\",\"material.core.theming.palette\",\"material.core.theming\",\"material.components.autocomplete\",\"material.components.backdrop\",\"material.components.bottomSheet\",\"material.components.card\",\"material.components.button\",\"material.components.checkbox\",\"material.components.content\",\"material.components.dialog\",\"material.components.divider\",\"material.components.gridList\",\"material.components.icon\",\"material.components.input\",\"material.components.list\",\"material.components.progressCircular\",\"material.components.progressLinear\",\"material.components.radioButton\",\"material.components.select\",\"material.components.sidenav\",\"material.components.slider\",\"material.components.sticky\",\"material.components.subheader\",\"material.components.swipe\",\"material.components.switch\",\"material.components.tabs\",\"material.components.textField\",\"material.components.toast\",\"material.components.toolbar\",\"material.components.tooltip\",\"material.components.whiteframe\"]),function(){\"use strict\";function e(e,n){e.decorator(\"$$rAF\",[\"$delegate\",t]),n.theme(\"default\").primaryPalette(\"indigo\").accentPalette(\"pink\").warnPalette(\"red\").backgroundPalette(\"grey\")}function t(e){return e.throttle=function(t){var n,r,o,a;return function(){n=arguments,a=this,o=t,r||(r=!0,e(function(){o.apply(a,n),r=!1}))}},e}angular.module(\"material.core\",[\"material.core.theming\"]).config(e),e.$inject=[\"$provide\",\"$mdThemingProvider\"]}(),function(){\"use strict\";function e(e,t){function n(e){return r?\"webkit\"+e.charAt(0).toUpperCase()+e.substring(1):e}var r=/webkit/i.test(t.vendorPrefix);return{KEY_CODE:{ENTER:13,ESCAPE:27,SPACE:32,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,TAB:9},CSS:{TRANSITIONEND:\"transitionend\"+(r?\" webkitTransitionEnd\":\"\"),ANIMATIONEND:\"animationend\"+(r?\" webkitAnimationEnd\":\"\"),TRANSFORM:n(\"transform\"),TRANSFORM_ORIGIN:n(\"transformOrigin\"),TRANSITION:n(\"transition\"),TRANSITION_DURATION:n(\"transitionDuration\"),ANIMATION_PLAY_STATE:n(\"animationPlayState\"),ANIMATION_DURATION:n(\"animationDuration\"),ANIMATION_NAME:n(\"animationName\"),ANIMATION_TIMING:n(\"animationTimingFunction\"),ANIMATION_DIRECTION:n(\"animationDirection\")},MEDIA:{sm:\"(max-width: 600px)\",\"gt-sm\":\"(min-width: 600px)\",md:\"(min-width: 600px) and (max-width: 960px)\",\"gt-md\":\"(min-width: 960px)\",lg:\"(min-width: 960px) and (max-width: 1200px)\",\"gt-lg\":\"(min-width: 1200px)\"},MEDIA_PRIORITY:[\"gt-lg\",\"lg\",\"gt-md\",\"md\",\"gt-sm\",\"sm\"]}}angular.module(\"material.core\").factory(\"$mdConstant\",e),e.$inject=[\"$$rAF\",\"$sniffer\"]}(),function(){function e(e,t){function n(){return[].concat(b)}function r(){return b.length}function o(e){return b.length&&e>-1&&e<b.length}function a(e){return e?o(m(e)+1):!1}function i(e){return e?o(m(e)-1):!1}function c(e){return o(e)?b[e]:null}function d(e,t){return b.filter(function(n){return n[e]===t})}function l(e,t){return e?(angular.isNumber(t)||(t=b.length),b.splice(t,0,e),m(e)):-1}function s(e){u(e)&&b.splice(m(e),1)}function m(e){return b.indexOf(e)}function u(e){return e&&m(e)>-1}function f(){return b.length?b[0]:null}function p(){return b.length?b[b.length-1]:null}function h(e,n,r,a){r=r||g;for(var i=m(n);;){if(!o(i))return null;var c=i+(e?-1:1),d=null;if(o(c)?d=b[c]:t&&(d=e?p():f(),c=m(d)),null===d||c===a)return null;if(r(d))return d;angular.isUndefined(a)&&(a=c),i=c}}var g=function(){return!0};e&&!angular.isArray(e)&&(e=Array.prototype.slice.call(e)),t=!!t;var b=e||[];return{items:n,count:r,inRange:o,contains:u,indexOf:m,itemAt:c,findBy:d,add:l,remove:s,first:f,last:p,next:angular.bind(null,h,!1),previous:angular.bind(null,h,!0),hasPrevious:i,hasNext:a}}angular.module(\"material.core\").config([\"$provide\",function(t){t.decorator(\"$mdUtil\",[\"$delegate\",function(t){return t.iterator=e,t}])}])}(),angular.module(\"material.core\").factory(\"$mdMedia\",mdMediaFactory),mdMediaFactory.$inject=[\"$mdConstant\",\"$rootScope\",\"$window\"],function(){\"use strict\";var e=[\"0\",\"0\",\"0\"];angular.module(\"material.core\").factory(\"$mdUtil\",[\"$cacheFactory\",\"$document\",\"$timeout\",\"$q\",\"$window\",\"$mdConstant\",function(t,n,r,o,a,i){function c(e){return e[0]||e}var d;return d={now:window.performance?angular.bind(window.performance,window.performance.now):Date.now,clientRect:function(e,t,n){var r=c(e);t=c(t||r.offsetParent||document.body);var o=r.getBoundingClientRect(),a=n?t.getBoundingClientRect():{left:0,top:0,width:0,height:0};return{left:o.left-a.left+t.scrollLeft,top:o.top-a.top+t.scrollTop,width:o.width,height:o.height}},offsetRect:function(e,t){return d.clientRect(e,t,!0)},floatingScrollbars:function(){if(void 0===this.floatingScrollbars.cached){var e=angular.element('<div style=\"z-index: -1; position: absolute; height: 1px; overflow-y: scroll\"><div style=\"height: 2px;\"></div></div>');n[0].body.appendChild(e[0]),this.floatingScrollbars.cached=e[0].offsetWidth==e[0].childNodes[0].offsetWidth,e.remove()}return this.floatingScrollbars.cached},forceFocus:function(e){var t=e[0]||e;document.addEventListener(\"click\",function r(e){e.target===t&&e.$focus&&(t.focus(),e.stopImmediatePropagation(),e.preventDefault(),t.removeEventListener(\"click\",r))},!0);var n=document.createEvent(\"MouseEvents\");n.initMouseEvent(\"click\",!1,!0,window,{},0,0,0,0,!1,!1,!1,!1,0,null),n.$material=!0,n.$focus=!0,t.dispatchEvent(n)},transitionEndPromise:function(e){function t(r){r.target===e[0]&&(e.off(i.CSS.TRANSITIONEND,t),n.resolve())}var n=o.defer();return e.on(i.CSS.TRANSITIONEND,t),n.promise},fakeNgModel:function(){return{$fake:!0,$setTouched:angular.noop,$setViewValue:function(e){this.$viewValue=e,this.$render(e),this.$viewChangeListeners.forEach(function(e){e()})},$isEmpty:function(e){return 0===(\"\"+e).length},$parsers:[],$formatters:[],$viewChangeListeners:[],$render:angular.noop}},debounce:function(e,t,n,o){var a;return function(){var i=n,c=Array.prototype.slice.call(arguments);r.cancel(a),a=r(function(){a=void 0,e.apply(i,c)},t||10,o)}},throttle:function(e,t){var n;return function(){var r=this,o=arguments,a=d.now();(!n||a-n>t)&&(e.apply(r,o),n=a)}},time:function(e){var t=d.now();return e(),d.now()-t},nextUid:function(){for(var t,n=e.length;n;){if(n--,t=e[n].charCodeAt(0),57==t)return e[n]=\"A\",e.join(\"\");if(90!=t)return e[n]=String.fromCharCode(t+1),e.join(\"\");e[n]=\"0\"}return e.unshift(\"0\"),e.join(\"\")},disconnectScope:function(e){if(e&&e.$root!==e&&!e.$$destroyed){var t=e.$parent;e.$$disconnected=!0,t.$$childHead===e&&(t.$$childHead=e.$$nextSibling),t.$$childTail===e&&(t.$$childTail=e.$$prevSibling),e.$$prevSibling&&(e.$$prevSibling.$$nextSibling=e.$$nextSibling),e.$$nextSibling&&(e.$$nextSibling.$$prevSibling=e.$$prevSibling),e.$$nextSibling=e.$$prevSibling=null}},reconnectScope:function(e){if(e&&e.$root!==e&&e.$$disconnected){var t=e,n=t.$parent;t.$$disconnected=!1,t.$$prevSibling=n.$$childTail,n.$$childHead?(n.$$childTail.$$nextSibling=t,n.$$childTail=t):n.$$childHead=n.$$childTail=t}},getClosest:function(e,t){t=t.toUpperCase();do if(e.nodeName===t)return e;while(e=e.parentNode);return null}}}]),angular.element.prototype.focus=angular.element.prototype.focus||function(){return this.length&&this[0].focus(),this},angular.element.prototype.blur=angular.element.prototype.blur||function(){return this.length&&this[0].blur(),this}}(),function(){\"use strict\";function e(e,t,n){function r(e,n,r){var o=e[0];o.hasAttribute(n)||c(o,n)||(r=angular.isString(r)?r.trim():\"\",r.length?e.attr(n,r):t.warn('ARIA: Attribute \"',n,'\", required for accessibility, is missing on node:',o))}function o(t,n,o){e(function(){r(t,n,o())})}function a(e,t){o(e,t,function(){return i(e)})}function i(e){return e.text().trim()}function c(e,t){function r(e){var t=e.currentStyle?e.currentStyle:n.getComputedStyle(e);return\"none\"===t.display}var o=e.hasChildNodes(),a=!1;if(o)for(var i=e.childNodes,c=0;c<i.length;c++){var d=i[c];1===d.nodeType&&d.hasAttribute(t)&&(r(d)||(a=!0))}return a}return{expect:r,expectAsync:o,expectWithText:a}}angular.module(\"material.core\").service(\"$mdAria\",e),e.$inject=[\"$$rAF\",\"$log\",\"$window\"]}(),function(){\"use strict\";function e(e,t){var n;for(var r in d)n=d[r],\"start\"===e&&n.cancel(),n[e](t,g)}function t(t){if(!g){var n=+Date.now();b&&!o(t,b)&&n-b.endTime<1500||(g=c(t),e(\"start\",t))}}function n(t){g&&o(t,g)&&(i(t,g),e(\"move\",t))}function r(t){g&&o(t,g)&&(i(t,g),g.endTime=+Date.now(),e(\"end\",t),b=g,g=null)}function o(e,t){return e&&t&&e.type.charAt(0)===t.type}function a(e){return e=e.originalEvent||e,e.touches&&e.touches[0]||e.changedTouches&&e.changedTouches[0]||e}function i(e,t){var n=a(e),r=t.x=n.pageX,o=t.y=n.pageY;t.distanceX=r-t.startX,t.distanceY=o-t.startY,t.distance=Math.sqrt(t.distanceX*t.distanceX+t.distanceY*t.distanceY),t.directionX=t.distanceX>0?\"right\":t.distanceX<0?\"left\":\"\",t.directionY=t.distanceY>0?\"up\":t.distanceY<0?\"down\":\"\",t.duration=+Date.now()-t.startTime,t.velocityX=t.distanceX/t.duration,t.velocityY=t.distanceY/t.duration}function c(e){var t=a(e),n={startTime:+Date.now(),target:e.target,type:e.type.charAt(0)};return n.startX=n.x=t.pageX,n.startY=n.y=t.pageY,n}var d,l=\"mousedown touchstart pointerdown\",s=\"mousemove touchmove pointermove\",m=\"mouseup mouseleave touchend touchcancel pointerup pointercancel\";document.contains||(document.contains=function(e){return document.body.contains(e)});var u=navigator.userAgent||navigator.vendor||window.opera,f=u.match(/iPad/i)||u.match(/iPhone/i)||u.match(/iPod/i),p=u.match(/Android/i),h=f||p;h&&document.addEventListener(\"click\",function(e){var t=0===e.clientX&&0===e.clientY;t||e.$material||(e.preventDefault(),e.stopPropagation())},!0),angular.element(document).on(l,t).on(s,n).on(m,r).on(\"$$mdGestureReset\",function(){b=g=null});var g,b;angular.module(\"material.core\").run([\"$mdGesture\",function(){}]).factory(\"$mdGesture\",[\"$$MdGestureHandler\",\"$$rAF\",\"$timeout\",function(e,t,n){function r(t,n){var r=new e(t);return angular.extend(r,n),d[t]=r,a}function o(e,t,n){var r=d[t.replace(/^\\$md./,\"\")];if(!r)throw new Error(\"Failed to register element with handler \"+t+\". Available handlers: \"+Object.keys(d).join(\", \"));return r.registerElement(e,n)}d={},h&&r(\"click\",{options:{maxDistance:6},onEnd:function(e,t){t.distance<this.state.options.maxDistance&&this.dispatchEvent(e,\"click\")}}),r(\"press\",{onStart:function(e){this.dispatchEvent(e,\"$md.pressdown\")},onEnd:function(e){this.dispatchEvent(e,\"$md.pressup\")}}),r(\"hold\",{options:{maxDistance:6,delay:500},onCancel:function(){n.cancel(this.state.timeout)},onStart:function(e,t){return this.state.registeredParent?(this.state.pos={x:t.x,y:t.y},void(this.state.timeout=n(angular.bind(this,function(){this.dispatchEvent(e,\"$md.hold\"),this.cancel()}),this.state.options.delay,!1))):this.cancel()},onMove:function(e,t){e.preventDefault();var n=this.state.pos.x-t.x,r=this.state.pos.y-t.y;Math.sqrt(n*n+r*r)>this.options.maxDistance&&this.cancel()},onEnd:function(){this.onCancel()}}),r(\"drag\",{options:{minDistance:6,horizontal:!0},onStart:function(){this.state.registeredParent||this.cancel()},onMove:function(e,t){var n,r;e.preventDefault(),this.state.dragPointer?this.dispatchDragMove(e):(this.state.options.horizontal?(n=Math.abs(t.distanceX)>this.state.options.minDistance,r=Math.abs(t.distanceY)>1.5*this.state.options.minDistance):(n=Math.abs(t.distanceY)>this.state.options.minDistance,r=Math.abs(t.distanceX)>1.5*this.state.options.minDistance),n?(this.state.dragPointer=c(e),i(e,this.state.dragPointer),this.dispatchEvent(e,\"$md.dragstart\",this.state.dragPointer)):r&&this.cancel())},dispatchDragMove:t.throttle(function(e){this.state.isRunning&&(i(e,this.state.dragPointer),this.dispatchEvent(e,\"$md.drag\",this.state.dragPointer))}),onEnd:function(e){this.state.dragPointer&&(i(e,this.state.dragPointer),this.dispatchEvent(e,\"$md.dragend\",this.state.dragPointer))}}),r(\"swipe\",{options:{minVelocity:.65,minDistance:10},onEnd:function(e,t){if(Math.abs(t.velocityX)>this.state.options.minVelocity&&Math.abs(t.distanceX)>this.state.options.minDistance){var n=\"left\"==t.directionX?\"$md.swipeleft\":\"$md.swiperight\";this.dispatchEvent(e,n)}}});var a;return a={handler:r,register:o}}]).factory(\"$$MdGestureHandler\",[\"$$rAF\",function(){function e(e){this.name=e,this.state={}}function t(e,t,n){n=n||g;var r=new angular.element.Event(t);r.$material=!0,r.pointer=n,r.srcEvent=e,angular.extend(r,{clientX:n.x,clientY:n.y,screenX:n.x,screenY:n.y,pageX:n.x,pageY:n.y,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey}),angular.element(n.target).trigger(r)}function n(e,t,n){n=n||g;var r;\"click\"===t?(r=document.createEvent(\"MouseEvents\"),r.initMouseEvent(\"click\",!0,!0,window,e.detail,n.x,n.y,n.x,n.y,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget||null)):(r=document.createEvent(\"CustomEvent\"),r.initCustomEvent(t,!0,!0,{})),r.$material=!0,r.pointer=n,r.srcEvent=e,n.target.dispatchEvent(r)}return e.prototype={onStart:angular.noop,onMove:angular.noop,onEnd:angular.noop,onCancel:angular.noop,options:{},dispatchEvent:\"undefined\"!=typeof window.jQuery&&angular.element===window.jQuery?t:n,start:function(e,t){if(!this.state.isRunning){var n=this.getNearestParent(e.target),r=n&&n.$mdGesture[this.name]||{};this.state={isRunning:!0,options:angular.extend({},this.options,r),registeredParent:n},this.onStart(e,t)}},move:function(e,t){this.state.isRunning&&this.onMove(e,t)},end:function(e,t){this.state.isRunning&&(this.onEnd(e,t),this.state.isRunning=!1)},cancel:function(e,t){this.onCancel(e,t),this.state={}},getNearestParent:function(e){for(var t=e;t;){if((t.$mdGesture||{})[this.name])return t;t=t.parentNode}},registerElement:function(e,t){function n(){delete e[0].$mdGesture[r.name],e.off(\"$destroy\",n)}var r=this;return e[0].$mdGesture=e[0].$mdGesture||{},e[0].$mdGesture[this.name]=t||{},e.on(\"$destroy\",n),n}},e}])}(),function(){\"use strict\";function e(e,t,n,r,o,a){this.compile=function(i){var c=i.templateUrl,d=i.template||\"\",l=i.controller,s=i.controllerAs,m=i.resolve||{},u=i.locals||{},f=i.transformTemplate||angular.identity,p=i.bindToController;return angular.forEach(m,function(e,t){m[t]=angular.isString(e)?n.get(e):n.invoke(e)}),angular.extend(m,u),m.$template=c?t.get(c,{cache:a}).then(function(e){return e.data}):e.when(d),e.all(m).then(function(e){var t=f(e.$template),n=i.element||angular.element(\"<div>\").html(t.trim()).contents(),a=r(n);return{locals:e,element:n,link:function(t){if(e.$scope=t,l){var r=o(l,e);p&&angular.extend(r,e),n.data(\"$ngControllerController\",r),n.children().data(\"$ngControllerController\",r),s&&(t[s]=r)}return a(t)}}})}}angular.module(\"material.core\").service(\"$mdCompiler\",e),e.$inject=[\"$q\",\"$http\",\"$injector\",\"$compile\",\"$controller\",\"$templateCache\"]}(),function(){\"use strict\";function e(){function e(e){function t(e){return c.optionsFactory=e.options,c.methods=(e.methods||[]).concat(a),d}function n(e,t){return i[e]=t,d}function r(t,n){if(n=n||{},n.methods=n.methods||[],n.options=n.options||function(){return{}},/^cancel|hide|show$/.test(t))throw new Error(\"Preset '\"+t+\"' in \"+e+\" is reserved!\");if(n.methods.indexOf(\"_options\")>-1)throw new Error(\"Method '_options' in \"+e+\" is reserved!\");return c.presets[t]={methods:n.methods.concat(a),optionsFactory:n.options,argOption:n.argOption},d}function o(t,n,r){function o(e){return e&&e._options&&(e=e._options),s.show(angular.extend({},l,e))}function a(t,n){var o={};return o[e]=m,r.invoke(t||function(){return n},{},o)}var d,l,s=t(),m={hide:s.hide,cancel:s.cancel,show:o};return d=c.methods||[],l=a(c.optionsFactory,{}),angular.forEach(i,function(e,t){m[t]=e}),angular.forEach(c.presets,function(e,t){function n(e){this._options=angular.extend({},r,e)}var r=a(e.optionsFactory,{}),o=(e.methods||[]).concat(d);if(angular.extend(r,{$type:t}),angular.forEach(o,function(e){n.prototype[e]=function(t){return this._options[e]=t,this}}),e.argOption){var i=\"show\"+t.charAt(0).toUpperCase()+t.slice(1);m[i]=function(e){var n=m[t](e);return m.show(n)}}m[t]=function(t){return arguments.length&&e.argOption&&!angular.isObject(t)&&!angular.isArray(t)?(new n)[e.argOption](t):new n(t)}}),m}var a=[\"onHide\",\"onShow\",\"onRemove\"],i={},c={presets:{}},d={setDefaults:t,addPreset:r,addMethod:n,$get:o};return d.addPreset(\"build\",{methods:[\"controller\",\"controllerAs\",\"resolve\",\"template\",\"templateUrl\",\"themable\",\"transformTemplate\",\"parent\"]}),o.$inject=[\"$$interimElement\",\"$animate\",\"$injector\"],d}function t(e,t,n,r,o,a,i,c,d){function l(e){return e&&angular.isString(e)?e.replace(/\\{\\{/g,s).replace(/}}/g,m):e}var s=i.startSymbol(),m=i.endSymbol(),u=\"{{\"===s&&\"}}\"===m,f=u?angular.identity:l;return function(){function i(e){if(p.length)return u.cancel().then(function(){return i(e)});var t=new m(e);return p.push(t),t.show().then(function(){return t.deferred.promise})}function l(e){var t=p.shift();return t&&t.remove().then(function(){t.deferred.resolve(e)})}function s(e){var n=p.shift();return t.when(n&&n.remove().then(function(){n.deferred.reject(e)}))}function m(i){var l,s,m,p,h;return i=i||{},i=angular.extend({preserveScope:!1,scope:i.scope||n.$new(i.isolateScope),onShow:function(e,t,n){return a.enter(t,n.parent)},onRemove:function(e,n){return n&&a.leave(n)||t.when()}},i),i.template&&(i.template=f(i.template)),l={options:i,deferred:t.defer(),show:function(){return p=c.compile(i).then(function(n){function a(){i.hideDelay&&(s=r(u.cancel,i.hideDelay))}angular.extend(n.locals,l.options),m=n.link(i.scope),angular.isFunction(i.parent)?i.parent=i.parent(i.scope,m,i):angular.isString(i.parent)&&(i.parent=angular.element(e[0].querySelector(i.parent))),(i.parent||{}).length||(i.parent=o.find(\"body\"),i.parent.length||(i.parent=o)),i.themable&&d(m);var c=i.onShow(i.scope,m,i);return t.when(c).then(function(){(i.onComplete||angular.noop)(i.scope,m,i),a()})},function(e){p=!0,l.deferred.reject(e)})},cancelTimeout:function(){s&&(r.cancel(s),s=void 0)},remove:function(){return l.cancelTimeout(),h=t.when(p).then(function(){var e=m?i.onRemove(i.scope,m,i):!0;return t.when(e).then(function(){i.preserveScope||i.scope.$destroy(),h=!0})})}}}var u,p=[];return u={show:i,hide:l,cancel:s}}}return e.$get=t,t.$inject=[\"$document\",\"$q\",\"$rootScope\",\"$timeout\",\"$rootElement\",\"$animate\",\"$interpolate\",\"$mdCompiler\",\"$mdTheming\"],e}angular.module(\"material.core\").provider(\"$$interimElement\",e)}(),function(){\"use strict\";function e(e,t){function n(e){return e&&\"\"!==e}var r,o=[],a={};return r={notFoundError:function(t){e.error(\"No instance found for handle\",t)},getInstances:function(){return o},get:function(e){if(!n(e))return null;var t,r,a;for(t=0,r=o.length;r>t;t++)if(a=o[t],a.$$mdHandle===e)return a;return null},register:function(e,t){function n(){var t=o.indexOf(e);-1!==t&&o.splice(t,1)}function r(){var n=a[t];n&&(n.resolve(e),delete a[t])}return t?(e.$$mdHandle=t,o.push(e),r(),n):angular.noop},when:function(e){if(n(e)){var o=t.defer(),i=r.get(e);return i?o.resolve(i):a[e]=o,o.promise}return t.reject(\"Invalid ` + \"`\" + `md-component-id` + \"`\" + ` value.\")}}}angular.module(\"material.core\").factory(\"$mdComponentRegistry\",e),e.$inject=[\"$log\",\"$q\"]}(),function(){\"use strict\";function e(e){return{controller:angular.noop,link:function(t,n,r){r.hasOwnProperty(\"mdInkRippleCheckbox\")?e.attachCheckboxBehavior(t,n):e.attachButtonBehavior(t,n)}}}function t(e,t){function n(e,t,n){return a(e,t,angular.extend({isFAB:t.hasClass(\"md-fab\"),isMenuItem:t.hasClass(\"md-menu-item\"),center:!1,dimBackground:!0},n))}function r(e,t,n){return a(e,t,angular.extend({center:!0,dimBackground:!1,fitRipple:!0},n))}function o(e,t,n){return a(e,t,angular.extend({center:!1,dimBackground:!0,outline:!0},n))}function a(n,r,o){function a(){var e=r.data(\"$mdRippleContainer\");return e?e:(e=angular.element('<div class=\"md-ripple-container\">'),r.append(e),r.data(\"$mdRippleContainer\",e),e)}function i(e){function t(e){var t=\"#\"===e.charAt(0)?e.substr(1):e,n=t.length/3,r=t.substr(0,n),o=t.substr(n,n),a=t.substr(2*n);return 1===n&&(r+=r,o+=o,a+=a),\"rgba(\"+parseInt(r,16)+\",\"+parseInt(o,16)+\",\"+parseInt(a,16)+\",0.1)\"}function n(e){return e.replace(\")\",\", 0.1)\").replace(\"(\",\"a(\")}return e?0===e.indexOf(\"rgba\")?e.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/,\"0.1)\"):0===e.indexOf(\"rgb\")?n(e):0===e.indexOf(\"#\")?t(e):void 0:void 0}function c(e,n){g.splice(g.indexOf(e),1),0===g.length&&a().css({backgroundColor:\"\"}),t(function(){e.remove()},n,!1)}function d(e){var t=g.indexOf(e),n=b[t]||{},r=g.length>1?!1:E,a=g.length>1?!1:$;r||n.animating||a?e.addClass(\"md-ripple-visible\"):e&&(e.removeClass(\"md-ripple-visible\"),o.outline&&e.css({width:f+\"px\",height:f+\"px\",marginLeft:-1*f+\"px\",marginTop:-1*f+\"px\"}),c(e,o.outline?450:650))}function l(n,c){function l(e){var t=angular.element('<div class=\"md-ripple\" data-counter=\"'+h++ +'\">');return g.unshift(t),b.unshift({animating:!0}),u.append(t),e&&t.css(e),t}function s(e,t){var n,r,a,i=u.prop(\"offsetWidth\"),c=u.prop(\"offsetHeight\");return o.isMenuItem?r=Math.sqrt(Math.pow(i,2)+Math.pow(c,2)):o.outline?(a=M.getBoundingClientRect(),e-=a.left,t-=a.top,i=Math.max(e,i-e),c=Math.max(t,c-t),r=2*Math.sqrt(Math.pow(i,2)+Math.pow(c,2))):(n=o.isFAB?1.1:.8,r=Math.sqrt(Math.pow(i,2)+Math.pow(c,2))*n,o.fitRipple&&(r=Math.min(c,i,r))),r}function m(e,t,n){function r(e){return e.replace(\"rgba\",\"rgb\").replace(/,[^\\)\\,]+\\)/,\")\")}var a,i={backgroundColor:r(T),borderColor:r(T),width:e+\"px\",height:e+\"px\"};return o.outline?(i.width=0,i.height=0):i.marginLeft=i.marginTop=e*-.5+\"px\",o.center?i.left=i.top=\"50%\":(a=M.getBoundingClientRect(),i.left=Math.round((t-a.left)/u.prop(\"offsetWidth\")*100)+\"%\",i.top=Math.round((n-a.top)/u.prop(\"offsetHeight\")*100)+\"%\"),i}T=i(r.attr(\"md-ink-ripple\"))||i(e.getComputedStyle(o.colorElement[0]).color||\"rgb(0, 0, 0)\");var u=a(),p=s(n,c),v=m(p,n,c),E=l(v),$=g.indexOf(E),A=b[$]||{};return f=p,A.animating=!0,t(function(){o.dimBackground&&u.css({backgroundColor:T}),E.addClass(\"md-ripple-placed md-ripple-scaled\"),o.outline?E.css({borderWidth:.5*p+\"px\",marginLeft:p*-.5+\"px\",marginTop:p*-.5+\"px\"}):E.css({left:\"50%\",top:\"50%\"}),d(E),t(function(){A.animating=!1,d(E)},o.outline?450:225,!1)},0,!1),E}function s(e){u()&&(l(e.pointer.x,e.pointer.y),$=!0)}function m(){$=!1;var e=g[g.length-1];t(function(){d(e)},0,!1)}function u(){function e(e){return e&&e.hasAttribute&&e.hasAttribute(\"disabled\")}var t=M.parentNode,n=t&&t.parentNode,r=n&&n.parentNode;return!(e(M)||e(t)||e(n)||e(r))}if(r.controller(\"mdNoInk\"))return angular.noop;o=angular.extend({colorElement:r,mousedown:!0,hover:!0,focus:!0,center:!1,mousedownPauseTime:150,dimBackground:!1,outline:!1,isFAB:!1,isMenuItem:!1,fitRipple:!1},o);var f,p=r.controller(\"mdInkRipple\")||{},h=0,g=[],b=[],v=r.attr(\"md-highlight\"),E=!1,$=!1,M=r[0],A=r.attr(\"md-ripple-size\"),T=i(r.attr(\"md-ink-ripple\"))||i(e.getComputedStyle(o.colorElement[0]).color||\"rgb(0, 0, 0)\");switch(A){case\"full\":o.isFAB=!0;break;case\"partial\":o.isFAB=!1}return o.mousedown&&r.on(\"$md.pressdown\",s).on(\"$md.pressup\",m),p.createRipple=l,v&&n.$watch(v,function(e){E=e,E&&!g.length&&t(function(){l(0,0)},0,!1),angular.forEach(g,d)}),function(){r.off(\"$md.pressdown\",s).off(\"$md.pressup\",m),a().remove()}}return{attachButtonBehavior:n,attachCheckboxBehavior:r,attachTabBehavior:o,attach:a}}function n(){return function(){return{controller:angular.noop}}}angular.module(\"material.core\").factory(\"$mdInkRipple\",t).directive(\"mdInkRipple\",e).directive(\"mdNoInk\",n()).directive(\"mdNoBar\",n()).directive(\"mdNoStretch\",n()),e.$inject=[\"$mdInkRipple\"],t.$inject=[\"$window\",\"$timeout\"]}(),function(){\"use strict\";angular.module(\"material.core.theming.palette\",[]).constant(\"$mdColorPalette\",{red:{50:\"#ffebee\",100:\"#ffcdd2\",200:\"#ef9a9a\",300:\"#e57373\",400:\"#ef5350\",500:\"#f44336\",600:\"#e53935\",700:\"#d32f2f\",800:\"#c62828\",900:\"#b71c1c\",A100:\"#ff8a80\",A200:\"#ff5252\",A400:\"#ff1744\",A700:\"#d50000\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 300 400 A100\",contrastStrongLightColors:\"500 600 700 A200 A400 A700\"},pink:{50:\"#fce4ec\",100:\"#f8bbd0\",200:\"#f48fb1\",300:\"#f06292\",400:\"#ec407a\",500:\"#e91e63\",600:\"#d81b60\",700:\"#c2185b\",800:\"#ad1457\",900:\"#880e4f\",A100:\"#ff80ab\",A200:\"#ff4081\",A400:\"#f50057\",A700:\"#c51162\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 300 400 A100\",contrastStrongLightColors:\"500 600 A200 A400 A700\"},purple:{50:\"#f3e5f5\",100:\"#e1bee7\",200:\"#ce93d8\",300:\"#ba68c8\",400:\"#ab47bc\",500:\"#9c27b0\",600:\"#8e24aa\",700:\"#7b1fa2\",800:\"#6a1b9a\",900:\"#4a148c\",A100:\"#ea80fc\",A200:\"#e040fb\",A400:\"#d500f9\",A700:\"#aa00ff\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 A100\",contrastStrongLightColors:\"300 400 A200 A400 A700\"},\"deep-purple\":{50:\"#ede7f6\",100:\"#d1c4e9\",200:\"#b39ddb\",300:\"#9575cd\",400:\"#7e57c2\",500:\"#673ab7\",600:\"#5e35b1\",700:\"#512da8\",800:\"#4527a0\",900:\"#311b92\",A100:\"#b388ff\",A200:\"#7c4dff\",A400:\"#651fff\",A700:\"#6200ea\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 A100\",contrastStrongLightColors:\"300 400 A200\"},indigo:{50:\"#e8eaf6\",100:\"#c5cae9\",200:\"#9fa8da\",300:\"#7986cb\",400:\"#5c6bc0\",500:\"#3f51b5\",600:\"#3949ab\",700:\"#303f9f\",800:\"#283593\",900:\"#1a237e\",A100:\"#8c9eff\",A200:\"#536dfe\",A400:\"#3d5afe\",A700:\"#304ffe\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 A100\",contrastStrongLightColors:\"300 400 A200 A400\"},blue:{50:\"#e3f2fd\",100:\"#bbdefb\",200:\"#90caf9\",300:\"#64b5f6\",400:\"#42a5f5\",500:\"#2196f3\",600:\"#1e88e5\",700:\"#1976d2\",800:\"#1565c0\",900:\"#0d47a1\",A100:\"#82b1ff\",A200:\"#448aff\",A400:\"#2979ff\",A700:\"#2962ff\",contrastDefaultColor:\"light\",contrastDarkColors:\"100 200 300 400 A100\",contrastStrongLightColors:\"500 600 700 A200 A400 A700\"},\"light-blue\":{50:\"#e1f5fe\",100:\"#b3e5fc\",200:\"#81d4fa\",300:\"#4fc3f7\",400:\"#29b6f6\",500:\"#03a9f4\",600:\"#039be5\",700:\"#0288d1\",800:\"#0277bd\",900:\"#01579b\",A100:\"#80d8ff\",A200:\"#40c4ff\",A400:\"#00b0ff\",A700:\"#0091ea\",contrastDefaultColor:\"dark\",contrastLightColors:\"500 600 700 800 900 A700\",contrastStrongLightColors:\"500 600 700 800 A700\"},cyan:{50:\"#e0f7fa\",100:\"#b2ebf2\",200:\"#80deea\",300:\"#4dd0e1\",400:\"#26c6da\",500:\"#00bcd4\",600:\"#00acc1\",700:\"#0097a7\",800:\"#00838f\",900:\"#006064\",A100:\"#84ffff\",A200:\"#18ffff\",A400:\"#00e5ff\",A700:\"#00b8d4\",contrastDefaultColor:\"dark\",contrastLightColors:\"500 600 700 800 900\",contrastStrongLightColors:\"500 600 700 800\"},teal:{50:\"#e0f2f1\",100:\"#b2dfdb\",200:\"#80cbc4\",300:\"#4db6ac\",400:\"#26a69a\",500:\"#009688\",600:\"#00897b\",700:\"#00796b\",800:\"#00695c\",900:\"#004d40\",A100:\"#a7ffeb\",A200:\"#64ffda\",A400:\"#1de9b6\",A700:\"#00bfa5\",contrastDefaultColor:\"dark\",contrastLightColors:\"500 600 700 800 900\",contrastStrongLightColors:\"500 600 700\"},green:{50:\"#e8f5e9\",100:\"#c8e6c9\",200:\"#a5d6a7\",300:\"#81c784\",400:\"#66bb6a\",500:\"#4caf50\",600:\"#43a047\",700:\"#388e3c\",800:\"#2e7d32\",900:\"#1b5e20\",A100:\"#b9f6ca\",A200:\"#69f0ae\",A400:\"#00e676\",A700:\"#00c853\",contrastDefaultColor:\"dark\",contrastLightColors:\"500 600 700 800 900\",contrastStrongLightColors:\"500 600 700\"},\"light-green\":{50:\"#f1f8e9\",100:\"#dcedc8\",200:\"#c5e1a5\",300:\"#aed581\",400:\"#9ccc65\",500:\"#8bc34a\",600:\"#7cb342\",700:\"#689f38\",800:\"#558b2f\",900:\"#33691e\",A100:\"#ccff90\",A200:\"#b2ff59\",A400:\"#76ff03\",A700:\"#64dd17\",contrastDefaultColor:\"dark\",contrastLightColors:\"800 900\",contrastStrongLightColors:\"800 900\"},lime:{50:\"#f9fbe7\",100:\"#f0f4c3\",200:\"#e6ee9c\",300:\"#dce775\",400:\"#d4e157\",500:\"#cddc39\",600:\"#c0ca33\",700:\"#afb42b\",800:\"#9e9d24\",900:\"#827717\",A100:\"#f4ff81\",A200:\"#eeff41\",A400:\"#c6ff00\",A700:\"#aeea00\",contrastDefaultColor:\"dark\",contrastLightColors:\"900\",contrastStrongLightColors:\"900\"},yellow:{50:\"#fffde7\",100:\"#fff9c4\",200:\"#fff59d\",300:\"#fff176\",400:\"#ffee58\",500:\"#ffeb3b\",600:\"#fdd835\",700:\"#fbc02d\",800:\"#f9a825\",900:\"#f57f17\",A100:\"#ffff8d\",A200:\"#ffff00\",A400:\"#ffea00\",A700:\"#ffd600\",contrastDefaultColor:\"dark\"},amber:{50:\"#fff8e1\",100:\"#ffecb3\",200:\"#ffe082\",300:\"#ffd54f\",400:\"#ffca28\",500:\"#ffc107\",600:\"#ffb300\",700:\"#ffa000\",800:\"#ff8f00\",900:\"#ff6f00\",A100:\"#ffe57f\",A200:\"#ffd740\",A400:\"#ffc400\",A700:\"#ffab00\",contrastDefaultColor:\"dark\"},orange:{50:\"#fff3e0\",100:\"#ffe0b2\",200:\"#ffcc80\",300:\"#ffb74d\",400:\"#ffa726\",500:\"#ff9800\",600:\"#fb8c00\",700:\"#f57c00\",800:\"#ef6c00\",900:\"#e65100\",A100:\"#ffd180\",A200:\"#ffab40\",A400:\"#ff9100\",A700:\"#ff6d00\",contrastDefaultColor:\"dark\",contrastLightColors:\"800 900\",contrastStrongLightColors:\"800 900\"},\"deep-orange\":{50:\"#fbe9e7\",100:\"#ffccbc\",200:\"#ffab91\",300:\"#ff8a65\",400:\"#ff7043\",500:\"#ff5722\",600:\"#f4511e\",700:\"#e64a19\",800:\"#d84315\",900:\"#bf360c\",A100:\"#ff9e80\",A200:\"#ff6e40\",A400:\"#ff3d00\",A700:\"#dd2c00\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 300 400 A100 A200\",contrastStrongLightColors:\"500 600 700 800 900 A400 A700\"},brown:{50:\"#efebe9\",100:\"#d7ccc8\",200:\"#bcaaa4\",300:\"#a1887f\",400:\"#8d6e63\",500:\"#795548\",600:\"#6d4c41\",700:\"#5d4037\",800:\"#4e342e\",900:\"#3e2723\",A100:\"#d7ccc8\",A200:\"#bcaaa4\",A400:\"#8d6e63\",A700:\"#5d4037\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200\",contrastStrongLightColors:\"300 400\"},grey:{0:\"#ffffff\",50:\"#fafafa\",100:\"#f5f5f5\",200:\"#eeeeee\",300:\"#e0e0e0\",400:\"#bdbdbd\",500:\"#9e9e9e\",600:\"#757575\",700:\"#616161\",800:\"#424242\",900:\"#212121\",1e3:\"#000000\",A100:\"#ffffff\",A200:\"#eeeeee\",A400:\"#bdbdbd\",A700:\"#616161\",contrastDefaultColor:\"dark\",contrastLightColors:\"600 700 800 900\"},\"blue-grey\":{50:\"#eceff1\",100:\"#cfd8dc\",200:\"#b0bec5\",300:\"#90a4ae\",400:\"#78909c\",500:\"#607d8b\",600:\"#546e7a\",700:\"#455a64\",800:\"#37474f\",900:\"#263238\",A100:\"#cfd8dc\",A200:\"#b0bec5\",A400:\"#78909c\",A700:\"#455a64\",contrastDefaultColor:\"light\",contrastDarkColors:\"50 100 200 300\",contrastStrongLightColors:\"400 500\"}})}(),function(){\"use strict\";function e(e){function t(e,t){return t=t||{},d[e]=o(e,t),s}function n(e,t){return o(e,angular.extend({},d[e]||{},t))}function o(e,t){var n=T.filter(function(e){return!t[e]});if(n.length)throw new Error(\"Missing colors %1 in palette %2!\".replace(\"%1\",n.join(\", \")).replace(\"%2\",e));return t}function a(e,t){if(t=t||\"default\",l[e])return l[e];var n=\"string\"==typeof t?l[t]:t,r=new i(e);return n&&angular.forEach(n.colors,function(e,t){r.colors[t]={name:e.name,hues:angular.extend({},e.hues)}}),l[e]=r,r}function i(e){function t(e){if(e=0===arguments.length?!0:!!e,e!==n.isDark){n.isDark=e,n.foregroundPalette=n.isDark?f:u,n.foregroundShadow=n.isDark?p:h;var t=n.isDark?A:M,r=n.isDark?M:A;return angular.forEach(t,function(e,t){var o=n.colors[t],a=r[t];if(o)for(var i in o.hues)o.hues[i]===a[i]&&(o.hues[i]=e[i])}),n}}var n=this;n.name=e,n.colors={},n.dark=t,t(!1),E.forEach(function(e){var t=(n.isDark?A:M)[e];n[e+\"Palette\"]=function(r,o){var a=n.colors[e]={name:r,hues:angular.extend({},t,o)};return Object.keys(a.hues).forEach(function(e){if(!t[e])throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\".replace(\"%1\",e).replace(\"%2\",n.name).replace(\"%3\",r).replace(\"%4\",Object.keys(t).join(\", \")))}),Object.keys(a.hues).map(function(e){return a.hues[e]}).forEach(function(t){if(-1==T.indexOf(t))throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\".replace(\"%1\",t).replace(\"%2\",n.name).replace(\"%3\",e).replace(\"%4\",r).replace(\"%5\",T.join(\", \")))}),n},n[e+\"Color\"]=function(){var t=Array.prototype.slice.call(arguments);return console.warn(\"$mdThemingProviderTheme.\"+e+\"Color() has been deprecated. Use $mdThemingProviderTheme.\"+e+\"Palette() instead.\"),\nn[e+\"Palette\"].apply(n,t)}})}function m(e,t){function n(e){return void 0===e||\"\"===e?!0:void 0!==l[e]}function r(t,n){void 0===n&&(n=t,t=void 0),void 0===t&&(t=e),r.inherit(n,n)}return r.inherit=function(r,o){function a(e){n(e)||t.warn(\"Attempted to use unregistered theme '\"+e+\"'. Register it with $mdThemingProvider.theme().\");var o=r.data(\"$mdThemeName\");o&&r.removeClass(\"md-\"+o+\"-theme\"),r.addClass(\"md-\"+e+\"-theme\"),r.data(\"$mdThemeName\",e)}var i=o.controller(\"mdTheme\"),c=r.attr(\"md-theme-watch\");if((b||angular.isDefined(c))&&\"false\"!=c){var d=e.$watch(function(){return i&&i.$mdTheme||g},a);r.on(\"$destroy\",d)}else{var l=i&&i.$mdTheme||g;a(l)}},r.registered=n,r.defaultTheme=function(){return g},r}d={},l={};var g=\"default\",b=!1;return angular.extend(d,e),m.$inject=[\"$rootScope\",\"$log\"],s={definePalette:t,extendPalette:n,theme:a,setDefaultTheme:function(e){g=e},alwaysWatchTheme:function(e){b=e},$get:m,_LIGHT_DEFAULT_HUES:M,_DARK_DEFAULT_HUES:A,_PALETTES:d,_THEMES:l,_parseRules:r,_rgba:c}}function t(e,t,n){return{priority:100,link:{pre:function(r,o,a){var i={$setTheme:function(t){e.registered(t)||n.warn(\"attempted to use unregistered theme '\"+t+\"'\"),i.$mdTheme=t}};o.data(\"$mdThemeController\",i),i.$setTheme(t(a.mdTheme)(r)),a.$observe(\"mdTheme\",i.$setTheme)}}}}function n(e){return e}function r(e,t,n){a(e,t),n=n.replace(/THEME_NAME/g,e.name);var r=[],o=e.colors[t],i=new RegExp(\".md-\"+e.name+\"-theme\",\"g\"),l=new RegExp(\"('|\\\")?{{\\\\s*(\"+t+\")-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|')?\",\"g\"),s=/'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow)-?(\\d\\.?\\d*)?\\s*\\}\\}'?\"?/g,m=d[o.name];return n=n.replace(s,function(t,n,r,o){return\"foreground\"===n?\"shadow\"==r?e.foregroundShadow:e.foregroundPalette[r]||e.foregroundPalette[1]:(0===r.indexOf(\"hue\")&&(r=e.colors[n].hues[r]),c((d[e.colors[n].name][r]||\"\").value,o))}),angular.forEach(o.hues,function(t,o){var a=n.replace(l,function(e,n,r,o,a){return c(m[t][\"color\"===o?\"value\":\"contrast\"],a)});\"default\"!==o&&(a=a.replace(i,\".md-\"+e.name+\"-theme.md-\"+o)),r.push(a)}),r.join(\"\")}function o(e){function t(e){var t=e.contrastDefaultColor,n=e.contrastLightColors||[],r=e.contrastStrongLightColors||[],o=e.contrastDarkColors||[];\"string\"==typeof n&&(n=n.split(\" \")),\"string\"==typeof r&&(r=r.split(\" \")),\"string\"==typeof o&&(o=o.split(\" \")),delete e.contrastDefaultColor,delete e.contrastLightColors,delete e.contrastStrongLightColors,delete e.contrastDarkColors,angular.forEach(e,function(a,c){function d(){return\"light\"===t?o.indexOf(c)>-1?g:r.indexOf(c)>-1?v:b:n.indexOf(c)>-1?r.indexOf(c)>-1?v:b:g}if(!angular.isObject(a)){var l=i(a);if(!l)throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\".replace(\"%1\",a).replace(\"%2\",e.name).replace(\"%3\",c));e[c]={value:l,contrast:d()}}})}var n=e.has(\"$MD_THEME_CSS\")?e.get(\"$MD_THEME_CSS\"):\"\";angular.forEach(d,t);var o=n.split(/\\}(?!(\\}|'|\"|;))/).filter(function(e){return e&&e.length}).map(function(e){return e.trim()+\"}\"}),a={};E.forEach(function(e){a[e]=\"\"});var c=new RegExp(\"md-(\"+E.join(\"|\")+\")\",\"g\");o.forEach(function(e){for(var t,n=(e.match(c),0);t=E[n];n++)if(e.indexOf(\".md-\"+t)>-1)return a[t]+=e;for(n=0;t=E[n];n++)if(e.indexOf(t)>-1)return a[t]+=e;return a[$]+=e});var s=\"\";if(angular.forEach(l,function(e){E.forEach(function(t){s+=r(e,t,a[t]+\"\")}),e.colors.primary.name==e.colors.accent.name&&console.warn(\"$mdThemingProvider: Using the same palette for primary and accent. This violates the material design spec.\")}),!m){var u=document.createElement(\"style\");u.innerHTML=s;var f=document.getElementsByTagName(\"head\")[0];f.insertBefore(u,f.firstElementChild),m=!0}}function a(e,t){if(!d[(e.colors[t]||{}).name])throw new Error(\"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\".replace(\"%1\",e.name).replace(\"%2\",t).replace(\"%3\",Object.keys(d).join(\", \")))}function i(e){if(angular.isArray(e)&&3==e.length)return e;if(/^rgb/.test(e))return e.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g,\"\").split(\",\").map(function(e,t){return 3==t?parseFloat(e,10):parseInt(e,10)});if(\"#\"==e.charAt(0)&&(e=e.substring(1)),/^([a-fA-F0-9]{3}){1,2}$/g.test(e)){var t=e.length/3,n=e.substr(0,t),r=e.substr(t,t),o=e.substr(2*t);return 1===t&&(n+=n,r+=r,o+=o),[parseInt(n,16),parseInt(r,16),parseInt(o,16)]}}function c(e,t){return 4==e.length&&(e=angular.copy(e),t?e.pop():t=e.pop()),t&&(\"number\"==typeof t||\"string\"==typeof t&&t.length)?\"rgba(\"+e.join(\",\")+\",\"+t+\")\":\"rgb(\"+e.join(\",\")+\")\"}angular.module(\"material.core.theming\",[\"material.core.theming.palette\"]).directive(\"mdTheme\",t).directive(\"mdThemable\",n).provider(\"$mdTheming\",e).run(o);var d,l,s,m,u={name:\"dark\",1:\"rgba(0,0,0,0.87)\",2:\"rgba(0,0,0,0.54)\",3:\"rgba(0,0,0,0.26)\",4:\"rgba(0,0,0,0.12)\"},f={name:\"light\",1:\"rgba(255,255,255,1.0)\",2:\"rgba(255,255,255,0.7)\",3:\"rgba(255,255,255,0.3)\",4:\"rgba(255,255,255,0.12)\"},p=\"1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)\",h=\"\",g=i(\"rgba(0,0,0,0.87)\"),b=i(\"rgba(255,255,255,0.87\"),v=i(\"rgb(255,255,255)\"),E=[\"primary\",\"accent\",\"warn\",\"background\"],$=\"primary\",M={accent:{\"default\":\"A200\",\"hue-1\":\"A100\",\"hue-2\":\"A400\",\"hue-3\":\"A700\"}},A={background:{\"default\":\"500\",\"hue-1\":\"300\",\"hue-2\":\"600\",\"hue-3\":\"800\"}};E.forEach(function(e){var t={\"default\":\"500\",\"hue-1\":\"300\",\"hue-2\":\"800\",\"hue-3\":\"A100\"};M[e]||(M[e]=t),A[e]||(A[e]=t)});var T=[\"50\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\",\"A100\",\"A200\",\"A400\",\"A700\"];e.$inject=[\"$mdColorPalette\"],t.$inject=[\"$mdTheming\",\"$interpolate\",\"$log\"],n.$inject=[\"$mdTheming\"],o.$inject=[\"$injector\"]}(),function(){\"use strict\";angular.module(\"material.components.autocomplete\",[\"material.core\",\"material.components.icon\"])}(),function(){\"use strict\";function e(e){return e}angular.module(\"material.components.backdrop\",[\"material.core\"]).directive(\"mdBackdrop\",e),e.$inject=[\"$mdTheming\"]}(),function(){\"use strict\";function e(){return{restrict:\"E\"}}function t(e){function t(e,t,o,a,i,c,d,l,s,m){function u(n,r,a){h=i('<md-backdrop class=\"md-opaque md-bottom-sheet-backdrop\">')(n),h.on(\"click\",function(){o(d.cancel)}),c.inherit(h,a.parent),e.enter(h,a.parent,null);var s=new p(r,a.parent);return a.bottomSheet=s,a.targetEvent&&angular.element(a.targetEvent.target).blur(),c.inherit(s.element,a.parent),a.disableParentScroll&&(a.lastOverflow=a.parent.css(\"overflow\"),a.parent.css(\"overflow\",\"hidden\")),e.enter(s.element,a.parent).then(function(){var e=angular.element(r[0].querySelector(\"button\")||r[0].querySelector(\"a\")||r[0].querySelector(\"[ng-click]\"));e.focus(),a.escapeToClose&&(a.rootElementKeyupCallback=function(e){e.keyCode===t.KEY_CODE.ESCAPE&&o(d.cancel)},l.on(\"keyup\",a.rootElementKeyupCallback))})}function f(t,n,r){var o=r.bottomSheet;return e.leave(h),e.leave(o.element).then(function(){r.disableParentScroll&&(r.parent.css(\"overflow\",r.lastOverflow),delete r.lastOverflow),o.cleanup(),r.targetEvent&&angular.element(r.targetEvent.target).focus()})}function p(e,a){function i(){e.css(t.CSS.TRANSITION_DURATION,\"0ms\")}function c(n){var o=n.pointer.distanceY;5>o&&(o=Math.max(-r,o/2)),e.css(t.CSS.TRANSFORM,\"translate3d(0,\"+(r+o)+\"px,0)\")}function l(r){if(r.pointer.distanceY>0&&(r.pointer.distanceY>20||Math.abs(r.pointer.velocityY)>n)){var a=e.prop(\"offsetHeight\")-r.pointer.distanceY,i=Math.min(a/r.pointer.velocityY*.75,500);e.css(t.CSS.TRANSITION_DURATION,i+\"ms\"),o(d.cancel)}else e.css(t.CSS.TRANSITION_DURATION,\"\"),e.css(t.CSS.TRANSFORM,\"\")}var s=m.register(a,\"drag\",{horizontal:!1});return a.on(\"$md.dragstart\",i).on(\"$md.drag\",c).on(\"$md.dragend\",l),{element:e,cleanup:function(){s(),a.off(\"$md.dragstart\",i).off(\"$md.drag\",c).off(\"$md.dragend\",l)}}}var h;return{themable:!0,targetEvent:null,onShow:u,onRemove:f,escapeToClose:!0,disableParentScroll:!0}}var n=.5,r=80;return t.$inject=[\"$animate\",\"$mdConstant\",\"$timeout\",\"$$rAF\",\"$compile\",\"$mdTheming\",\"$mdBottomSheet\",\"$rootElement\",\"$rootScope\",\"$mdGesture\"],e(\"$mdBottomSheet\").setDefaults({methods:[\"disableParentScroll\",\"escapeToClose\",\"targetEvent\"],options:t})}angular.module(\"material.components.bottomSheet\",[\"material.core\",\"material.components.backdrop\"]).directive(\"mdBottomSheet\",e).provider(\"$mdBottomSheet\",t),t.$inject=[\"$$interimElementProvider\"]}(),function(){\"use strict\";function e(e){return{restrict:\"E\",link:function(t,n){e(n)}}}angular.module(\"material.components.card\",[\"material.core\"]).directive(\"mdCard\",e),e.$inject=[\"$mdTheming\"]}(),function(){\"use strict\";function e(e,t,n){function r(e){return angular.isDefined(e.href)||angular.isDefined(e.ngHref)}function o(e,t){return r(t)?'<a class=\"md-button\" ng-transclude></a>':'<button class=\"md-button\" ng-transclude></button>'}function a(o,a,i){var c=a[0];t(a),e.attachButtonBehavior(o,a);var d=c.textContent.trim();d||n.expect(a,\"aria-label\"),r(i)&&angular.isDefined(i.ngDisabled)&&o.$watch(i.ngDisabled,function(e){a.attr(\"tabindex\",e?-1:0)})}return{restrict:\"E\",replace:!0,transclude:!0,template:o,link:a}}angular.module(\"material.components.button\",[\"material.core\"]).directive(\"mdButton\",e),e.$inject=[\"$mdInkRipple\",\"$mdTheming\",\"$mdAria\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a){function i(t,i){return i.type=\"checkbox\",i.tabIndex=0,t.attr(\"role\",i.type),function(t,i,d,l){function s(e){e.which===r.KEY_CODE.SPACE&&(e.preventDefault(),m(e))}function m(e){i[0].hasAttribute(\"disabled\")||t.$apply(function(){f=!f,l.$setViewValue(f,e&&e.type),l.$render()})}function u(){f=l.$viewValue,f?i.addClass(c):i.removeClass(c)}l=l||a.fakeNgModel();var f=!1;o(i),d.ngChecked&&t.$watch(t.$eval.bind(t,d.ngChecked),l.$setViewValue.bind(l)),n.expectWithText(i,\"aria-label\"),e.link.pre(t,{on:angular.noop,0:{}},d,[l]),i.on(\"click\",m).on(\"keypress\",s),l.$render=u}}e=e[0];var c=\"md-checked\";return{restrict:\"E\",transclude:!0,require:\"?ngModel\",template:'<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox><div class=\"md-icon\"></div></div><div ng-transclude class=\"md-label\"></div>',compile:i}}angular.module(\"material.components.checkbox\",[\"material.core\"]).directive(\"mdCheckbox\",e),e.$inject=[\"inputDirective\",\"$mdInkRipple\",\"$mdAria\",\"$mdConstant\",\"$mdTheming\",\"$mdUtil\"]}(),function(){\"use strict\";function e(e){function n(e,t){this.$scope=e,this.$element=t}return{restrict:\"E\",controller:[\"$scope\",\"$element\",n],link:function(n,r){r[0],e(r),n.$broadcast(\"$mdContentLoaded\",r),t(r[0])}}}function t(e){angular.element(e).on(\"$md.pressdown\",function(t){\"t\"===t.pointer.type&&(t.$materialScrollFixed||(t.$materialScrollFixed=!0,0===e.scrollTop?e.scrollTop=1:e.scrollHeight===e.scrollTop+e.offsetHeight&&(e.scrollTop-=1)))})}angular.module(\"material.components.content\",[\"material.core\"]).directive(\"mdContent\",e),e.$inject=[\"$mdTheming\"]}(),function(){\"use strict\";function e(e,t){return{restrict:\"E\",link:function(n,r){t(r),e(function(){var e=r[0].querySelector(\"md-content\");e&&e.scrollHeight>e.clientHeight&&r.addClass(\"md-content-overflow\")})}}}function t(e){function t(e,t){return{template:['<md-dialog md-theme=\"{{ dialog.theme }}\" aria-label=\"{{ dialog.ariaLabel }}\">',\"<md-content>\",\"<h2>{{ dialog.title }}</h2>\",\"<p>{{ dialog.content }}</p>\",\"</md-content>\",'<div class=\"md-actions\">','<md-button ng-if=\"dialog.$type == \\'confirm\\'\" ng-click=\"dialog.abort()\">',\"{{ dialog.cancel }}\",\"</md-button>\",'<md-button ng-click=\"dialog.hide()\" class=\"md-primary\">',\"{{ dialog.ok }}\",\"</md-button>\",\"</div>\",\"</md-dialog>\"].join(\"\"),controller:function(){this.hide=function(){e.hide(!0)},this.abort=function(){e.cancel()}},controllerAs:\"dialog\",bindToController:!0,theme:t.defaultTheme()}}function n(e,t,n,r,o,a,i,c,d,l,s,m){function u(n,o,i){function l(){var e=o[0].querySelector(\".dialog-close\");if(!e){var t=o[0].querySelectorAll(\".md-actions button\");e=t[t.length-1]}return angular.element(e)}i.parent=angular.element(i.parent),i.popInTarget=angular.element((i.targetEvent||{}).target);var s=l();if(p(o.find(\"md-dialog\")),i.hasBackdrop){var u=i.parent[0]==a[0].body&&a[0].documentElement&&a[0].scrollTop?angular.element(a[0].documentElement):i.parent,f=u.prop(\"scrollTop\");i.backdrop=angular.element('<md-backdrop class=\"md-dialog-backdrop md-opaque\">'),d.inherit(i.backdrop,i.parent),r.enter(i.backdrop,i.parent),o.css(\"top\",f+\"px\")}return i.disableParentScroll&&(i.lastOverflow=i.parent.css(\"overflow\"),i.parent.css(\"overflow\",\"hidden\")),h(o,i.parent,i.popInTarget&&i.popInTarget.length&&i.popInTarget).then(function(){i.escapeToClose&&(i.rootElementKeyupCallback=function(t){t.keyCode===c.KEY_CODE.ESCAPE&&e(m.cancel)},t.on(\"keyup\",i.rootElementKeyupCallback)),i.clickOutsideToClose&&(i.dialogClickOutsideCallback=function(t){t.target===o[0]&&e(m.cancel)},o.on(\"click\",i.dialogClickOutsideCallback)),s.focus()})}function f(e,n,o){return o.backdrop&&r.leave(o.backdrop),o.disableParentScroll&&(o.parent.css(\"overflow\",o.lastOverflow),delete o.lastOverflow),o.escapeToClose&&t.off(\"keyup\",o.rootElementKeyupCallback),o.clickOutsideToClose&&n.off(\"click\",o.dialogClickOutsideCallback),g(n,o.parent,o.popInTarget&&o.popInTarget.length&&o.popInTarget).then(function(){o.scope.$destroy(),n.remove(),o.popInTarget&&o.popInTarget.focus()})}function p(e){e.attr({role:\"dialog\"});var t=e.find(\"md-content\");0===t.length&&(t=e),o.expectAsync(e,\"aria-label\",function(){var e=t.text().split(/\\s+/);return e.length>3&&(e=e.slice(0,3).concat(\"...\")),e.join(\" \")})}function h(e,t,n){var r=e.find(\"md-dialog\");return t.append(e),b(r,n),l(function(){r.addClass(\"transition-in\").css(c.CSS.TRANSFORM,\"\")}),i.transitionEndPromise(r)}function g(e,t,n){var r=e.find(\"md-dialog\");return r.addClass(\"transition-out\").removeClass(\"transition-in\"),b(r,n),i.transitionEndPromise(r)}function b(e,t){if(t){var n=t[0].getBoundingClientRect(),r=e[0].getBoundingClientRect(),o=Math.min(.5,n.width/r.width),a=Math.min(.5,n.height/r.height);e.css(c.CSS.TRANSFORM,\"translate3d(\"+(-r.left+n.left+n.width/2-r.width/2)+\"px,\"+(-r.top+n.top+n.height/2-r.height/2)+\"px,0) scale(\"+o+\",\"+a+\")\")}}return{hasBackdrop:!0,isolateScope:!0,onShow:u,onRemove:f,clickOutsideToClose:!0,escapeToClose:!0,targetEvent:null,disableParentScroll:!0,transformTemplate:function(e){return'<div class=\"md-dialog-container\">'+e+\"</div>\"}}}return t.$inject=[\"$mdDialog\",\"$mdTheming\"],n.$inject=[\"$timeout\",\"$rootElement\",\"$compile\",\"$animate\",\"$mdAria\",\"$document\",\"$mdUtil\",\"$mdConstant\",\"$mdTheming\",\"$$rAF\",\"$q\",\"$mdDialog\"],e(\"$mdDialog\").setDefaults({methods:[\"disableParentScroll\",\"hasBackdrop\",\"clickOutsideToClose\",\"escapeToClose\",\"targetEvent\"],options:n}).addPreset(\"alert\",{methods:[\"title\",\"content\",\"ariaLabel\",\"ok\",\"theme\"],options:t}).addPreset(\"confirm\",{methods:[\"title\",\"content\",\"ariaLabel\",\"ok\",\"cancel\",\"theme\"],options:t})}angular.module(\"material.components.dialog\",[\"material.core\",\"material.components.backdrop\"]).directive(\"mdDialog\",e).provider(\"$mdDialog\",t),e.$inject=[\"$$rAF\",\"$mdTheming\"],t.$inject=[\"$$interimElementProvider\"]}(),function(){\"use strict\";function e(){}function t(t){return{restrict:\"E\",link:t,controller:[e]}}angular.module(\"material.components.divider\",[\"material.core\"]).directive(\"mdDivider\",t),t.$inject=[\"$mdTheming\"]}(),function(){\"use strict\";function e(e,n,r,o){function a(t,a,i,c){function d(){for(var e in n.MEDIA)o(e),o.getQuery(n.MEDIA[e]).addListener(M);return o.watchResponsiveAttributes([\"md-cols\",\"md-row-height\"],i,s)}function l(){A();for(var e in n.MEDIA)o.getQuery(n.MEDIA[e]).removeListener(M)}function s(e){null==e?c.invalidateLayout():o(e)&&c.invalidateLayout()}function m(){var e=p(),n=g(),o=E(),i=v(),c=b(),d=r(n,h(),p()).map(function(t,r){return{grid:{element:a,style:f(n,r,c,o,i)},tiles:t.map(function(t,a){return{element:angular.element(e[a]),style:u(t.position,t.spans,n,r,c,o,i)}})}}).reflow().performance();t.mdOnLayout({$event:{performance:d}})}function u(e,t,n,r,o,a,i){var c=1/n*100,d=1===n?0:(n-1)/n,l=T({share:c,gutterShare:d,gutter:o}),s={left:w({unit:l,offset:e.col,gutter:o}),width:k({unit:l,span:t.col,gutter:o}),paddingTop:\"\",marginTop:\"\",top:\"\",height:\"\"};switch(a){case\"fixed\":s.top=w({unit:i,offset:e.row,gutter:o}),s.height=k({unit:i,span:t.row,gutter:o});break;case\"ratio\":var m=c*(1/i),u=T({share:m,gutterShare:d,gutter:o});s.paddingTop=k({unit:u,span:t.row,gutter:o}),s.marginTop=w({unit:u,offset:e.row,gutter:o});break;case\"fit\":var f=1===r?0:(r-1)/r,m=1/r*100,u=T({share:m,gutterShare:f,gutter:o});s.top=w({unit:u,offset:e.row,gutter:o}),s.height=k({unit:u,span:t.row,gutter:o})}return s}function f(e,t,n,r,o){var a={height:\"\",paddingBottom:\"\"};switch(r){case\"fixed\":a.height=k({unit:o,span:t,gutter:n});break;case\"ratio\":var i=1===e?0:(e-1)/e,c=1/e*100,d=c*(1/o),l=T({share:d,gutterShare:i,gutter:n});a.paddingBottom=k({unit:l,span:t,gutter:n});break;case\"fit\":}return a}function p(){return c.tiles.map(function(e){return e.element})}function h(){return c.tiles.map(function(e){return{row:parseInt(o.getResponsiveAttribute(e.attrs,\"md-rowspan\"),10)||1,col:parseInt(o.getResponsiveAttribute(e.attrs,\"md-colspan\"),10)||1}})}function g(){var e=parseInt(o.getResponsiveAttribute(i,\"md-cols\"),10);if(isNaN(e))throw\"md-grid-list: md-cols attribute was not found, or contained a non-numeric value\";return e}function b(){return $(o.getResponsiveAttribute(i,\"md-gutter\")||1)}function v(){var e=o.getResponsiveAttribute(i,\"md-row-height\");switch(E()){case\"fixed\":return $(e);case\"ratio\":var t=e.split(\":\");return parseFloat(t[0])/parseFloat(t[1]);case\"fit\":return 0}}function E(){var e=o.getResponsiveAttribute(i,\"md-row-height\");return\"fit\"==e?\"fit\":-1!==e.indexOf(\":\")?\"ratio\":\"fixed\"}function $(e){return/\\D$/.test(e)?e:e+\"px\"}a.attr(\"role\",\"list\"),c.layoutDelegate=m;var M=angular.bind(c,c.invalidateLayout),A=d();t.$on(\"$destroy\",l);var T=e(\"{{ share }}% - ({{ gutter }} * {{ gutterShare }})\"),w=e(\"calc(({{ unit }}) * {{ offset }} + {{ offset }} * {{ gutter }})\"),k=e(\"calc(({{ unit }}) * {{ span }} + ({{ span }} - 1) * {{ gutter }})\")}return{restrict:\"E\",controller:t,scope:{mdOnLayout:\"&\"},link:a}}function t(e){this.invalidated=!1,this.$timeout_=e,this.tiles=[],this.layoutDelegate=angular.noop}function n(e){function t(t,n){var a,i,c,d,l,s,i;return d=e.time(function(){i=r(t,n)}),a={layoutInfo:function(){return i},map:function(t){return l=e.time(function(){var e=a.layoutInfo();c=t(e.positioning,e.rowCount)}),a},reflow:function(t){return s=e.time(function(){var e=t||o;e(c.grid,c.tiles)}),a},performance:function(){return{tileCount:n.length,layoutTime:d,mapTime:l,reflowTime:s,totalTime:d+l+s}}}}function n(e,t){e.element.css(e.style),t.forEach(function(e){e.element.css(e.style)})}function r(e,t){function n(t,n){if(t.col>e)throw\"md-grid-list: Tile at position \"+n+\" has a colspan (\"+t.col+\") that exceeds the column count (\"+e+\")\";for(var i=0,s=0;s-i<t.col;)c>=e?r():(i=l.indexOf(0,c),-1!==i&&-1!==(s=a(i+1))?c=s+1:(i=s=0,r()));return o(i,t.col,t.row),c=i+t.col,{col:i,row:d}}function r(){c=0,d++,o(0,e,-1)}function o(e,t,n){for(var r=e;e+t>r;r++)l[r]=Math.max(l[r]+n,0)}function a(e){var t;for(t=e;t<l.length;t++)if(0!==l[t])return t;return t===l.length?t:void 0}function i(){for(var t=[],n=0;e>n;n++)t.push(0);return t}var c=0,d=0,l=i();return{positioning:t.map(function(e,t){return{spans:e,position:n(e,t)}}),rowCount:d+Math.max.apply(Math,l)}}var o=n;return t.animateWith=function(e){o=angular.isFunction(e)?e:n},t}function r(e){function t(t,n,r,o){n.attr(\"role\",\"listitem\");var a=e.watchResponsiveAttributes([\"md-colspan\",\"md-rowspan\"],r,angular.bind(o,o.invalidateLayout));o.addTile(n,r,t.$parent.$index),t.$on(\"$destroy\",function(){a(),o.removeTile(n,r)})}return{restrict:\"E\",require:\"^mdGridList\",template:\"<figure ng-transclude></figure>\",transclude:!0,scope:{},link:t}}function o(){return{template:\"<figcaption ng-transclude></figcaption>\",transclude:!0}}angular.module(\"material.components.gridList\",[\"material.core\"]).directive(\"mdGridList\",e).directive(\"mdGridTile\",r).directive(\"mdGridTileFooter\",o).directive(\"mdGridTileHeader\",o).factory(\"$mdGridLayout\",n),e.$inject=[\"$interpolate\",\"$mdConstant\",\"$mdGridLayout\",\"$mdMedia\",\"$mdUtil\"],t.$inject=[\"$timeout\"],t.prototype={addTile:function(e,t,n){var r={element:e,attrs:t};angular.isUndefined(n)?this.tiles.push(r):this.tiles.splice(n,0,r),this.invalidateLayout()},removeTile:function(e,t){var n=this._findTileIndex(t);-1!==n&&(this.tiles.splice(n,1),this.invalidateLayout())},invalidateLayout:function(){this.invalidated||(this.invalidated=!0,this.$timeout_(angular.bind(this,this.layout)))},layout:function(){try{this.layoutDelegate()}finally{this.invalidated=!1}},_findTileIndex:function(e){for(var t=0;t<this.tiles.length;t++)if(this.tiles[t].attrs==e)return t;return-1}},n.$inject=[\"$mdUtil\"],r.$inject=[\"$mdMedia\"]}(),function(){\"use strict\";function e(e,t,n){function r(e,t){return t.mdFontIcon?'<span class=\"md-font\" ng-class=\"fontIcon\"></span>':\"\"}function o(r,o,a){function i(){var e=o.parent();return e.attr(\"aria-label\")||e.text()?!0:e.parent().attr(\"aria-label\")||e.parent().text()?!0:!1}t(o);var c=a.alt||r.fontIcon||r.svgIcon,d=a.$normalize(a.$attr.mdSvgIcon||a.$attr.mdSvgSrc||\"\");\"\"==a.alt||i()?n.expect(o,\"aria-hidden\",\"true\"):(n.expect(o,\"aria-label\",c),n.expect(o,\"role\",\"img\")),d&&a.$observe(d,function(t){o.empty(),t&&e(t).then(function(e){o.append(e)})})}return{scope:{fontIcon:\"@mdFontIcon\",svgIcon:\"@mdSvgIcon\",svgSrc:\"@mdSvgSrc\"},restrict:\"E\",template:r,link:o}}angular.module(\"material.components.icon\",[\"material.core\"]).directive(\"mdIcon\",e),e.$inject=[\"$mdIcon\",\"$mdTheming\",\"$mdAria\"]}(),function(){\"use strict\";function e(){}function t(e,t){this.url=e,this.iconSize=t||r.defaultIconSize}function n(e,t,n,r,o){function a(t){return function(n){return h[t]=m(n)?n:new u(n,e[t]),h[t].clone()}}function i(t){var r=e[t];return r?d(r.url).then(function(e){return new u(e,r)}):n.reject(t)}function c(t){function r(e){var r=t.slice(t.lastIndexOf(\":\")+1),o=e.querySelector(\"#\"+r);return o?new u(o,a):n.reject(t)}var o=t.substring(0,t.lastIndexOf(\":\"))||\"$default\",a=e[o];return a?d(a.url).then(r):n.reject(t)}function d(e){return t.get(e,{cache:o}).then(function(e){for(var t=angular.element(e.data),n=0;n<t.length;++n)if(\"svg\"==t[n].nodeName)return t[n]})}function l(e){var t;return angular.isString(e)&&(t=\"icon \"+e+\" not found\",r.warn(t)),n.reject(t||e)}function s(e){var t=angular.isString(e)?e:e.message||e.data||e.statusText;return r.warn(t),n.reject(t)}function m(e){return angular.isDefined(e.element)&&angular.isDefined(e.config)}function u(e,t){\"svg\"!=e.tagName&&(e=angular.element('<svg xmlns=\"http://www.w3.org/2000/svg\">').append(e)[0]),e=angular.element(e),e.attr(\"xmlns\")||e.attr(\"xmlns\",\"http://www.w3.org/2000/svg\"),this.element=e,this.config=t,this.prepare()}function f(){var t=this.config?this.config.iconSize:e.defaultIconSize,n=angular.element(this.element);n.attr({fit:\"\",height:\"100%\",width:\"100%\",preserveAspectRatio:\"xMidYMid meet\",viewBox:n.attr(\"viewBox\")||\"0 0 \"+t+\" \"+t}).css({\"pointer-events\":\"none\",display:\"block\"}),this.element=n}function p(){return angular.element(this.element[0].cloneNode(!0))}var h={},g=/[-a-zA-Z0-9@:%_\\+.~#?&\\/\\/=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&\\/\\/=]*)?/i;return u.prototype={clone:p,prepare:f},function(e){return e=e||\"\",h[e]?n.when(h[e].clone()):g.test(e)?d(e).then(a(e)):(-1==e.indexOf(\":\")&&(e=\"$default:\"+e),i(e)[\"catch\"](c)[\"catch\"](l)[\"catch\"](s).then(a(e)))}}angular.module(\"material.components.icon\").provider(\"$mdIcon\",e);var r={defaultIconSize:24};e.prototype={icon:function(e,n,o){return-1==e.indexOf(\":\")&&(e=\"$default:\"+e),r[e]=new t(n,o),this},iconSet:function(e,n,o){return r[e]=new t(n,o),this},defaultIconSet:function(e,n){var o=\"$default\";return r[o]||(r[o]=new t(e,n)),r[o].iconSize=n||r.defaultIconSize,this},defaultIconSize:function(e){return r.defaultIconSize=e,this},preloadIcons:function(e){var t=this,n=[{id:\"tabs-arrow\",url:\"tabs-arrow.svg\",svg:'<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"tabs-arrow\"><polygon points=\"15.4,7.4 14,6 8,12 14,18 15.4,16.6 10.8,12 \"/></g></svg>'},{id:\"close\",url:\"close.svg\",svg:'<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g></svg>'},{id:\"cancel\",url:\"cancel.svg\",svg:'<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g></svg>'}];n.forEach(function(n){t.icon(n.id,n.url),e.put(n.url,n.svg)})},$get:[\"$http\",\"$q\",\"$log\",\"$templateCache\",function(e,t,o,a){return this.preloadIcons(a),new n(r,e,t,o,a)}]}}(),function(){function e(e,t){function n(t,n){e(n)}function r(e,n,r){var o=this;o.isErrorGetter=r.mdIsError&&t(r.mdIsError),o.element=n,o.setFocused=function(e){n.toggleClass(\"md-input-focused\",!!e)},o.setHasValue=function(e){n.toggleClass(\"md-input-has-value\",!!e)},o.setInvalid=function(e){n.toggleClass(\"md-input-invalid\",!!e)},e.$watch(function(){return o.label&&o.input},function(e){e&&!o.label.attr(\"for\")&&o.label.attr(\"for\",o.input.attr(\"id\"))})}return r.$inject=[\"$scope\",\"$element\",\"$attrs\"],{restrict:\"E\",link:n,controller:r}}function t(){return{restrict:\"E\",require:\"^?mdInputContainer\",link:function(e,t,n,r){r&&!n.mdNoFloat&&(r.label=t,e.$on(\"$destroy\",function(){r.label=null}))}}}function n(e,t){function n(n,r,o,a){function i(e){return l.setHasValue(!s.$isEmpty(e)),e}function c(){l.setHasValue(r.val().length>0||(r[0].validity||{}).badInput)}function d(){function o(e){return l(),e}function a(){d.style.height=\"auto\",d.scrollTop=0;var e=i();e&&(d.style.height=e+\"px\")}function i(){var e=d.scrollHeight-d.offsetHeight;return d.offsetHeight+(e>0?e:0)}function c(){d.scrollTop=0;var e=d.scrollHeight-d.offsetHeight,t=d.offsetHeight+e;d.style.height=t+\"px\"}var d=r[0],l=e.debounce(a,1);s?(s.$formatters.push(o),s.$viewChangeListeners.push(o)):l(),r.on(\"keydown input\",l),r.on(\"scroll\",c),angular.element(t).on(\"resize\",l),n.$on(\"$destroy\",function(){angular.element(t).off(\"resize\",l)})}var l=a[0],s=a[1]||e.fakeNgModel(),m=angular.isDefined(o.readonly);if(l){if(l.input)throw new Error(\"<md-input-container> can only have *one* <input> or <textarea> child element!\");l.input=r,r.addClass(\"md-input\"),r.attr(\"id\")||r.attr(\"id\",\"input_\"+e.nextUid()),\"textarea\"===r[0].tagName.toLowerCase()&&d();var u=l.isErrorGetter||function(){return s.$invalid&&s.$touched};n.$watch(u,l.setInvalid),s.$parsers.push(i),s.$formatters.push(i),r.on(\"input\",c),m||r.on(\"focus\",function(){l.setFocused(!0),s.$setTouched(),u()&&l.setInvalid(!0)}).on(\"blur\",function(){l.setFocused(!1),c()}),n.$on(\"$destroy\",function(){l.setFocused(!1),l.setHasValue(!1),l.input=null})}}return{restrict:\"E\",require:[\"^?mdInputContainer\",\"?ngModel\"],link:n}}function r(e){function t(t,n,r,o){function a(e){return l.text((n.val()||e||\"\").length+\"/\"+i),e}var i,c=o[0],d=o[1],l=angular.element('<div class=\"md-char-counter\">');r.$set(\"ngTrim\",\"false\"),d.element.append(l),c.$formatters.push(a),c.$viewChangeListeners.push(a),n.on(\"input keydown\",function(){a()}),t.$watch(r.mdMaxlength,function(t){i=t,angular.isNumber(t)&&t>0?(l.parent().length||e.enter(l,d.element,angular.element(d.element[0].lastElementChild)),a()):e.leave(l)}),c.$validators[\"md-maxlength\"]=function(e,t){return!angular.isNumber(i)||0>i?!0:(e||n.val()||t||\"\").length<=i}}return{restrict:\"A\",require:[\"ngModel\",\"^mdInputContainer\"],link:t}}function o(){function e(e,t,n,r){if(r){var o=n.placeholder;t.removeAttr(\"placeholder\"),r.element.append('<div class=\"md-placeholder\">'+o+\"</div>\")}}return{restrict:\"A\",require:\"^^?mdInputContainer\",link:e}}angular.module(\"material.components.input\",[\"material.core\"]).directive(\"mdInputContainer\",e).directive(\"label\",t).directive(\"input\",n).directive(\"textarea\",n).directive(\"mdMaxlength\",r).directive(\"placeholder\",o),e.$inject=[\"$mdTheming\",\"$parse\"],n.$inject=[\"$mdUtil\",\"$window\"],r.$inject=[\"$animate\"]}(),function(){\"use strict\";function e(){return{restrict:\"E\",link:function(e,t){t.attr({role:\"list\"})}}}function t(){return{restrict:\"E\",link:function(e,t){t.attr({role:\"listitem\"})}}}angular.module(\"material.components.list\",[\"material.core\"]).directive(\"mdList\",e).directive(\"mdItem\",t)}(),function(){\"use strict\";function e(e,t,n){function r(e){return e.attr(\"aria-valuemin\",0),e.attr(\"aria-valuemax\",100),e.attr(\"role\",\"progressbar\"),o}function o(e,r,o){n(r);var d,l,s,m,u=r[0],f=u.querySelectorAll(\".md-fill, .md-mask.md-full\"),p=u.querySelectorAll(\".md-fill.md-fix\"),h=o.mdDiameter||48,g=h/48;u.style[t.CSS.TRANSFORM]=\"scale(\"+g.toString()+\")\",o.$observe(\"value\",function(e){for(l=a(e),s=i[l],m=c[l],r.attr(\"aria-valuenow\",l),d=0;d<f.length;d++)f[d].style[t.CSS.TRANSFORM]=s;for(d=0;d<p.length;d++)p[d].style[t.CSS.TRANSFORM]=m})}function a(e){return e>100?100:0>e?0:Math.ceil(e||0)}for(var i=new Array(101),c=new Array(101),d=0;101>d;d++){var l=d/100,s=Math.floor(180*l);i[d]=\"rotate(\"+s.toString()+\"deg)\",c[d]=\"rotate(\"+(2*s).toString()+\"deg)\"}return{restrict:\"E\",template:'<div class=\"md-spinner-wrapper\"><div class=\"md-inner\"><div class=\"md-gap\"></div><div class=\"md-left\"><div class=\"md-half-circle\"></div></div><div class=\"md-right\"><div class=\"md-half-circle\"></div></div></div></div>',compile:r}}angular.module(\"material.components.progressCircular\",[\"material.core\"]).directive(\"mdProgressCircular\",e),e.$inject=[\"$$rAF\",\"$mdConstant\",\"$mdTheming\"]}(),function(){\"use strict\";function e(e,n,r){function o(e){return e.attr(\"aria-valuemin\",0),e.attr(\"aria-valuemax\",100),e.attr(\"role\",\"progressbar\"),a}function a(o,a,c){r(a);var d=a[0].querySelector(\".md-bar1\").style,l=a[0].querySelector(\".md-bar2\").style,s=angular.element(a[0].querySelector(\".md-container\"));c.$observe(\"value\",function(e){if(\"query\"!=c.mdMode){var r=i(e);a.attr(\"aria-valuenow\",r),l[n.CSS.TRANSFORM]=t[r]}}),c.$observe(\"mdBufferValue\",function(e){d[n.CSS.TRANSFORM]=t[i(e)]}),e(function(){s.addClass(\"md-ready\")})}function i(e){return e>100?100:0>e?0:Math.ceil(e||0)}return{restrict:\"E\",template:'<div class=\"md-container\"><div class=\"md-dashed\"></div><div class=\"md-bar md-bar1\"></div><div class=\"md-bar md-bar2\"></div></div>',compile:o}}angular.module(\"material.components.progressLinear\",[\"material.core\"]).directive(\"mdProgressLinear\",e),e.$inject=[\"$$rAF\",\"$mdConstant\",\"$mdTheming\"];var t=function(){function e(e){var t=e/100,n=(e-100)/2;return\"translateX(\"+n.toString()+\"%) scale(\"+t.toString()+\", 1)\"}for(var t=new Array(101),n=0;101>n;n++)t[n]=e(n);return t}()}(),function(){\"use strict\";function e(e,t,n){function r(r,o,a,i){function c(n){switch(n.keyCode){case t.KEY_CODE.LEFT_ARROW:case t.KEY_CODE.UP_ARROW:n.preventDefault(),d.selectPrevious();break;case t.KEY_CODE.RIGHT_ARROW:case t.KEY_CODE.DOWN_ARROW:n.preventDefault(),d.selectNext();break;case t.KEY_CODE.ENTER:var r=angular.element(e.getClosest(o[0],\"form\"));r.length>0&&r.triggerHandler(\"submit\")}}n(o);var d=i[0],l=i[1]||e.fakeNgModel();d.init(l),o.attr({role:\"radiogroup\",tabIndex:o.attr(\"tabindex\")||\"0\"}).on(\"keydown\",c)}function o(e){this._radioButtonRenderFns=[],this.$element=e}function a(){return{init:function(e){this._ngModelCtrl=e,this._ngModelCtrl.$render=angular.bind(this,this.render)},add:function(e){this._radioButtonRenderFns.push(e)},remove:function(e){var t=this._radioButtonRenderFns.indexOf(e);-1!==t&&this._radioButtonRenderFns.splice(t,1)},render:function(){this._radioButtonRenderFns.forEach(function(e){e()})},setViewValue:function(e,t){this._ngModelCtrl.$setViewValue(e,t),this.render()},getViewValue:function(){return this._ngModelCtrl.$viewValue},selectNext:function(){return i(this.$element,1)},selectPrevious:function(){return i(this.$element,-1)},setActiveDescendant:function(e){this.$element.attr(\"aria-activedescendant\",e)}}}function i(t,n){var r=e.iterator(t[0].querySelectorAll(\"md-radio-button\"),!0);if(r.count()){var o=function(e){return!angular.element(e).attr(\"disabled\")},a=t[0].querySelector(\"md-radio-button.md-checked\"),i=r[0>n?\"previous\":\"next\"](a,o)||r.first();angular.element(i).triggerHandler(\"click\")}}return o.prototype=a(),{restrict:\"E\",\ncontroller:[\"$element\",o],require:[\"mdRadioGroup\",\"?ngModel\"],link:{pre:r}}}function t(e,t,n){function r(r,a,i,c){function d(e){a[0].hasAttribute(\"disabled\")||r.$apply(function(){c.setViewValue(i.value,e&&e.type)})}function l(){var e=c.getViewValue()==i.value;e!==m&&(m=e,a.attr(\"aria-checked\",e),e?(a.addClass(o),c.setActiveDescendant(a.attr(\"id\"))):a.removeClass(o))}function s(n,r){function o(){return i.id||\"radio_\"+t.nextUid()}r.ariaId=o(),n.attr({id:r.ariaId,role:\"radio\",\"aria-checked\":\"false\"}),e.expectWithText(n,\"aria-label\")}var m;n(a),s(a,r),c.add(l),i.$observe(\"value\",l),a.on(\"click\",d).on(\"$destroy\",function(){c.remove(l)})}var o=\"md-checked\";return{restrict:\"E\",require:\"^mdRadioGroup\",transclude:!0,template:'<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox><div class=\"md-off\"></div><div class=\"md-on\"></div></div><div ng-transclude class=\"md-label\"></div>',link:r}}angular.module(\"material.components.radioButton\",[\"material.core\"]).directive(\"mdRadioGroup\",e).directive(\"mdRadioButton\",t),e.$inject=[\"$mdUtil\",\"$mdConstant\",\"$mdTheming\"],t.$inject=[\"$mdAria\",\"$mdUtil\",\"$mdTheming\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a){function i(r,i){var l=r.find(\"md-select-label\").remove();l.length||(l=angular.element(\"<md-select-label><span></span></md-select-label>\")),l.append('<span class=\"md-select-icon\" aria-hidden=\"true\"></span>'),l.addClass(\"md-select-label\"),l.addClass(c+i.ngModel+\" !== undefined ? '' : 'md-placeholder'\"+d),l.attr(\"id\",\"select_label_\"+t.nextUid()),r.find(\"md-content\").length||r.append(angular.element(\"<md-content>\").append(r.contents())),i.mdOnOpen&&r.find(\"md-content\").prepend(angular.element(\"<md-progress-circular>\").attr(\"md-mode\",\"indeterminate\").attr(\"ng-hide\",\"$$loadingAsyncDone\").wrap(\"<div>\").parent());var s=angular.element('<div class=\"md-select-menu-container\"><md-select-menu '+(angular.isDefined(i.multiple)?\"multiple\":\"\")+\">\"+r.html()+\"</md-select-menu></div>\");return r.empty().append(l),n(r),function(n,r,i,c){function d(){if(a(i.ngModel)(n)){var e=angular.element(s).find(\"md-select-menu\");e.data(\"$ngModelController\",c);var t=n.$new();e=o(e)(t);var r=e.controller(\"mdSelectMenu\");t.$$postDigest(function(){c.$render(),l(r.selectedLabels()),e.scope().$destroy()})}else l()}function l(e){if(!h){var t=e||i.placeholder;p.html(t)}}function m(e){var t=[32,13,38,40];-1!=t.indexOf(e.keyCode)&&(e.preventDefault(),u(e))}function u(){n.$evalAsync(function(){var t=s.clone();t.find(\"md-select-menu\").data(\"$ngModelController\",c),f=!0,e.show({scope:n.$new(),element:t,target:r[0],hasBackdrop:!0,loadingAsync:i.mdOnOpen?n.$eval(i.mdOnOpen):!1,setLabelText:l}).then(function(){f=!1})})}var f,p=r.find(\"md-select-label\"),h=0!==p.text().length;h||(p=p.children().eq(0)),d(),i.$observe(\"disabled\",function(e){void 0!==e?(r.attr(\"tabindex\",-1),r.off(\"click\",u),r.off(\"keydown\",m)):(r.attr(\"tabindex\",0),r.on(\"click\",u),r.on(\"keydown\",m))}),void 0===i.disabled&&(r.on(\"click\",u),r.on(\"keydown\",m)),r.attr({role:\"combobox\",id:\"select_\"+t.nextUid(),\"aria-haspopup\":!0,\"aria-expanded\":\"false\",\"aria-labelledby\":p.attr(\"id\")}),n.$on(\"$destroy\",function(){f&&e.cancel()})}}var c=r.startSymbol(),d=r.endSymbol();return{restrict:\"E\",require:\"?ngModel\",compile:i}}function t(e,t,n){function r(e,r,o,a){function i(){r.attr({id:\"select_menu_\"+t.nextUid(),role:\"listbox\",\"aria-multiselectable\":l.isMultiple?\"true\":\"false\"})}function c(e){(13==e.keyCode||32==e.keyCode)&&d(e)}function d(n){var r=t.getClosest(n.target,\"md-option\"),o=r&&angular.element(r).data(\"$mdOptionController\");if(r&&o){var a=l.hashGetter(o.value),i=angular.isDefined(l.selected[a]);e.$apply(function(){l.isMultiple?i?l.deselect(a):l.select(a,o.value):i||(l.deselect(Object.keys(l.selected)[0]),l.select(a,o.value)),l.refreshViewValue()})}}var l=a[0],s=a[1];n(r),r.on(\"click\",d),r.on(\"keypress\",c),s&&l.init(s),i()}function o(t,n,r){function o(){var e=d.ngModel.$modelValue||d.ngModel.$viewValue;if(angular.isArray(e)){var t=Object.keys(d.selected),n=e.map(d.hashGetter),r=t.filter(function(e){return-1===n.indexOf(e)});r.forEach(d.deselect),n.forEach(function(t,n){d.select(t,e[n])})}}function i(){var e=d.ngModel.$viewValue||d.ngModel.$modelValue;Object.keys(d.selected).forEach(d.deselect),d.select(d.hashGetter(e),e)}var d=this;d.isMultiple=angular.isDefined(n.multiple),d.selected={},d.options={},d.init=function(r){function a(e,t){return angular.isArray(e||t||[])}if(d.ngModel=r,r.$options&&r.$options.trackBy){var l={},s=e(r.$options.trackBy);d.hashGetter=function(e,n){return l.$value=e,s(n||t,l)}}else d.hashGetter=function(e){return angular.isObject(e)?\"$$object_\"+(e.$$mdSelectId||(e.$$mdSelectId=++c)):e};d.isMultiple?(r.$validators[\"md-multiple\"]=a,r.$render=o,t.$watchCollection(n.ngModel,function(e){a(e)&&o(e)})):r.$render=i},d.selectedLabels=function(){var e=a(r[0].querySelectorAll(\"md-option[selected]\"));return e.length?e.map(function(e){return e.textContent}).join(\", \"):\"\"},d.select=function(e,t){var n=d.options[e];n&&n.setSelected(!0),d.selected[e]=t},d.deselect=function(e){var t=d.options[e];t&&t.setSelected(!1),delete d.selected[e]},d.addOption=function(e,t){if(angular.isDefined(d.options[e]))throw new Error('Duplicate md-option values are not allowed in a select. Duplicate value \"'+t.value+'\" found.');d.options[e]=t,angular.isDefined(d.selected[e])&&(d.select(e,t.value),d.refreshViewValue())},d.removeOption=function(e){delete d.options[e]},d.refreshViewValue=function(){var e,t=[];for(var n in d.selected)(e=d.options[n])?t.push(e.value):t.push(d.selected[n]);d.ngModel.$setViewValue(d.isMultiple?t:t[0])}}return o.$inject=[\"$scope\",\"$attrs\",\"$element\"],{restrict:\"E\",require:[\"mdSelectMenu\",\"?ngModel\"],controller:o,link:{pre:r}}}function n(e,t){function n(e,t){return e.append(angular.element('<div class=\"md-text\">').append(e.contents())),void 0===t.tabindex&&e.attr(\"tabindex\",0),r}function r(n,r,o,a){function i(e,t){var r=l.hashGetter(t,n),o=l.hashGetter(e,n);d.hashKey=o,d.value=e,l.removeOption(r,d),l.addOption(o,d)}function c(){r.attr({role:\"option\",\"aria-selected\":\"false\",id:\"select_option_\"+t.nextUid()})}var d=a[0],l=a[1];if(angular.isDefined(o.ngValue))n.$watch(o.ngValue,i);else{if(!angular.isDefined(o.value))throw new Error(\"Expected either ngValue or value attr\");i(o.value)}e.attachButtonBehavior(n,r),c(),n.$on(\"$destroy\",function(){l.removeOption(d.hashKey,d)})}function o(e){this.selected=!1,this.setSelected=function(t){t&&!this.selected?e.attr({selected:\"selected\",\"aria-selected\":\"true\"}):!t&&this.selected&&(e.removeAttr(\"selected\"),e.attr(\"aria-selected\",\"false\")),this.selected=t}}return o.$inject=[\"$element\"],{restrict:\"E\",require:[\"mdOption\",\"^^mdSelectMenu\"],controller:o,compile:n}}function r(){function e(e,t){var n=e.find(\"label\");n.length||(n=angular.element(\"<label>\"),e.prepend(n)),t.label&&n.text(t.label)}return{restrict:\"E\",compile:e}}function o(e){function t(e,t,o,c,d,l){function s(n,r,i){function s(){i.selectEl.attr(\"aria-labelledby\",i.target.attr(\"id\")),i.target.attr(\"aria-owns\",i.selectEl.attr(\"id\")),i.target.attr(\"aria-expanded\",\"true\")}function m(){function o(){var e;-1==(e=f.indexOf(i.focusedNode))?e=Math.floor((f.length-1)/2):e<f.length-1&&++e,i.focusedNode=f[e],f[e].focus()}function a(){var e;-1==(e=f.indexOf(i.focusedNode))?e=Math.floor((f.length-1)/2):e>0&&--e,i.focusedNode=f[e],f[e].focus()}function c(){i.restoreFocus=!0,n.$evalAsync(function(){e.hide(d.ngModel.$viewValue)})}if(!i.isRemoved){var d=i.selectEl.controller(\"mdSelectMenu\")||{};r.addClass(\"md-clickable\"),i.backdrop&&i.backdrop.on(\"click\",function(t){t.preventDefault(),t.stopPropagation(),i.restoreFocus=!1,n.$apply(e.cancel)}),i.selectEl.on(\"keydown\",function(r){switch(r.keyCode){case t.KEY_CODE.TAB:case t.KEY_CODE.ESCAPE:r.preventDefault(),i.restoreFocus=!0,n.$apply(e.cancel)}}),i.selectEl.on(\"keydown\",function(e){switch(e.keyCode){case t.KEY_CODE.UP_ARROW:return a();case t.KEY_CODE.DOWN_ARROW:return o()}}),d.isMultiple||(i.selectEl.on(\"click\",c),i.selectEl.on(\"keydown\",function(e){(32==e.keyCode||13==e.keyCode)&&c()}))}}if(!i.target)throw new Error('$mdSelect.show() expected a target element in options.target but got \"'+i.target+'\"!');angular.extend(i,{target:angular.element(i.target),parent:angular.element(i.parent),selectEl:r.find(\"md-select-menu\"),contentEl:r.find(\"md-content\"),backdrop:i.hasBackdrop&&angular.element('<md-backdrop class=\"md-select-backdrop\">')});var f=[];return s(),i.loadingAsync&&i.loadingAsync.then&&i.loadingAsync.then(function(){n.$$loadingAsyncDone=!0,o(function(){o(function(){i.isRemoved||(u(n,r,i),f=a(i.selectEl[0].getElementsByTagName(\"md-option\")))})})}),i.disableParentScroll&&(i.disableTarget=i.parent.find(\"md-content\"),i.disableTarget.length||(i.disableTarget=i.parent),i.lastOverflow=i.disableTarget.css(\"overflow\"),i.disableTarget.css(\"overflow\",\"hidden\")),l(m,75,!1),i.backdrop&&(d.inherit(i.backdrop,i.parent),i.parent.append(i.backdrop)),i.parent.append(r),o(function(){o(function(){i.isRemoved||(u(n,r,i),f=a(r[0].querySelectorAll(\"md-option\")))})}),c.transitionEndPromise(i.selectEl)}function m(e,t,n){return n.isRemoved=!0,t.addClass(\"md-leave\").removeClass(\"md-clickable\"),n.target.attr(\"aria-expanded\",\"false\"),n.disableParentScroll&&c.floatingScrollbars()&&(n.disableTarget.css(\"overflow\",n.lastOverflow),delete n.lastOverflow,delete n.disableTarget),n.setLabelText&&n.setLabelText(n.selectEl.controller(\"mdSelectMenu\").selectedLabels()),c.transitionEndPromise(t).then(function(){t.remove(),n.backdrop&&n.backdrop.remove(),n.restoreFocus&&n.target.focus()})}function u(e,d,l){var s,m=d[0],u=l.target[0],f=l.parent[0],p=l.selectEl[0],h=l.contentEl[0],g=f.getBoundingClientRect(),b=c.clientRect(u,f),v=!1,E={left:f.scrollLeft+i,top:f.scrollTop+i,bottom:g.height+f.scrollTop-i,right:g.width-f.scrollLeft-i},$={top:b.top-E.top,left:b.left-E.left,right:E.right-(b.left+b.width),bottom:E.bottom-(b.top+b.height)},M=g.width-2*i,A=h.scrollHeight>h.offsetHeight,T=p.querySelector(\"md-option[selected]\"),w=a(p.getElementsByTagName(\"md-option\")),k=p.getElementsByTagName(\"md-optgroup\");s=T?T:k.length?w[0]:w.length?w[Math.floor(w.length/2)]:h.firstElementChild||h,h.offsetWidth>M&&(h.style[\"max-width\"]=M+\"px\"),v&&(h.style[\"min-width\"]=b.width+\"px\"),A&&p.classList.add(\"md-overflow\");var y=p.getBoundingClientRect(),x=r(s);if(s){var C=window.getComputedStyle(s);x.paddingLeft=parseInt(C[\"padding-left\"],10),x.paddingRight=parseInt(C[\"padding-right\"],10)}var N=s||w[0];if(N&&(l.focusedNode=N),A){var _=h.offsetHeight/2;h.scrollTop=x.top+x.height/2-_,$.top<_?h.scrollTop=Math.min(x.top,h.scrollTop+_-$.top):$.bottom<_&&(h.scrollTop=Math.max(x.top+x.height-y.height,h.scrollTop-_+$.bottom))}var S,H,D;v?(S=b.left,H=b.top+b.height,D=\"50% 0\",H+y.height>E.bottom&&(H=b.top-y.height,D=\"50% 100%\")):(S=b.left+x.left-x.paddingLeft,H=b.top+b.height/2-x.height/2-x.top+h.scrollTop,D=x.left+b.width/2+\"px \"+(x.top+x.height/2-h.scrollTop)+\"px 0px\",m.style[\"min-width\"]=b.width+x.paddingLeft+x.paddingRight+\"px\"),m.style.left=n(E.left,S,E.right)+\"px\",m.style.top=n(E.top,H,E.bottom)+\"px\",p.style[t.CSS.TRANSFORM_ORIGIN]=D,p.style[t.CSS.TRANSFORM]=\"scale(\"+Math.min(b.width/y.width,1)+\",\"+Math.min(b.height/y.height,1)+\")\",o(function(){d.addClass(\"md-active\"),p.style[t.CSS.TRANSFORM]=\"\"})}return{parent:\"body\",onShow:s,onRemove:m,hasBackdrop:!0,disableParentScroll:c.floatingScrollbars(),themable:!0}}function n(e,t,n){return Math.min(n,Math.max(t,e))}function r(e){return e?{left:e.offsetLeft,top:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}:{left:0,top:0,width:0,height:0}}return t.$inject=[\"$mdSelect\",\"$mdConstant\",\"$$rAF\",\"$mdUtil\",\"$mdTheming\",\"$timeout\"],e(\"$mdSelect\").setDefaults({methods:[\"target\"],options:t})}function a(e){for(var t=[],n=0;n<e.length;++n)t.push(e.item(n));return t}var i=8,c=0;angular.module(\"material.components.select\",[\"material.core\",\"material.components.backdrop\"]).directive(\"mdSelect\",e).directive(\"mdSelectMenu\",t).directive(\"mdOption\",n).directive(\"mdOptgroup\",r).provider(\"$mdSelect\",o),e.$inject=[\"$mdSelect\",\"$mdUtil\",\"$mdTheming\",\"$interpolate\",\"$compile\",\"$parse\"],t.$inject=[\"$parse\",\"$mdUtil\",\"$mdTheming\"],n.$inject=[\"$mdInkRipple\",\"$mdUtil\"],o.$inject=[\"$$interimElementProvider\"]}(),function(){\"use strict\";function e(e,t){return function(n){var r=\"SideNav '\"+n+\"' is not available!\",o=e.get(n);return o||e.notFoundError(n),{isOpen:function(){return o&&o.isOpen()},isLockedOpen:function(){return o&&o.isLockedOpen()},toggle:function(){return o?o.toggle():t.reject(r)},open:function(){return o?o.open():t.reject(r)},close:function(){return o?o.close():t.reject(r)}}}}function t(e,t,n,r,o,a,i,c,d){function l(l,s,m,u){function f(e,n){l.isLockedOpen=e,e===n?s.toggleClass(\"md-locked-open\",!!e):t[e?\"addClass\":\"removeClass\"](s,\"md-locked-open\"),A.toggleClass(\"md-locked-open\",!!e)}function p(e){var n=s.parent();return n[e?\"on\":\"off\"](\"keydown\",g),A[e?\"on\":\"off\"](\"click\",b),e&&(v=d[0].activeElement),E=c.all([t[e?\"enter\":\"leave\"](A,n),t[e?\"removeClass\":\"addClass\"](s,\"md-closed\").then(function(){l.isOpen&&s.focus()})])}function h(t){if(l.isOpen==t)return c.when(!0);var n=c.defer();return l.isOpen=t,e(function(){E.then(function(e){l.isOpen||(v&&v.focus(),v=null),n.resolve(e)})},0,!1),n.promise}function g(e){var t=e.keyCode===o.KEY_CODE.ESCAPE;return t?b(e):c.when(!0)}function b(e){return e.preventDefault(),e.stopPropagation(),u.close()}var v=null,E=c.when(!0),$=n(m.mdIsLockedOpen),M=function(){return $(l.$parent,{$media:r})},A=a('<md-backdrop class=\"md-sidenav-backdrop md-opaque ng-enter\">')(l);s.on(\"$destroy\",u.destroy),i.inherit(A,s),l.$watch(M,f),l.$watch(\"isOpen\",p),u.$toggleOpen=h}return{restrict:\"E\",scope:{isOpen:\"=?mdIsOpen\"},controller:\"$mdSidenavController\",compile:function(e){return e.addClass(\"md-closed\"),e.attr(\"tabIndex\",\"-1\"),l}}}function n(e,t,n,r,o){var a=this;a.$toggleOpen=function(){return o.when(e.isOpen)},a.isOpen=function(){return!!e.isOpen},a.isLockedOpen=function(){return!!e.isLockedOpen},a.open=function(){return a.$toggleOpen(!0)},a.close=function(){return a.$toggleOpen(!1)},a.toggle=function(){return a.$toggleOpen(!e.isOpen)},a.destroy=r.register(a,n.mdComponentId)}angular.module(\"material.components.sidenav\",[\"material.core\",\"material.components.backdrop\"]).factory(\"$mdSidenav\",e).directive(\"mdSidenav\",t).controller(\"$mdSidenavController\",n),e.$inject=[\"$mdComponentRegistry\",\"$q\"],t.$inject=[\"$timeout\",\"$animate\",\"$parse\",\"$mdMedia\",\"$mdConstant\",\"$compile\",\"$mdTheming\",\"$q\",\"$document\"],n.$inject=[\"$scope\",\"$element\",\"$attrs\",\"$mdComponentRegistry\",\"$q\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a,i,c){function d(e){return e.attr({tabIndex:0,role:\"slider\"}),n.expect(e,\"aria-label\"),l}function l(n,d,l,s){function m(){b(),M(),g()}function u(e){G=parseFloat(e),d.attr(\"aria-valuemin\",e),m()}function f(e){z=parseFloat(e),d.attr(\"aria-valuemax\",e),m()}function p(e){W=parseFloat(e),g()}function h(e){d.attr(\"aria-disabled\",!!e)}function g(){if(angular.isDefined(l.mdDiscrete)){var e=Math.floor((z-G)/W);if(!X){var n=t.getComputedStyle(V[0]);X=angular.element('<canvas style=\"position:absolute;\">'),Q=X[0].getContext(\"2d\"),Q.fillStyle=n.backgroundColor||\"black\",V.append(X)}var r=v();X[0].width=r.width,X[0].height=r.height;for(var o,a=0;e>=a;a++)o=Math.floor(r.width*(a/e)),Q.fillRect(o-1,0,2,r.height)}}function b(){Z=B[0].getBoundingClientRect()}function v(){return U(),Z}function E(e){if(!d[0].hasAttribute(\"disabled\")){var t;e.keyCode===o.KEY_CODE.LEFT_ARROW?t=-W:e.keyCode===o.KEY_CODE.RIGHT_ARROW&&(t=W),t&&((e.metaKey||e.ctrlKey||e.altKey)&&(t*=4),e.preventDefault(),e.stopPropagation(),n.$evalAsync(function(){$(s.$viewValue+t)}))}}function $(e){s.$setViewValue(A(T(e)))}function M(){isNaN(s.$viewValue)&&(s.$viewValue=s.$modelValue);var e=(s.$viewValue-G)/(z-G);n.modelValue=s.$viewValue,d.attr(\"aria-valuenow\",s.$viewValue),w(e),L.text(s.$viewValue)}function A(e){return angular.isNumber(e)?Math.max(G,Math.min(z,e)):void 0}function T(e){return angular.isNumber(e)?Math.round(e/W)*W:void 0}function w(e){q.css(\"width\",100*e+\"%\"),F.css(\"left\",100*e+\"%\"),d.toggleClass(\"md-min\",0===e)}function k(e){if(!j()){d.addClass(\"active\"),d[0].focus(),b();var t=O(D(e.pointer.x)),r=A(T(t));n.$apply(function(){$(r),w(I(r))})}}function y(e){if(!j()){d.removeClass(\"dragging active\");var t=O(D(e.pointer.x)),r=A(T(t));n.$apply(function(){$(r),M()})}}function x(e){j()||(J=!0,e.stopPropagation(),d.addClass(\"dragging\"),_(e))}function C(e){J&&(e.stopPropagation(),_(e))}function N(e){J&&(e.stopPropagation(),J=!1)}function _(e){ee?H(e.pointer.x):S(e.pointer.x)}function S(e){n.$evalAsync(function(){$(O(D(e)))})}function H(e){var t=O(D(e)),n=A(T(t));w(D(e)),L.text(n)}function D(e){return Math.max(0,Math.min(1,(e-Z.left)/Z.width))}function O(e){return G+e*(z-G)}function I(e){return(e-G)/(z-G)}a(d),s=s||{$setViewValue:function(e){this.$viewValue=e,this.$viewChangeListeners.forEach(function(e){e()})},$parsers:[],$formatters:[],$viewChangeListeners:[]};var R=l.ngDisabled&&c(l.ngDisabled),j=R?function(){return R(n.$parent)}:angular.noop,P=angular.element(d[0].querySelector(\".md-thumb\")),L=angular.element(d[0].querySelector(\".md-thumb-text\")),F=P.parent(),B=angular.element(d[0].querySelector(\".md-track-container\")),q=angular.element(d[0].querySelector(\".md-track-fill\")),V=angular.element(d[0].querySelector(\".md-track-ticks\")),U=r.throttle(b,5e3);l.min?l.$observe(\"min\",u):u(0),l.max?l.$observe(\"max\",f):f(100),l.step?l.$observe(\"step\",p):p(1);var Y=angular.noop;l.ngDisabled&&(Y=n.$parent.$watch(l.ngDisabled,h)),i.register(d,\"drag\"),d.on(\"keydown\",E).on(\"$md.pressdown\",k).on(\"$md.pressup\",y).on(\"$md.dragstart\",x).on(\"$md.drag\",C).on(\"$md.dragend\",N),setTimeout(m);var K=e.throttle(m);angular.element(t).on(\"resize\",K),n.$on(\"$destroy\",function(){angular.element(t).off(\"resize\",K),Y()}),s.$render=M,s.$viewChangeListeners.push(M),s.$formatters.push(A),s.$formatters.push(T);var G,z,W,X,Q,Z={};b();var J=!1,ee=angular.isDefined(l.mdDiscrete)}return{scope:{},require:\"?ngModel\",template:'<div class=\"md-slider-wrapper\">        <div class=\"md-track-container\">          <div class=\"md-track\"></div>          <div class=\"md-track md-track-fill\"></div>          <div class=\"md-track-ticks\"></div>        </div>        <div class=\"md-thumb-container\">          <div class=\"md-thumb\"></div>          <div class=\"md-focus-thumb\"></div>          <div class=\"md-focus-ring\"></div>          <div class=\"md-sign\">            <span class=\"md-thumb-text\"></span>          </div>          <div class=\"md-disabled-thumb\"></div>        </div>      </div>',compile:d}}angular.module(\"material.components.slider\",[\"material.core\"]).directive(\"mdSlider\",e),e.$inject=[\"$$rAF\",\"$window\",\"$mdAria\",\"$mdUtil\",\"$mdConstant\",\"$mdTheming\",\"$mdGesture\",\"$parse\"]}(),function(){\"use strict\";function e(e,t,n,r,o){function a(e){function n(e,t){t.addClass(\"md-sticky-clone\"),t.css(\"top\",p+\"px\");var n={element:e,clone:t};return f.items.push(n),m.parent().prepend(n.clone),u(),function(){f.items.forEach(function(t,n){t.element[0]===e[0]&&(f.items.splice(n,1),t.clone.remove())}),u()}}function o(){f.items.forEach(a),f.items=f.items.sort(function(e,t){return e.top<t.top?-1:1});for(var e,t=m.prop(\"scrollTop\"),n=f.items.length-1;n>=0;n--)if(t>f.items[n].top){e=f.items[n];break}d(e)}function a(e){var t=e.element[0];for(e.top=0,e.left=0;t&&t!==m[0];)e.top+=t.offsetTop,e.left+=t.offsetLeft,t=t.offsetParent;e.height=e.element.prop(\"offsetHeight\"),e.clone.css(\"margin-left\",e.left+\"px\")}function i(){var e=m.prop(\"scrollTop\"),t=e>(i.prevScrollTop||0);i.prevScrollTop=e,0===e?d(null):t&&f.next?f.next.top-e<=0?d(f.next):f.current&&(f.next.top-e<=f.next.height?s(f.current,f.next.top-f.next.height-e):s(f.current,null)):!t&&f.current&&(e<f.current.top&&d(f.prev),f.current&&f.next&&(e>=f.next.top-f.current.height?s(f.current,f.next.top-e-f.current.height):s(f.current,null)))}function d(e){if(f.current!==e){f.current&&(s(f.current,null),l(f.current,null)),e&&l(e,\"active\"),f.current=e;var t=f.items.indexOf(e);f.next=f.items[t+1],f.prev=f.items[t-1],l(f.next,\"next\"),l(f.prev,\"prev\")}}function l(e,t){e&&e.state!==t&&(e.state&&(e.clone.attr(\"sticky-prev-state\",e.state),e.element.attr(\"sticky-prev-state\",e.state)),e.clone.attr(\"sticky-state\",t),e.element.attr(\"sticky-state\",t),e.state=t)}function s(e,n){e&&(null===n||void 0===n?e.translateY&&(e.translateY=null,e.clone.css(t.CSS.TRANSFORM,\"\")):(e.translateY=n,e.clone.css(t.CSS.TRANSFORM,\"translate3d(\"+e.left+\"px,\"+n+\"px,0)\")))}var m=e.$element,u=r.throttle(o);c(m),m.on(\"$scrollstart\",u),m.on(\"$scroll\",i);var f,p=m.prop(\"offsetTop\");return f={prev:null,current:null,next:null,items:[],add:n,refreshElements:o}}function i(){var t,n=angular.element(\"<div>\");e[0].body.appendChild(n[0]);for(var r=[\"sticky\",\"-webkit-sticky\"],o=0;o<r.length;++o)if(n.css({position:r[o],top:0,\"z-index\":2}),n.css(\"position\")==r[o]){t=r[o];break}return n.remove(),t}function c(e){function t(){+o.now()-a>i?(n=!1,e.triggerHandler(\"$scrollend\")):(e.triggerHandler(\"$scroll\"),r(t))}var n,a,i=200;e.on(\"scroll touchmove\",function(){n||(n=!0,r(t),e.triggerHandler(\"$scrollstart\")),e.triggerHandler(\"$scroll\"),a=+o.now()})}var d=i();return function(e,t,n){var r=t.controller(\"mdContent\");if(r)if(d)t.css({position:d,top:0,\"z-index\":2});else{var o=r.$element.data(\"$$sticky\");o||(o=a(r),r.$element.data(\"$$sticky\",o));var i=o.add(t,n||t.clone());e.$on(\"$destroy\",i)}}}angular.module(\"material.components.sticky\",[\"material.core\",\"material.components.content\"]).factory(\"$mdSticky\",e),e.$inject=[\"$document\",\"$mdConstant\",\"$compile\",\"$$rAF\",\"$mdUtil\"]}(),function(){\"use strict\";function e(e,t,n){return{restrict:\"E\",replace:!0,transclude:!0,template:'<h2 class=\"md-subheader\"><span class=\"md-subheader-content\"></span></h2>',compile:function(r,o,a){var i=r[0].outerHTML;return function(r,o){function c(e){return angular.element(e[0].querySelector(\".md-subheader-content\"))}n(o),a(r,function(e){c(o).append(e)}),a(r,function(a){var d=t(angular.element(i))(r);n(d),c(d).append(a),e(r,o,d)})}}}}angular.module(\"material.components.subheader\",[\"material.core\",\"material.components.sticky\"]).directive(\"mdSubheader\",e),e.$inject=[\"$mdSticky\",\"$compile\",\"$mdTheming\"]}(),function(){\"use strict\";var e=angular.module(\"material.components.swipe\",[]);[\"SwipeLeft\",\"SwipeRight\"].forEach(function(t){var n=\"md\"+t,r=\"$md.\"+t.toLowerCase();e.directive(n,[\"$parse\",function(e){function t(t,o,a){var i=e(a[n]);o.on(r,function(e){t.$apply(function(){i(t,{$event:e})})})}return{restrict:\"A\",link:t}}])})}(),function(){\"use strict\";function e(e,t,n,r,o,a,i,c){function d(e,t){var r=l.compile(e,t);return e.addClass(\"md-dragging\"),function(e,t,d,l){function s(n){p(e)||(n.stopPropagation(),t.addClass(\"md-dragging\"),b={width:h.prop(\"offsetWidth\")},t.removeClass(\"transition\"))}function m(e){if(b){e.stopPropagation(),e.srcEvent&&e.srcEvent.preventDefault();var t=e.pointer.distanceX/b.width,n=l.$viewValue?1+t:t;n=Math.max(0,Math.min(1,n)),h.css(o.CSS.TRANSFORM,\"translate3d(\"+100*n+\"%,0,0)\"),b.translate=n}}function u(e){if(b){e.stopPropagation(),t.removeClass(\"md-dragging\"),h.css(o.CSS.TRANSFORM,\"\");var n=l.$viewValue?b.translate<.5:b.translate>.5;n&&f(!l.$viewValue),b=null}}function f(t){e.$apply(function(){l.$setViewValue(t),l.$render()})}l=l||n.fakeNgModel();var p=a(d.ngDisabled),h=angular.element(t[0].querySelector(\".md-thumb-container\")),g=angular.element(t[0].querySelector(\".md-container\"));i(function(){t.removeClass(\"md-dragging\")}),r(e,t,d,l),angular.isDefined(d.ngDisabled)&&e.$watch(p,function(e){t.attr(\"tabindex\",e?-1:0)}),c.register(g,\"drag\"),g.on(\"$md.dragstart\",s).on(\"$md.drag\",m).on(\"$md.dragend\",u);var b}}var l=e[0];return{restrict:\"E\",transclude:!0,template:'<div class=\"md-container\"><div class=\"md-bar\"></div><div class=\"md-thumb-container\"><div class=\"md-thumb\" md-ink-ripple md-ink-ripple-checkbox></div></div></div><div ng-transclude class=\"md-label\"></div>',require:\"?ngModel\",compile:d}}angular.module(\"material.components.switch\",[\"material.core\",\"material.components.checkbox\"]).directive(\"mdSwitch\",e),e.$inject=[\"mdCheckboxDirective\",\"$mdTheming\",\"$mdUtil\",\"$document\",\"$mdConstant\",\"$parse\",\"$$rAF\",\"$mdGesture\"]}(),function(){\"use strict\";angular.module(\"material.components.tabs\",[\"material.core\",\"material.components.icon\"])}(),function(){\"use strict\";function e(e,t,n,r){return{restrict:\"E\",replace:!0,scope:{fid:\"@?mdFid\",label:\"@?\",value:\"=ngModel\"},compile:function(o,a){return r.warn(\"<md-text-float> is deprecated. Please use ` + \"`\" + `<md-input-container>` + \"`\" + ` and ` + \"`\" + `<input>` + \"`\" + `.More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer\"),angular.isUndefined(a.mdFid)&&(a.mdFid=t.nextUid()),{pre:function(e,t,r){var o=n(r.ngDisabled);e.isDisabled=function(){return o(e.$parent)},e.inputType=r.type||\"text\"},post:e}},template:'<md-input-group tabindex=\"-1\"> <label for=\"{{fid}}\" >{{label}}</label> <md-input id=\"{{fid}}\" ng-disabled=\"isDisabled()\" ng-model=\"value\" type=\"{{inputType}}\"></md-input></md-input-group>'}}function t(e){return{restrict:\"CE\",controller:[\"$element\",function(t){e.warn(\"<md-input-group> is deprecated. Please use ` + \"`\" + `<md-input-container>` + \"`\" + ` and ` + \"`\" + `<input>` + \"`\" + `.More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer\"),this.setFocused=function(e){t.toggleClass(\"md-input-focused\",!!e)},this.setHasValue=function(e){t.toggleClass(\"md-input-has-value\",e)}}]}}function n(e,t){return{restrict:\"E\",replace:!0,template:\"<input >\",require:[\"^?mdInputGroup\",\"?ngModel\"],link:function(e,n,r,o){function a(e){return e=angular.isUndefined(e)?n.val():e,angular.isDefined(e)&&null!==e&&\"\"!==e.toString().trim()}if(o[0]){t.warn(\"<md-input> is deprecated. Please use ` + \"`\" + `<md-input-container>` + \"`\" + ` and ` + \"`\" + `<input>` + \"`\" + `.More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer\");var i=o[0],c=o[1];e.$watch(e.isDisabled,function(e){n.attr(\"aria-disabled\",!!e),n.attr(\"tabindex\",!!e)}),n.attr(\"type\",r.type||n.parent().attr(\"type\")||\"text\"),c&&c.$formatters.push(function(e){return i.setHasValue(a(e)),e}),n.on(\"input\",function(){i.setHasValue(a())}).on(\"focus\",function(){i.setFocused(!0)}).on(\"blur\",function(){i.setFocused(!1),i.setHasValue(a())}),e.$on(\"$destroy\",function(){i.setFocused(!1),i.setHasValue(!1)})}}}}angular.module(\"material.components.textField\",[\"material.core\"]).directive(\"mdInputGroup\",t).directive(\"mdInput\",n).directive(\"mdTextFloat\",e),e.$inject=[\"$mdTheming\",\"$mdUtil\",\"$parse\",\"$log\"],t.$inject=[\"$log\"],n.$inject=[\"$mdUtil\",\"$log\"]}(),function(){\"use strict\";function e(){return{restrict:\"E\"}}function t(e){function t(e,t,r){function o(o,a,c){return n=c.content,a.addClass(c.position.split(\" \").map(function(e){return\"md-\"+e}).join(\" \")),c.parent.addClass(i(c.position)),c.onSwipe=function(t){a.addClass(\"md-\"+t.type.replace(\"$md.\",\"\")),e(r.cancel)},a.on(\"$md.swipeleft $md.swiperight\",c.onSwipe),t.enter(a,c.parent)}function a(e,n,r){return n.off(\"$md.swipeleft $md.swiperight\",r.onSwipe),r.parent.removeClass(i(r.position)),t.leave(n)}function i(e){return\"md-toast-open-\"+(e.indexOf(\"top\")>-1?\"top\":\"bottom\")}return{onShow:o,onRemove:a,position:\"bottom left\",themable:!0,hideDelay:3e3}}var n,r=e(\"$mdToast\").setDefaults({methods:[\"position\",\"hideDelay\",\"capsule\"],options:t}).addPreset(\"simple\",{argOption:\"content\",methods:[\"content\",\"action\",\"highlightAction\",\"theme\"],options:[\"$mdToast\",\"$mdTheming\",function(e,t){var r={template:['<md-toast md-theme=\"{{ toast.theme }}\" ng-class=\"{\\'md-capsule\\': toast.capsule}\">',\"<span flex>{{ toast.content }}</span>\",'<md-button class=\"md-action\" ng-if=\"toast.action\" ng-click=\"toast.resolve()\" ng-class=\"{\\'md-highlight\\': toast.highlightAction}\">',\"{{ toast.action }}\",\"</md-button>\",\"</md-toast>\"].join(\"\"),controller:[\"$scope\",function(t){var r=this;t.$watch(function(){return n},function(){r.content=n}),this.resolve=function(){e.hide()}}],theme:t.defaultTheme(),controllerAs:\"toast\",bindToController:!0};return r}]}).addMethod(\"updateContent\",function(e){n=e});return t.$inject=[\"$timeout\",\"$animate\",\"$mdToast\"],r}angular.module(\"material.components.toast\",[\"material.core\",\"material.components.button\"]).directive(\"mdToast\",e).provider(\"$mdToast\",t),t.$inject=[\"$$interimElementProvider\"]}(),function(){\"use strict\";function e(e,t,n,r){return{restrict:\"E\",controller:angular.noop,link:function(o,a,i){function c(){function r(t,n){a.parent()[0]===n.parent()[0]&&(s&&s.off(\"scroll\",p),n.on(\"scroll\",p),n.attr(\"scroll-shrink\",\"true\"),s=n,e(c))}function c(){l=a.prop(\"offsetHeight\"),s.css(\"margin-top\",-l*f+\"px\"),d()}function d(e){var n=e?e.target.scrollTop:u;h(),m=Math.min(l/f,Math.max(0,m+n-u)),a.css(t.CSS.TRANSFORM,\"translate3d(0,\"+-m*f+\"px,0)\"),s.css(t.CSS.TRANSFORM,\"translate3d(0,\"+(l-m)*f+\"px,0)\"),u=n}var l,s,m=0,u=0,f=i.mdShrinkSpeedFactor||.5,p=e.throttle(d),h=n.debounce(c,5e3);o.$on(\"$mdContentLoaded\",r)}r(a),angular.isDefined(i.mdScrollShrink)&&c()}}}angular.module(\"material.components.toolbar\",[\"material.core\",\"material.components.content\"]).directive(\"mdToolbar\",e),e.$inject=[\"$$rAF\",\"$mdConstant\",\"$mdUtil\",\"$mdTheming\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a,i,c,d){function l(l,u,f){function p(t){p.value=!!t,p.queued||(t?(p.queued=!0,e(function(){l.visible=p.value,p.queued=!1},l.delay)):e(function(){l.visible=!1}))}function h(){v.attr(\"aria-describedby\",u.attr(\"id\")),T.append(u),b(),c.addClass(u,\"md-show\"),c.addClass(E,\"md-show\"),c.addClass($,\"md-show\")}function g(){v.removeAttr(\"aria-describedby\"),d.all([c.removeClass($,\"md-show\"),c.removeClass(E,\"md-show\"),c.removeClass(u,\"md-show\")]).then(function(){l.visible||u.detach()})}function b(){function e(){var e=\"left\"===M||\"right\"===M?2*Math.sqrt(Math.pow(t.width,2)+Math.pow(t.height/2,2)):2*Math.sqrt(Math.pow(t.width/2,2)+Math.pow(t.height,2)),n=\"left\"===M?{left:100,top:50}:\"right\"===M?{left:0,top:50}:\"top\"===M?{left:50,top:100}:{left:50,top:0};E.css({width:e+\"px\",height:e+\"px\",left:n.left+\"%\",top:n.top+\"%\"})}var t=o.offsetRect(u,T),n=o.offsetRect(v,T),r=\"bottom\",a={left:n.left+n.width/2-t.width/2,top:n.top+n.height};a.left=Math.min(a.left,T.prop(\"scrollWidth\")-t.width-m),a.left=Math.max(a.left,m),a.top+t.height>T.prop(\"scrollHeight\")&&(a.top=n.top-t.height,r=\"top\"),u.css({top:a.top+\"px\",left:a.left+\"px\"}),e()}a(u);for(var v=u.parent(),E=angular.element(u[0].getElementsByClassName(\"md-background\")[0]),$=angular.element(u[0].getElementsByClassName(\"md-content\")[0]),M=f.mdDirection;\"none\"==t.getComputedStyle(v[0])[\"pointer-events\"];)v=v.parent();for(var A=u.parent()[0];A&&A!==i[0]&&A!==document.body&&(!A.tagName||\"md-content\"!=A.tagName.toLowerCase());)A=A.parentNode;var T=angular.element(A||document.body);angular.isDefined(f.mdDelay)||(l.delay=s),u.detach(),u.attr(\"role\",\"tooltip\"),u.attr(\"id\",f.id||\"tooltip_\"+o.nextUid()),v.on(\"focus mouseenter touchstart\",function(){p(!0)}),v.on(\"blur mouseleave touchend touchcancel\",function(){r[0].activeElement!==v[0]&&p(!1)}),l.$watch(\"visible\",function(e){e?h():g()});var w=n.throttle(function(){l.visible&&b()});angular.element(t).on(\"resize\",w),l.$on(\"$destroy\",function(){l.visible=!1,u.remove(),angular.element(t).off(\"resize\",w)})}var s=0,m=8;return{restrict:\"E\",transclude:!0,template:'<div class=\"md-background\"></div><div class=\"md-content\" ng-transclude></div>',scope:{visible:\"=?mdVisible\",delay:\"=?mdDelay\"},link:l}}angular.module(\"material.components.tooltip\",[\"material.core\"]).directive(\"mdTooltip\",e),e.$inject=[\"$timeout\",\"$window\",\"$$rAF\",\"$document\",\"$mdUtil\",\"$mdTheming\",\"$rootElement\",\"$animate\",\"$q\"]}(),function(){\"use strict\";angular.module(\"material.components.whiteframe\",[])}(),function(){\"use strict\";function e(e,t,n,r,o,a){function i(){l(),c()}function c(){var e=angular.element(A.ul),t=angular.element(A.input),n=e.attr(\"id\")||\"ul_\"+o.nextUid();e.attr(\"id\",n),t.attr(\"aria-owns\",n)}function d(t){if(t){var n={};return E.itemName&&(n[E.itemName]=e.selectedItem),n}}function l(){e.$watch(\"searchText\",function(t){if(E.index=-1,!t||t.length<Math.max(parseInt(e.minLength,10),1))return E.loading=!1,E.matches=[],void(E.hidden=p());var n=t.toLowerCase();\nT&&T.cancel&&(T.cancel(),T=null),!e.noCache&&w[n]?E.matches=w[n]:E.fetch(t),E.hidden=p(),e.textChange&&e.textChange(d(e.selectedItem))}),e.$watch(\"selectedItem\",function(t){e.itemChange&&e.itemChange(d(t))})}function s(t){function n(n){w[a]=n,t===e.searchText&&(T=null,E.loading=!1,E.matches=n,E.hidden=p())}var o=e.$parent.$eval(M),a=t.toLowerCase();angular.isArray(o)?n(o):(E.loading=!0,T=r.when(o).then(n))}function m(){E.hidden=!0}function u(e){switch(e.keyCode){case a.KEY_CODE.DOWN_ARROW:if(E.loading)return;e.preventDefault(),E.index=Math.min(E.index+1,E.matches.length-1),v();break;case a.KEY_CODE.UP_ARROW:if(E.loading)return;e.preventDefault(),E.index=Math.max(0,E.index-1),v();break;case a.KEY_CODE.ENTER:if(E.loading||E.index<0)return;e.preventDefault(),b(E.index);break;case a.KEY_CODE.ESCAPE:E.matches=[],E.hidden=!0,E.index=-1;break;case a.KEY_CODE.TAB:}}function f(){e.searchText=\"\",b(-1),A.input.focus()}function p(){return 1===E.matches.length&&e.searchText===g(E.matches[0])}function h(){return g(E.matches[E.index])}function g(t){return t&&e.itemText?e.itemText(d(t)):t}function b(t){e.selectedItem=E.matches[t],e.searchText=g(e.selectedItem)||e.searchText,E.hidden=!0,E.index=-1,E.matches=[]}function v(){var e=41*E.index,t=e+41,n=225.5;e<A.ul.scrollTop?A.ul.scrollTop=e:t>A.ul.scrollTop+n&&(A.ul.scrollTop=t-n)}var E=this,$=e.itemsExpr.split(/ in /i),M=$[1],A={main:t[0],ul:t[0].getElementsByTagName(\"ul\")[0],input:t[0].getElementsByTagName(\"input\")[0]},T=null,w={};return E.scope=e,E.parent=e.$parent,E.itemName=$[0],E.matches=[],E.loading=!1,E.hidden=!0,E.index=0,E.keydown=u,E.blur=m,E.clear=f,E.select=b,E.getCurrentDisplayValue=h,E.fetch=o.debounce(s),i()}angular.module(\"material.components.autocomplete\").controller(\"MdAutocompleteCtrl\",e),e.$inject=[\"$scope\",\"$element\",\"$timeout\",\"$q\",\"$mdUtil\",\"$mdConstant\"]}(),function(){\"use strict\";function e(){return{template:'        <md-autocomplete-wrap role=\"listbox\">          <input type=\"text\"              ng-disabled=\"isDisabled\"              ng-model=\"searchText\"              ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"              ng-blur=\"$mdAutocompleteCtrl.blur()\"              placeholder=\"{{placeholder}}\"              aria-label=\"{{placeholder}}\"              aria-autocomplete=\"list\"              aria-haspopup=\"true\"              aria-activedescendant=\"\"              aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>          <button              type=\"button\"              ng-if=\"searchText\"              ng-click=\"$mdAutocompleteCtrl.clear()\">              <md-icon md-svg-icon=\"cancel\"></md-icon>              <span class=\"visually-hidden\">Clear</span>              </button>          <md-progress-linear ng-if=\"$mdAutocompleteCtrl.loading\" md-mode=\"indeterminate\"></md-progress-linear>        </md-autocomplete-wrap>        <ul role=\"presentation\">          <li ng-repeat=\"(index, item) in $mdAutocompleteCtrl.matches\"              ng-class=\"{ selected: index === $mdAutocompleteCtrl.index }\"              ng-show=\"searchText && !$mdAutocompleteCtrl.hidden\"              ng-click=\"$mdAutocompleteCtrl.select(index)\"              ng-transclude              md-autocomplete-list-item=\"$mdAutocompleteCtrl.itemName\">          </li>        </ul>        <aria-status            class=\"visually-hidden\"            role=\"status\"            aria-live=\"assertive\">          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length === 1\">There is 1 match available.</p>          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length > 1\">There are {{$mdAutocompleteCtrl.matches.length}} matches available.</p>          <p ng-if=\"$mdAutocompleteCtrl.index >= 0\">{{ $mdAutocompleteCtrl.getCurrentDisplayValue() }}</p>        </aria-status>',transclude:!0,controller:\"MdAutocompleteCtrl\",controllerAs:\"$mdAutocompleteCtrl\",scope:{searchText:\"=mdSearchText\",selectedItem:\"=mdSelectedItem\",itemsExpr:\"@mdItems\",itemText:\"&mdItemText\",placeholder:\"@placeholder\",noCache:\"=mdNoCache\",itemChange:\"&mdSelectedItemChange\",textChange:\"&mdSearchTextChange\",isDisabled:\"=ngDisabled\",minLength:\"=mdMinLength\"}}}angular.module(\"material.components.autocomplete\").directive(\"mdAutocomplete\",e)}(),function(){\"use strict\";function e(e,t,n){function r(e){return e?e.replace(/[\\*\\[\\]\\(\\)\\{\\}\\\\\\^\\$]/g,\"\\\\$&\"):e}var o=t.attr(\"md-highlight-text\"),a=n(t.text())(e);e.$watch(o,function(e){var n=new RegExp(\"^\"+r(e),\"i\"),o=a.replace(n,'<span class=\"highlight\">$&</span>');t.html(o)})}angular.module(\"material.components.autocomplete\").controller(\"MdHighlightCtrl\",e),e.$inject=[\"$scope\",\"$element\",\"$interpolate\"]}(),function(){\"use strict\";function e(){return{terminal:!0,scope:!1,controller:\"MdHighlightCtrl\"}}angular.module(\"material.components.autocomplete\").directive(\"mdHighlightText\",e)}(),function(){\"use strict\";function e(e,t){function n(n,r,o,a){var i=a.parent.$new(!1,a.parent),c=a.scope.$eval(o.mdAutocompleteListItem);i[c]=n.item,e(r.contents())(i),r.attr({role:\"option\",id:\"item_\"+t.nextUid()})}return{require:\"^?mdAutocomplete\",terminal:!0,link:n,scope:!1}}angular.module(\"material.components.autocomplete\").directive(\"mdAutocompleteListItem\",e),e.$inject=[\"$compile\",\"$mdUtil\"]}(),function(){\"use strict\";function e(e){function t(t,r,o,a){function i(){var e=d.getSelectedItem(),o=!e||d.count()<2||c;if(r.css(\"display\",o?\"none\":\"block\"),!o&&t.pagination&&t.pagination.tabData){var a=d.getSelectedIndex(),i=t.pagination.tabData.tabs[a]||{left:0,right:0,width:0},l=r.parent().prop(\"offsetWidth\")-i.right,s=[\"md-transition-left\",\"md-transition-right\",\"md-no-transition\"],m=n>a?0:a>n?1:2;r.removeClass(s.join(\" \")).addClass(s[m]).css({left:i.left+\"px\",right:l+\"px\"}),n=a}}var c=!!a[0],d=a[1],l=e.throttle(i);d.inkBarElement=r,t.$on(\"$mdTabsPaginationChanged\",l)}var n=0;return{restrict:\"E\",require:[\"^?mdNoBar\",\"^mdTabs\"],link:t}}angular.module(\"material.components.tabs\").directive(\"mdTabsInkBar\",e),e.$inject=[\"$$rAF\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a){function i(i,d,l,s){function m(e,t){if(e){var n=b(e);T.active&&n!==T.page?(t&&t.element.blur(),v(n).then(function(){A=!1,e.element.focus()})):e.element.focus()}}function u(e){var t=T.tabData,n=Math.max(0,Math.min(t.pages.length-1,T.page+e)),r=t.pages[n][e>0?\"firstTabIndex\":\"lastTabIndex\"],o=s.itemAt(r);A=!0,m(o)}function f(){function e(){M.css(\"width\",\"9999px\"),angular.forEach(a.tabs,function(e){angular.element(e.element).css(\"margin-left\",e.filler+\"px\")}),v(b(s.getSelectedItem()))}function t(){p(0),M.css(\"width\",\"\"),r.css(\"width\",\"\"),r.css(\"margin-left\",\"\"),T.page=null,T.active=!1}function n(){return l||i.$watch(function(){o(function(){d[0].offsetParent&&(angular.isFunction(l)&&l(),$(),l=null)},0,!1)})}if(d.prop(\"offsetParent\")){var r=d.find(\"md-tab\");t();var a=T.tabData=g(),c=T.active=a.pages.length>1;c&&e(),i.$evalAsync(function(){i.$broadcast(\"$mdTabsPaginationChanged\")})}else var l=n()}function p(t){function n(t){t.target===M[0]&&(M.off(e.CSS.TRANSITIONEND,n),o.resolve())}if(s.pagingOffset===t)return r.when();var o=r.defer();return s.$$pagingOffset=t,M.css(e.CSS.TRANSFORM,\"translate3d(\"+t+\"px,0,0)\"),M.on(e.CSS.TRANSITIONEND,n),o.promise}function h(){switch(i.stretchTabs){case\"never\":return!1;case\"always\":return!0;default:return a(\"sm\")}}function g(e){function t(){var e=1===m.length?r:o,t=Math.min(Math.floor(e/l),E.length),n=Math.floor(e/t);return a.css(\"width\",n+\"px\"),g(!0)}var n,r=d.parent().prop(\"offsetWidth\"),o=r-c-1,a=angular.element(E),i=0,l=0,s=[],m=[];return a.css(\"max-width\",\"\"),angular.forEach(E,function(e,t){var a=Math.min(o,e.offsetWidth),c={element:e,left:i,width:a,right:i+a,filler:0};c.page=Math.ceil(c.right/(1===m.length&&t===E.length-1?r:o))-1,c.page>=m.length?(c.filler=o*c.page-c.left,c.right+=c.filler,c.left+=c.filler,n={left:c.left,firstTabIndex:t,lastTabIndex:t,tabs:[c]},m.push(n)):(n.lastTabIndex=t,n.tabs.push(c)),i=c.right,l=Math.max(l,a),s.push(c)}),a.css(\"max-width\",o+\"px\"),!e&&h()?t():{width:i,max:l,tabs:s,pages:m,tabElements:E}}function b(e){var t=s.indexOf(e);if(-1===t)return 0;var n=T.tabData;return n?n.tabs[t].page:0}function v(e){if(e!==T.page){var t=T.tabData.pages.length-1;return 0>e&&(e=0),e>t&&(e=t),T.hasPrev=e>0,T.hasNext=t>e,T.page=e,i.$broadcast(\"$mdTabsPaginationChanged\"),p(-T.tabData.pages[e].left)}}var E=d[0].getElementsByTagName(\"md-tab\"),$=n.throttle(f),M=d.children(),A=!1,T=i.pagination={page:-1,active:!1,clickNext:function(){A||u(1)},clickPrevious:function(){A||u(-1)}};i.$on(\"$mdTabsChanged\",$),angular.element(t).on(\"resize\",$),i.$on(\"$destroy\",function(){angular.element(t).off(\"resize\",$)}),i.$watch(function(){return s.tabToFocus},m)}var c=64;return{restrict:\"A\",require:\"^mdTabs\",link:i}}angular.module(\"material.components.tabs\").directive(\"mdTabsPagination\",e),e.$inject=[\"$mdConstant\",\"$window\",\"$$rAF\",\"$$q\",\"$timeout\",\"$mdMedia\"]}(),function(){\"use strict\";function e(e,t,n,r,o,a,i,c){function d(){return b(e.$parent)}function l(t,n){h.content.length&&(h.contentContainer.append(h.content),h.contentScope=e.$parent.$new(),t.append(h.contentContainer),r(h.contentContainer)(h.contentScope),n===!0&&c(function(){a.disconnectScope(h.contentScope)},0,!1))}function s(){o.leave(h.contentContainer).then(function(){h.contentScope&&h.contentScope.$destroy(),h.contentScope=null})}function m(e){h.contentContainer[e?\"addClass\":\"removeClass\"](\"md-transition-rtl\")}function u(n){a.reconnectScope(h.contentScope),t.addClass(\"active\").attr({\"aria-selected\":!0,tabIndex:0}).on(\"$md.swipeleft $md.swiperight\",p),m(n),o.removeClass(h.contentContainer,\"ng-hide\"),e.onSelect()}function f(n){a.disconnectScope(h.contentScope),t.removeClass(\"active\").attr({\"aria-selected\":!1,tabIndex:-1}).off(\"$md.swipeleft $md.swiperight\",p),m(n),o.addClass(h.contentContainer,\"ng-hide\"),e.onDeselect()}function p(t){e.$apply(function(){/left/.test(t.type)?g.select(g.next()):g.select(g.previous())})}var h=this,g=t.controller(\"mdTabs\");h.contentContainer=angular.element('<div class=\"md-tab-content ng-hide\">'),h.element=t,h.isDisabled=d,h.onAdd=l,h.onRemove=s,h.onSelect=u,h.onDeselect=f;var b=i(n.ngDisabled)}angular.module(\"material.components.tabs\").controller(\"$mdTab\",e),e.$inject=[\"$scope\",\"$element\",\"$attrs\",\"$compile\",\"$animate\",\"$mdUtil\",\"$parse\",\"$timeout\"]}(),function(){\"use strict\";function e(e,t,n,r,o){function a(a,i){var c=a.find(\"md-tab-label\");c.length?c.remove():c=angular.isDefined(i.label)?angular.element(\"<md-tab-label>\").html(i.label):angular.element(\"<md-tab-label>\").append(a.contents().remove());var d=a.contents().remove();return function(a,i,l,s){function m(){var e=c.clone();i.append(e),t(e)(a.$parent),v.content=d.clone()}function u(){a.$apply(function(){E.select(v),E.focus(v)})}function f(e){e.keyCode==r.KEY_CODE.SPACE||e.keyCode==r.KEY_CODE.ENTER?(i.triggerHandler(\"click\"),e.preventDefault()):e.keyCode===r.KEY_CODE.LEFT_ARROW?a.$evalAsync(function(){E.focus(E.previous(v))}):e.keyCode===r.KEY_CODE.RIGHT_ARROW&&a.$evalAsync(function(){E.focus(E.next(v))})}function p(){a.$watch(\"$parent.$index\",function(e){E.move(v,e)})}function h(){function e(e){var t=E.getSelectedItem()===v;e&&!t?E.select(v):!e&&t&&E.deselect(v)}var t=a.$parent.$watch(\"!!(\"+l.mdActive+\")\",e);a.$on(\"$destroy\",t)}function g(){function e(e){i.attr(\"aria-disabled\",e);var t=E.getSelectedItem()===v;t&&e&&E.select(E.next()||E.previous())}a.$watch(v.isDisabled,e)}function b(){var e=l.id||\"tab_\"+n.nextUid();if(i.attr({id:e,role:\"tab\",tabIndex:-1}),d.length){var t=\"content_\"+e;i.attr(\"aria-controls\")||i.attr(\"aria-controls\",t),v.contentContainer.attr({id:t,role:\"tabpanel\",\"aria-labelledby\":e})}}var v=s[0],E=s[1];o(i.addClass.bind(i,\"md-tab-themed\"),0,!1),a.$watch(function(){return l.label},function(){o(function(){E.scope.$broadcast(\"$mdTabsChanged\")},0,!1)}),m(),b(),e.attachTabBehavior(a,i,{colorElement:E.inkBarElement}),E.add(v),a.$on(\"$destroy\",function(){E.remove(v)}),i.on(\"$destroy\",function(){o(function(){E.scope.$broadcast(\"$mdTabsChanged\")},0,!1)}),angular.isDefined(l.ngClick)||i.on(\"click\",u),i.on(\"keydown\",f),angular.isNumber(a.$parent.$index)&&p(),angular.isDefined(l.mdActive)&&h(),g()}}return{restrict:\"E\",require:[\"mdTab\",\"^mdTabs\"],controller:\"$mdTab\",scope:{onSelect:\"&mdOnSelect\",onDeselect:\"&mdOnDeselect\",label:\"@\"},compile:a}}angular.module(\"material.components.tabs\").directive(\"mdTab\",e),e.$inject=[\"$mdInkRipple\",\"$compile\",\"$mdUtil\",\"$mdConstant\",\"$timeout\"]}(),function(){\"use strict\";function e(e,t,n){function r(){return b(e.selectedIndex)}function o(){return e.selectedIndex}function a(t,n){p.add(t,n),angular.isDefined(t.element.attr(\"md-active\"))||-1!==e.selectedIndex&&angular.isNumber(e.selectedIndex)&&e.selectedIndex!==h.indexOf(t)?t.onAdd(h.contentArea,!0):(t.onAdd(h.contentArea,!1),h.select(t)),e.$broadcast(\"$mdTabsChanged\")}function i(t,n){if(p.contains(t)&&!n){var o=r()===t,a=u()||m();s(t),p.remove(t),t.onRemove(),e.$broadcast(\"$mdTabsChanged\"),o&&d(a)}}function c(t,n){var o=r()===t;p.remove(t),p.add(t,n),o&&d(t),e.$broadcast(\"$mdTabsChanged\")}function d(t,n){!t||t.isSelected||t.isDisabled()||p.contains(t)&&(angular.isDefined(n)||(n=g(t)<e.selectedIndex),s(r(),n),e.selectedIndex=g(t),t.isSelected=!0,t.onSelect(n),e.$broadcast(\"$mdTabsChanged\"))}function l(e){h.tabToFocus=e}function s(t,n){t&&t.isSelected&&p.contains(t)&&(e.selectedIndex=-1,t.isSelected=!1,t.onDeselect(n))}function m(e,t){return p.next(e||r(),t||f)}function u(e,t){return p.previous(e||r(),t||f)}function f(e){return e&&!e.isDisabled()}var p=n.iterator([],!1),h=this;h.$element=t,h.scope=e;var g=(h.contentArea=angular.element(t[0].querySelector(\".md-tabs-content\")),h.inRange=p.inRange,h.indexOf=p.indexOf),b=h.itemAt=p.itemAt;h.count=p.count,h.getSelectedItem=r,h.getSelectedIndex=o,h.add=a,h.remove=i,h.move=c,h.select=d,h.focus=l,h.deselect=s,h.next=m,h.previous=u,e.$on(\"$destroy\",function(){s(r());for(var e=p.count()-1;e>=0;e--)i(p[e],!0)})}angular.module(\"material.components.tabs\").controller(\"$mdTabs\",e),e.$inject=[\"$scope\",\"$element\",\"$mdUtil\",\"$timeout\"]}(),function(){\"use strict\";function e(e){function t(t,n,r,o,a){function i(){n.attr(\"role\",\"tablist\")}function c(){t.$watch(\"selectedIndex\",function(e,t){if(t!=e){var n=t>e;if(o.deselect(o.itemAt(t),n),o.inRange(e)){for(var r=o.itemAt(e);r&&r.isDisabled();)r=e>t?o.next(r):o.previous(r);o.select(r,n)}}})}t.stretchTabs=r.hasOwnProperty(\"mdStretchTabs\")?r.mdStretchTabs||\"always\":\"auto\",e(n),i(),c(),a(t.$parent,function(e){angular.element(n[0].querySelector(\".md-header-items\")).append(e)})}return{restrict:\"E\",controller:\"$mdTabs\",require:\"mdTabs\",transclude:!0,scope:{selectedIndex:\"=?mdSelected\"},template:'<section class=\"md-header\" ng-class=\"{\\'md-paginating\\': pagination.active}\"><button class=\"md-paginator md-prev\" ng-if=\"pagination.active && pagination.hasPrev\" ng-click=\"pagination.clickPrevious()\" aria-hidden=\"true\"><md-icon md-svg-icon=\"tabs-arrow\"></md-icon></button><div class=\"md-header-items-container\" md-tabs-pagination><div class=\"md-header-items\"><md-tabs-ink-bar></md-tabs-ink-bar></div></div><button class=\"md-paginator md-next\" ng-if=\"pagination.active && pagination.hasNext\" ng-click=\"pagination.clickNext()\" aria-hidden=\"true\"><md-icon md-svg-icon=\"tabs-arrow\"></md-icon></button></section><section class=\"md-tabs-content\"></section>',link:t}}angular.module(\"material.components.tabs\").directive(\"mdTabs\",e),e.$inject=[\"$mdTheming\"]}(),angular.module(\"material.core\").constant(\"$MD_THEME_CSS\",\"md-autocomplete {  background: '{{background-50}}'; }  md-autocomplete button md-icon path {    fill: '{{background-600}}'; }  md-autocomplete button:after {    background: '{{background-600-0.3}}'; }  md-autocomplete ul {    background: '{{background-50}}'; }    md-autocomplete ul li {      border-top: 1px solid '{{background-400}}';      color: '{{background-900}}'; }      md-autocomplete ul li .highlight {        color: '{{background-600}}'; }      md-autocomplete ul li:hover, md-autocomplete ul li.selected {        background: '{{background-200}}'; }md-backdrop.md-opaque.md-THEME_NAME-theme {  background-color: '{{foreground-4-0.5}}'; }md-bottom-sheet.md-THEME_NAME-theme {  background-color: '{{background-50}}';  border-top-color: '{{background-300}}'; }  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {    color: '{{foreground-1}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    background-color: '{{background-50}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    color: '{{foreground-1}}'; }md-card.md-THEME_NAME-theme {  border-radius: 2px; }  md-card.md-THEME_NAME-theme .md-card-image {    border-radius: 2px 2px 0 0; }md-toolbar .md-button.md-THEME_NAME-theme.md-fab {  background-color: white; }.md-button.md-THEME_NAME-theme {  border-radius: 3px; }  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {    background-color: '{{background-500-0.2}}'; }  .md-button.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {      color: '{{primary-contrast}}';      background-color: '{{primary-color}}'; }      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {        background-color: '{{primary-600}}'; }  .md-button.md-THEME_NAME-theme.md-fab {    border-radius: 50%;    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {      background-color: '{{accent-A700}}'; }  .md-button.md-THEME_NAME-theme.md-raised {    color: '{{background-contrast}}';    background-color: '{{background-50}}'; }    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {      background-color: '{{background-200}}'; }  .md-button.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {      color: '{{warn-contrast}}';      background-color: '{{warn-color}}'; }      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {        background-color: '{{warn-700}}'; }  .md-button.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {      color: '{{accent-contrast}}';      background-color: '{{accent-color}}'; }      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {        background-color: '{{accent-700}}'; }  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {    color: '{{foreground-3}}';    background-color: transparent;    cursor: not-allowed; }md-checkbox.md-THEME_NAME-theme .md-ripple {  color: '{{accent-600}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon {  background-color: '{{accent-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {  color: '{{primary-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {  background-color: '{{primary-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {  color: '{{warn-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {  background-color: '{{warn-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme[disabled] .md-icon {  border-color: '{{foreground-3}}'; }md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {  background-color: '{{foreground-3}}'; }md-content.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-dialog.md-THEME_NAME-theme {  border-radius: 4px;  background-color: '{{background-hue-3}}'; }  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {    border-top-color: '{{foreground-4}}'; }md-divider.md-THEME_NAME-theme {  border-top-color: '{{foreground-4}}'; }md-icon.md-THEME_NAME-theme.md-primary {  color: '{{primary-color}}'; }md-icon.md-THEME_NAME-theme.md-accent {  color: '{{accent-color}}'; }md-icon.md-THEME_NAME-theme.md-warn {  color: '{{warn-color}}'; }md-icon.md-THEME_NAME-theme.md-danger {  color: '{{danger-color}}'; }md-input-container.md-THEME_NAME-theme .md-input {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}';  text-shadow: '{{foreground-shadow}}'; }  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {  color: '{{foreground-2}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {  border-color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {  color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {  border-color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {  border-bottom-color: transparent;  color: '{{foreground-3}}';  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);  background-image: -ms-linear-gradient(left, transparent 0%, '{{foreground-4}}' 100%); }md-progress-circular.md-THEME_NAME-theme {  background-color: transparent; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {    border-top-color: '{{primary-color}}';    border-bottom-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-top-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-right-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {    border-left-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {    border-top-color: '{{warn-color}}';    border-bottom-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-top-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-right-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {    border-left-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {    border-top-color: '{{accent-color}}';    border-bottom-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-top-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-right-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {    border-left-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme .md-container {  background-color: '{{primary-100}}'; }md-progress-linear.md-THEME_NAME-theme .md-bar {  background-color: '{{primary-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-container {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {  background-color: '{{warn-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-container {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {  background-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }md-radio-button.md-THEME_NAME-theme .md-off {  border-color: '{{foreground-2}}'; }md-radio-button.md-THEME_NAME-theme .md-on {  background-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-off {  border-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {  color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme .md-container .md-ripple {  color: '{{accent-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {  background-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {  border-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {  color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {  color: '{{primary-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {  background-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {  border-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {  color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {  color: '{{warn-600}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {  border-color: '{{foreground-3}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {  border-color: '{{foreground-3}}'; }md-radio-group.md-THEME_NAME-theme:focus:not(:empty) {  border-color: '{{foreground-1}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label {  border-bottom-color: '{{primary-color}}';  color: '{{ foreground-1 }}'; }  md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label.md-placeholder {    color: '{{ foreground-1 }}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-label {  border-bottom-color: '{{accent-color}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-label {  border-bottom-color: '{{warn-color}}'; }md-select.md-THEME_NAME-theme[disabled] .md-select-label {  color: '{{foreground-3}}'; }  md-select.md-THEME_NAME-theme[disabled] .md-select-label.md-placeholder {    color: '{{foreground-3}}'; }md-select.md-THEME_NAME-theme .md-select-label {  border-bottom-color: '{{foreground-4}}'; }  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {    color: '{{foreground-2}}'; }md-select-menu.md-THEME_NAME-theme md-optgroup {  color: '{{foreground-2}}'; }  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {    color: '{{foreground-1}}'; }md-select-menu.md-THEME_NAME-theme md-option[selected] {  background-color: '{{primary-50}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {    background-color: '{{primary-100}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {    background-color: '{{accent-50}}'; }    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {      background-color: '{{accent-100}}'; }md-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {  background: '{{background-200}}'; }md-sidenav.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track {  background-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme .md-track-ticks {  background-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-focus-thumb {  background-color: '{{foreground-2}}'; }md-slider.md-THEME_NAME-theme .md-focus-ring {  border-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-disabled-thumb {  border-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme.md-min .md-thumb:after {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track.md-track-fill {  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb:after {  border-color: '{{accent-color}}';  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-sign {  background-color: '{{accent-color}}'; }  md-slider.md-THEME_NAME-theme .md-sign:after {    border-top-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb-text {  color: '{{accent-contrast}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {  border-color: '{{warn-color}}';  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-sign {  background-color: '{{warn-color}}'; }  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {    border-top-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {  color: '{{warn-contrast}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {  border-color: '{{primary-color}}';  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-sign {  background-color: '{{primary-color}}'; }  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {    border-top-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {  color: '{{primary-contrast}}'; }md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {  border-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {  background-color: '{{foreground-3}}'; }.md-subheader.md-THEME_NAME-theme {  color: '{{ foreground-2-0.23 }}';  background-color: '{{background-hue-3}}'; }  .md-subheader.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme .md-thumb {  background-color: '{{background-50}}'; }md-switch.md-THEME_NAME-theme .md-bar {  background-color: '{{background-500}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-thumb {  background-color: '{{accent-color}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-bar {  background-color: '{{accent-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {  background-color: '{{primary-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {  background-color: '{{primary-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {  background-color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {  background-color: '{{warn-color-0.5}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-thumb {  background-color: '{{background-400}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-bar {  background-color: '{{foreground-4}}'; }md-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {  border-color: '{{foreground-1}}';  border-style: dotted; }md-tabs.md-THEME_NAME-theme .md-header {  background-color: transparent; }md-tabs.md-THEME_NAME-theme .md-paginator md-icon {  color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent .md-header {  background-color: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {  color: '{{accent-100}}'; }  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {    color: '{{accent-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary .md-header {  background-color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {    color: '{{primary-contrast}}';    background-color: '{{primary-contrast-0.1}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {    color: '{{primary-contrast}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-warn .md-header {  background-color: '{{warn-color}}'; }md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {  color: '{{warn-100}}'; }  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {    color: '{{warn-contrast}}'; }md-tabs.md-THEME_NAME-theme md-tabs-ink-bar {  color: '{{accent-color}}';  background: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme md-tab {  color: '{{foreground-2}}'; }  md-tabs.md-THEME_NAME-theme md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme md-tab:focus {    color: '{{foreground-1}}'; }  md-tabs.md-THEME_NAME-theme md-tab.active {    color: '{{primary-color}}'; }  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {    color: '{{accent-100}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  text-shadow: '{{foreground-shadow}}'; }  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme label {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {  border-color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused label {  color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {  border-color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {  color: '{{foreground-2}}'; }md-input-group.md-THEME_NAME-theme .md-input[disabled] {  border-bottom-color: '{{foreground-4}}';  color: '{{foreground-3}}'; }md-toast.md-THEME_NAME-theme {  background-color: '{{foreground-1}}';  color: '{{background-50}}'; }  md-toast.md-THEME_NAME-theme .md-button {    color: '{{background-50}}'; }    md-toast.md-THEME_NAME-theme .md-button.md-highlight {      color: '{{primary-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {        color: '{{accent-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {        color: '{{warn-A200}}'; }md-toolbar.md-THEME_NAME-theme {  background-color: '{{primary-color}}';  color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme .md-button {    color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-accent {    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-warn {    background-color: '{{warn-color}}';    color: '{{warn-contrast}}'; }md-tooltip.md-THEME_NAME-theme {  color: '{{background-A100}}'; }  md-tooltip.md-THEME_NAME-theme .md-background {    background-color: '{{foreground-2}}'; }\");\n!function(e,t,r){\"use strict\";function n(e){return A(e)?e:Object.keys(e).map(function(t){return e[t]})}function u(e){return null===e}function i(e,t){var n=Object.keys(e);return-1==n.map(function(n){return t[n]!==r&&t[n]==e[n]}).indexOf(!1)}function a(e,t){if(\"\"===t)return e;var r=e.indexOf(t.charAt(0));return-1===r?!1:a(e.substr(r+1),t.substr(1))}function o(e,t,r){var n=0;return e.filter(function(e){var u=O(r)?t>n&&r(e):t>n;return n=u?n+1:n,u})}function s(e,t,r){return r.round(e*r.pow(10,t))/r.pow(10,t)}function f(e,t,r){t=t||[];var n=Object.keys(e);return n.forEach(function(n){if(N(e[n])&&!A(e[n])){var u=r?r+\".\"+n:r;f(e[n],t,u||n)}else{var i=r?r+\".\"+n:n;t.push(i)}}),t}function l(e){return e&&e.$evalAsync&&e.$watch}function c(){return function(e,t){return e>t}}function m(){return function(e,t){return e>=t}}function d(){return function(e,t){return t>e}}function p(){return function(e,t){return t>=e}}function b(){return function(e,t){return e==t}}function h(){return function(e,t){return e!=t}}function v(){return function(e,t){return e===t}}function g(){return function(e,t){return e!==t}}function y(e){return function(t,r){return t=N(t)?n(t):t,!A(t)||F(r)?!1:t.some(function(t){return N(t)||z(r)?e(r)(t):t===r})}}function w(e,t){return t=t||0,t>=e.length?e:A(e[t])?w(e.slice(0,t).concat(e[t],e.slice(t+1)),t):w(e,t+1)}function $(e){return function(t,r){function u(e,t){return F(t)?!1:e.some(function(e){return T(e,t)})}if(t=N(t)?n(t):t,!A(t))return t;var i=[],a=e(r);return t.filter(F(r)?function(e,t,r){return r.indexOf(e)===t}:function(e){var t=a(e);return u(i,t)?!1:(i.push(t),!0)})}}function x(e,t,r){return t?e+r+x(e,--t,r):e}var O=t.isDefined,F=t.isUndefined,z=t.isFunction,E=t.isString,j=t.isNumber,N=t.isObject,A=t.isArray,C=t.forEach,L=t.extend,B=t.copy,T=t.equals;String.prototype.contains||(String.prototype.contains=function(){return-1!==String.prototype.indexOf.apply(this,arguments)}),t.module(\"a8m.angular\",[]).filter(\"isUndefined\",function(){return function(e){return t.isUndefined(e)}}).filter(\"isDefined\",function(){return function(e){return t.isDefined(e)}}).filter(\"isFunction\",function(){return function(e){return t.isFunction(e)}}).filter(\"isString\",function(){return function(e){return t.isString(e)}}).filter(\"isNumber\",function(){return function(e){return t.isNumber(e)}}).filter(\"isArray\",function(){return function(e){return t.isArray(e)}}).filter(\"isObject\",function(){return function(e){return t.isObject(e)}}).filter(\"isEqual\",function(){return function(e,r){return t.equals(e,r)}}),t.module(\"a8m.conditions\",[]).filter({isGreaterThan:c,\">\":c,isGreaterThanOrEqualTo:m,\">=\":m,isLessThan:d,\"<\":d,isLessThanOrEqualTo:p,\"<=\":p,isEqualTo:b,\"==\":b,isNotEqualTo:h,\"!=\":h,isIdenticalTo:v,\"===\":v,isNotIdenticalTo:g,\"!==\":g}),t.module(\"a8m.is-null\",[]).filter(\"isNull\",function(){return function(e){return u(e)}}),t.module(\"a8m.after-where\",[]).filter(\"afterWhere\",function(){return function(e,t){if(e=N(e)?n(e):e,!A(e)||F(t))return e;var r=e.map(function(e){return i(t,e)}).indexOf(!0);return e.slice(-1===r?0:r)}}),t.module(\"a8m.after\",[]).filter(\"after\",function(){return function(e,t){return e=N(e)?n(e):e,A(e)?e.slice(t):e}}),t.module(\"a8m.before-where\",[]).filter(\"beforeWhere\",function(){return function(e,t){if(e=N(e)?n(e):e,!A(e)||F(t))return e;var r=e.map(function(e){return i(t,e)}).indexOf(!0);return e.slice(0,-1===r?e.length:++r)}}),t.module(\"a8m.before\",[]).filter(\"before\",function(){return function(e,t){return e=N(e)?n(e):e,A(e)?e.slice(0,t?--t:t):e}}),t.module(\"a8m.concat\",[]).filter(\"concat\",[function(){return function(e,t){if(F(t))return e;if(A(e))return e.concat(N(t)?n(t):t);if(N(e)){var r=n(e);return r.concat(N(t)?n(t):t)}return e}}]),t.module(\"a8m.contains\",[]).filter({contains:[\"$parse\",y],some:[\"$parse\",y]}),t.module(\"a8m.count-by\",[]).filter(\"countBy\",[\"$parse\",function(e){return function(t,r){var u,i={},a=e(r);return t=N(t)?n(t):t,!A(t)||F(r)?t:(t.forEach(function(e){u=a(e),i[u]||(i[u]=0),i[u]++}),i)}}]),t.module(\"a8m.defaults\",[]).filter(\"defaults\",[\"$parse\",function(e){return function(t,r){if(t=N(t)?n(t):t,!A(t)||!N(r))return t;var u=f(r);return t.forEach(function(t){u.forEach(function(n){var u=e(n),i=u.assign;F(u(t))&&i(t,u(r))})}),t}}]),t.module(\"a8m.every\",[]).filter(\"every\",[\"$parse\",function(e){return function(t,r){return t=N(t)?n(t):t,!A(t)||F(r)?!0:t.every(function(t){return N(t)||z(r)?e(r)(t):t===r})}}]),t.module(\"a8m.filter-by\",[]).filter(\"filterBy\",[\"$parse\",function(e){return function(t,u,i){var a;return i=E(i)||j(i)?String(i).toLowerCase():r,t=N(t)?n(t):t,!A(t)||F(i)?t:t.filter(function(t){return u.some(function(r){if(~r.indexOf(\"+\")){var n=r.replace(new RegExp(\"\\\\s\",\"g\"),\"\").split(\"+\");a=n.reduce(function(r,n,u){return 1===u?e(r)(t)+\" \"+e(n)(t):r+\" \"+e(n)(t)})}else a=e(r)(t);return E(a)||j(a)?String(a).toLowerCase().contains(i):!1})})}}]),t.module(\"a8m.first\",[]).filter(\"first\",[\"$parse\",function(e){return function(t){var u,i,a;return t=N(t)?n(t):t,A(t)?(a=Array.prototype.slice.call(arguments,1),u=j(a[0])?a[0]:1,i=j(a[0])?j(a[1])?r:a[1]:a[0],a.length?o(t,u,i?e(i):i):t[0]):t}}]),t.module(\"a8m.flatten\",[]).filter(\"flatten\",function(){return function(e,t){return t=t||!1,e=N(e)?n(e):e,A(e)?t?[].concat.apply([],e):w(e,0):e}}),t.module(\"a8m.fuzzy-by\",[]).filter(\"fuzzyBy\",[\"$parse\",function(e){return function(t,r,u,i){var o,s,f=i||!1;return t=N(t)?n(t):t,!A(t)||F(r)||F(u)?t:(s=e(r),t.filter(function(e){return o=s(e),E(o)?(o=f?o:o.toLowerCase(),u=f?u:u.toLowerCase(),a(o,u)!==!1):!1}))}}]),t.module(\"a8m.fuzzy\",[]).filter(\"fuzzy\",function(){return function(e,t,r){function u(e,t){var r,n,u=Object.keys(e);return 0<u.filter(function(u){return r=e[u],n?!0:E(r)?(r=i?r:r.toLowerCase(),n=a(r,t)!==!1):!1}).length}var i=r||!1;return e=N(e)?n(e):e,!A(e)||F(t)?e:(t=i?t:t.toLowerCase(),e.filter(function(e){return E(e)?(e=i?e:e.toLowerCase(),a(e,t)!==!1):N(e)?u(e,t):!1}))}}),t.module(\"a8m.group-by\",[\"a8m.filter-watcher\"]).filter(\"groupBy\",[\"$parse\",\"filterWatcher\",function(e,t){return function(r,n){function u(e,t){var r,n={};return C(e,function(e){r=t(e),n[r]||(n[r]=[]),n[r].push(e)}),n}if(!N(r)||F(n))return r;var i=e(n);return t.isMemoized(\"groupBy\",arguments)||t.memoize(\"groupBy\",arguments,this,u(r,i))}}]),t.module(\"a8m.is-empty\",[]).filter(\"isEmpty\",function(){return function(e){return N(e)?!n(e).length:!e.length}}),t.module(\"a8m.join\",[]).filter(\"join\",function(){return function(e,t){return F(e)||!A(e)?e:(F(t)&&(t=\" \"),e.join(t))}}),t.module(\"a8m.last\",[]).filter(\"last\",[\"$parse\",function(e){return function(t){var u,i,a,s=B(t);return s=N(s)?n(s):s,A(s)?(a=Array.prototype.slice.call(arguments,1),u=j(a[0])?a[0]:1,i=j(a[0])?j(a[1])?r:a[1]:a[0],a.length?o(s.reverse(),u,i?e(i):i).reverse():s[s.length-1]):s}}]),t.module(\"a8m.map\",[]).filter(\"map\",[\"$parse\",function(e){return function(t,r){return t=N(t)?n(t):t,!A(t)||F(r)?t:t.map(function(t){return e(r)(t)})}}]),t.module(\"a8m.omit\",[]).filter(\"omit\",[\"$parse\",function(e){return function(t,r){return t=N(t)?n(t):t,!A(t)||F(r)?t:t.filter(function(t){return!e(r)(t)})}}]),t.module(\"a8m.pick\",[]).filter(\"pick\",[\"$parse\",function(e){return function(t,r){return t=N(t)?n(t):t,!A(t)||F(r)?t:t.filter(function(t){return e(r)(t)})}}]),t.module(\"a8m.remove-with\",[]).filter(\"removeWith\",function(){return function(e,t){return F(t)?e:(e=N(e)?n(e):e,e.filter(function(e){return!i(t,e)}))}}),t.module(\"a8m.remove\",[]).filter(\"remove\",function(){return function(e){e=N(e)?n(e):e;var t=Array.prototype.slice.call(arguments,1);return A(e)?e.filter(function(e){return!t.some(function(t){return T(t,e)})}):e}}),t.module(\"a8m.reverse\",[]).filter(\"reverse\",[function(){return function(e){return e=N(e)?n(e):e,E(e)?e.split(\"\").reverse().join(\"\"):A(e)?e.slice().reverse():e}}]),t.module(\"a8m.search-field\",[]).filter(\"searchField\",[\"$parse\",function(e){return function(t){var r,u;t=N(t)?n(t):t;var i=Array.prototype.slice.call(arguments,1);return A(t)&&i.length?t.map(function(t){return u=i.map(function(n){return(r=e(n))(t)}).join(\" \"),L(t,{searchField:u})}):t}}]),t.module(\"a8m.to-array\",[]).filter(\"toArray\",function(){return function(e,t){return N(e)?t?Object.keys(e).map(function(t){return L(e[t],{$key:t})}):n(e):e}}),t.module(\"a8m.unique\",[]).filter({unique:[\"$parse\",$],uniq:[\"$parse\",$]}),t.module(\"a8m.where\",[]).filter(\"where\",function(){return function(e,t){return F(t)?e:(e=N(e)?n(e):e,e.filter(function(e){return i(t,e)}))}}),t.module(\"a8m.xor\",[]).filter(\"xor\",[\"$parse\",function(e){return function(t,r,u){function i(t,r){var n=e(u);return r.some(function(e){return u?T(n(e),n(t)):T(e,t)})}return u=u||!1,t=N(t)?n(t):t,r=N(r)?n(r):r,A(t)&&A(r)?t.concat(r).filter(function(e){return!(i(e,t)&&i(e,r))}):t}}]),t.module(\"a8m.math.byteFmt\",[\"a8m.math\"]).filter(\"byteFmt\",[\"$math\",function(e){return function(t,r){return j(r)&&isFinite(r)&&r%1===0&&r>=0&&j(t)&&isFinite(t)?1024>t?s(t,r,e)+\" B\":1048576>t?s(t/1024,r,e)+\" KB\":1073741824>t?s(t/1048576,r,e)+\" MB\":s(t/1073741824,r,e)+\" GB\":\"NaN\"}}]),t.module(\"a8m.math.degrees\",[\"a8m.math\"]).filter(\"degrees\",[\"$math\",function(e){return function(t,r){if(j(r)&&isFinite(r)&&r%1===0&&r>=0&&j(t)&&isFinite(t)){var n=180*t/e.PI;return e.round(n*e.pow(10,r))/e.pow(10,r)}return\"NaN\"}}]),t.module(\"a8m.math.kbFmt\",[\"a8m.math\"]).filter(\"kbFmt\",[\"$math\",function(e){return function(t,r){return j(r)&&isFinite(r)&&r%1===0&&r>=0&&j(t)&&isFinite(t)?1024>t?s(t,r,e)+\" KB\":1048576>t?s(t/1024,r,e)+\" MB\":s(t/1048576,r,e)+\" GB\":\"NaN\"}}]),t.module(\"a8m.math\",[]).factory(\"$math\",[\"$window\",function(e){return e.Math}]),t.module(\"a8m.math.max\",[\"a8m.math\"]).filter(\"max\",[\"$math\",\"$parse\",function(e,t){function r(r,n){var u=r.map(function(e){return t(n)(e)});return u.indexOf(e.max.apply(e,u))}return function(t,n){return A(t)?F(n)?e.max.apply(e,t):t[r(t,n)]:t}}]),t.module(\"a8m.math.min\",[\"a8m.math\"]).filter(\"min\",[\"$math\",\"$parse\",function(e,t){function r(r,n){var u=r.map(function(e){return t(n)(e)});return u.indexOf(e.min.apply(e,u))}return function(t,n){return A(t)?F(n)?e.min.apply(e,t):t[r(t,n)]:t}}]),t.module(\"a8m.math.percent\",[\"a8m.math\"]).filter(\"percent\",[\"$math\",\"$window\",function(e,t){return function(r,n,u){var i=E(r)?t.Number(r):r;return n=n||100,u=u||!1,!j(i)||t.isNaN(i)?r:u?e.round(i/n*100):i/n*100}}]),t.module(\"a8m.math.radians\",[\"a8m.math\"]).filter(\"radians\",[\"$math\",function(e){return function(t,r){if(j(r)&&isFinite(r)&&r%1===0&&r>=0&&j(t)&&isFinite(t)){var n=3.14159265359*t/180;return e.round(n*e.pow(10,r))/e.pow(10,r)}return\"NaN\"}}]),t.module(\"a8m.math.radix\",[]).filter(\"radix\",function(){return function(e,t){var r=/^[2-9]$|^[1-2]\\d$|^3[0-6]$/;return j(e)&&r.test(t)?e.toString(t).toUpperCase():e}}),t.module(\"a8m.math.shortFmt\",[\"a8m.math\"]).filter(\"shortFmt\",[\"$math\",function(e){return function(t,r){return j(r)&&isFinite(r)&&r%1===0&&r>=0&&j(t)&&isFinite(t)?1e3>t?t:1e6>t?s(t/1e3,r,e)+\" K\":1e9>t?s(t/1e6,r,e)+\" M\":s(t/1e9,r,e)+\" B\":\"NaN\"}}]),t.module(\"a8m.math.sum\",[]).filter(\"sum\",function(){return function(e,t){return A(e)?e.reduce(function(e,t){return e+t},t||0):e}}),t.module(\"a8m.ends-with\",[]).filter(\"endsWith\",function(){return function(e,t,r){var n,u=r||!1;return!E(e)||F(t)?e:(e=u?e:e.toLowerCase(),n=e.length-t.length,-1!==e.indexOf(u?t:t.toLowerCase(),n))}}),t.module(\"a8m.latinize\",[]).filter(\"latinize\",[function(){function e(e){return e.replace(/[^\\u0000-\\u007E]/g,function(e){return r[e]||e})}for(var t=[{base:\"A\",letters:\"AⒶＡÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\"},{base:\"AA\",letters:\"Ꜳ\"},{base:\"AE\",letters:\"ÆǼǢ\"},{base:\"AO\",letters:\"Ꜵ\"},{base:\"AU\",letters:\"Ꜷ\"},{base:\"AV\",letters:\"ꜸꜺ\"},{base:\"AY\",letters:\"Ꜽ\"},{base:\"B\",letters:\"BⒷＢḂḄḆɃƂƁ\"},{base:\"C\",letters:\"CⒸＣĆĈĊČÇḈƇȻꜾ\"},{base:\"D\",letters:\"DⒹＤḊĎḌḐḒḎĐƋƊƉꝹ\"},{base:\"DZ\",letters:\"ǱǄ\"},{base:\"Dz\",letters:\"ǲǅ\"},{base:\"E\",letters:\"EⒺＥÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ\"},{base:\"F\",letters:\"FⒻＦḞƑꝻ\"},{base:\"G\",letters:\"GⒼＧǴĜḠĞĠǦĢǤƓꞠꝽꝾ\"},{base:\"H\",letters:\"HⒽＨĤḢḦȞḤḨḪĦⱧⱵꞍ\"},{base:\"I\",letters:\"IⒾＩÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\"},{base:\"J\",letters:\"JⒿＪĴɈ\"},{base:\"K\",letters:\"KⓀＫḰǨḲĶḴƘⱩꝀꝂꝄꞢ\"},{base:\"L\",letters:\"LⓁＬĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\"},{base:\"LJ\",letters:\"Ǉ\"},{base:\"Lj\",letters:\"ǈ\"},{base:\"M\",letters:\"MⓂＭḾṀṂⱮƜ\"},{base:\"N\",letters:\"NⓃＮǸŃÑṄŇṆŅṊṈȠƝꞐꞤ\"},{base:\"NJ\",letters:\"Ǌ\"},{base:\"Nj\",letters:\"ǋ\"},{base:\"O\",letters:\"OⓄＯÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\"},{base:\"OI\",letters:\"Ƣ\"},{base:\"OO\",letters:\"Ꝏ\"},{base:\"OU\",letters:\"Ȣ\"},{base:\"OE\",letters:\"Œ\"},{base:\"oe\",letters:\"œ\"},{base:\"P\",letters:\"PⓅＰṔṖƤⱣꝐꝒꝔ\"},{base:\"Q\",letters:\"QⓆＱꝖꝘɊ\"},{base:\"R\",letters:\"RⓇＲŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\"},{base:\"S\",letters:\"SⓈＳẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\"},{base:\"T\",letters:\"TⓉＴṪŤṬȚŢṰṮŦƬƮȾꞆ\"},{base:\"TZ\",letters:\"Ꜩ\"},{base:\"U\",letters:\"UⓊＵÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\"},{base:\"V\",letters:\"VⓋＶṼṾƲꝞɅ\"},{base:\"VY\",letters:\"Ꝡ\"},{base:\"W\",letters:\"WⓌＷẀẂŴẆẄẈⱲ\"},{base:\"X\",letters:\"XⓍＸẊẌ\"},{base:\"Y\",letters:\"YⓎＹỲÝŶỸȲẎŸỶỴƳɎỾ\"},{base:\"Z\",letters:\"ZⓏＺŹẐŻŽẒẔƵȤⱿⱫꝢ\"},{base:\"a\",letters:\"aⓐａẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ\"},{base:\"aa\",letters:\"ꜳ\"},{base:\"ae\",letters:\"æǽǣ\"},{base:\"ao\",letters:\"ꜵ\"},{base:\"au\",letters:\"ꜷ\"},{base:\"av\",letters:\"ꜹꜻ\"},{base:\"ay\",letters:\"ꜽ\"},{base:\"b\",letters:\"bⓑｂḃḅḇƀƃɓ\"},{base:\"c\",letters:\"cⓒｃćĉċčçḉƈȼꜿↄ\"},{base:\"d\",letters:\"dⓓｄḋďḍḑḓḏđƌɖɗꝺ\"},{base:\"dz\",letters:\"ǳǆ\"},{base:\"e\",letters:\"eⓔｅèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ\"},{base:\"f\",letters:\"fⓕｆḟƒꝼ\"},{base:\"g\",letters:\"gⓖｇǵĝḡğġǧģǥɠꞡᵹꝿ\"},{base:\"h\",letters:\"hⓗｈĥḣḧȟḥḩḫẖħⱨⱶɥ\"},{base:\"hv\",letters:\"ƕ\"},{base:\"i\",letters:\"iⓘｉìíîĩīĭïḯỉǐȉȋịįḭɨı\"},{base:\"j\",letters:\"jⓙｊĵǰɉ\"},{base:\"k\",letters:\"kⓚｋḱǩḳķḵƙⱪꝁꝃꝅꞣ\"},{base:\"l\",letters:\"lⓛｌŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ\"},{base:\"lj\",letters:\"ǉ\"},{base:\"m\",letters:\"mⓜｍḿṁṃɱɯ\"},{base:\"n\",letters:\"nⓝｎǹńñṅňṇņṋṉƞɲŉꞑꞥ\"},{base:\"nj\",letters:\"ǌ\"},{base:\"o\",letters:\"oⓞｏòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ\"},{base:\"oi\",letters:\"ƣ\"},{base:\"ou\",letters:\"ȣ\"},{base:\"oo\",letters:\"ꝏ\"},{base:\"p\",letters:\"pⓟｐṕṗƥᵽꝑꝓꝕ\"},{base:\"q\",letters:\"qⓠｑɋꝗꝙ\"},{base:\"r\",letters:\"rⓡｒŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\"},{base:\"s\",letters:\"sⓢｓßśṥŝṡšṧṣṩșşȿꞩꞅẛ\"},{base:\"t\",letters:\"tⓣｔṫẗťṭțţṱṯŧƭʈⱦꞇ\"},{base:\"tz\",letters:\"ꜩ\"},{base:\"u\",letters:\"uⓤｕùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\"},{base:\"v\",letters:\"vⓥｖṽṿʋꝟʌ\"},{base:\"vy\",letters:\"ꝡ\"},{base:\"w\",letters:\"wⓦｗẁẃŵẇẅẘẉⱳ\"},{base:\"x\",letters:\"xⓧｘẋẍ\"},{base:\"y\",letters:\"yⓨｙỳýŷỹȳẏÿỷẙỵƴɏỿ\"},{base:\"z\",letters:\"zⓩｚźẑżžẓẕƶȥɀⱬꝣ\"}],r={},n=0;n<t.length;n++)for(var u=t[n].letters.split(\"\"),i=0;i<u.length;i++)r[u[i]]=t[n].base;return function(t){return E(t)?e(t):t}}]),t.module(\"a8m.ltrim\",[]).filter(\"ltrim\",function(){return function(e,t){var r=t||\"\\\\s\";return E(e)?e.replace(new RegExp(\"^\"+r+\"+\"),\"\"):e}}),t.module(\"a8m.match\",[]).filter(\"match\",function(){return function(e,t,r){var n=new RegExp(t,r);return E(e)?e.match(n):null}}),t.module(\"a8m.repeat\",[]).filter(\"repeat\",[function(){return function(e,t,r){var n=~~t;return E(e)&&n?x(e,--t,r||\"\"):e}}]),t.module(\"a8m.rtrim\",[]).filter(\"rtrim\",function(){return function(e,t){var r=t||\"\\\\s\";return E(e)?e.replace(new RegExp(r+\"+$\"),\"\"):e}}),t.module(\"a8m.slugify\",[]).filter(\"slugify\",[function(){return function(e,t){var r=F(t)?\"-\":t;return E(e)?e.toLowerCase().replace(/\\s+/g,r):e}}]),t.module(\"a8m.starts-with\",[]).filter(\"startsWith\",function(){return function(e,t,r){var n=r||!1;return!E(e)||F(t)?e:(e=n?e:e.toLowerCase(),!e.indexOf(n?t:t.toLowerCase()))}}),t.module(\"a8m.stringular\",[]).filter(\"stringular\",function(){return function(e){var t=Array.prototype.slice.call(arguments,1);return e.replace(/{(\\d+)}/g,function(e,r){return F(t[r])?e:t[r]})}}),t.module(\"a8m.strip-tags\",[]).filter(\"stripTags\",function(){return function(e){return E(e)?e.replace(/<\\S[^><]*>/g,\"\"):e}}),t.module(\"a8m.test\",[]).filter(\"test\",function(){return function(e,t,r){var n=new RegExp(t,r);return E(e)?n.test(e):e}}),t.module(\"a8m.trim\",[]).filter(\"trim\",function(){return function(e,t){var r=t||\"\\\\s\";return E(e)?e.replace(new RegExp(\"^\"+r+\"+|\"+r+\"+$\",\"g\"),\"\"):e}}),t.module(\"a8m.truncate\",[]).filter(\"truncate\",function(){return function(e,t,r,n){return t=F(t)?e.length:t,n=n||!1,r=r||\"\",!E(e)||e.length<=t?e:e.substring(0,n?-1===e.indexOf(\" \",t)?e.length:e.indexOf(\" \",t):t)+r}}),t.module(\"a8m.ucfirst\",[]).filter(\"ucfirst\",[function(){return function(e){return E(e)?e.split(\" \").map(function(e){return e.charAt(0).toUpperCase()+e.substring(1)}).join(\" \"):e}}]),t.module(\"a8m.uri-component-encode\",[]).filter(\"uriComponentEncode\",[\"$window\",function(e){return function(t){return E(t)?e.encodeURIComponent(t):t}}]),t.module(\"a8m.uri-encode\",[]).filter(\"uriEncode\",[\"$window\",function(e){return function(t){return E(t)?e.encodeURI(t):t}}]),t.module(\"a8m.wrap\",[]).filter(\"wrap\",function(){return function(e,t,r){return E(e)&&O(t)?[t,e,r||t].join(\"\"):e}}),t.module(\"a8m.filter-watcher\",[]).provider(\"filterWatcher\",function(){this.$get=[\"$window\",\"$rootScope\",function(e,r){function n(e,r){return[e,t.toJson(r)].join(\"#\").replace(/\"/g,\"\")}function u(e){var t=e.targetScope.$id;C(c[t],function(e){delete f[e]}),delete c[t]}function i(){m(function(){r.$$phase||(f={})})}function a(e,t){var r=e.$id;return F(c[r])&&(e.$on(\"$destroy\",u),c[r]=[]),c[r].push(t)}function o(e,t){var r=n(e,t);return f[r]}function s(e,t,r,u){var o=n(e,t);return f[o]=u,l(r)?a(r,o):i(),u}var f={},c={},m=e.setTimeout;return{isMemoized:o,memoize:s}}]}),t.module(\"angular.filter\",[\"a8m.ucfirst\",\"a8m.uri-encode\",\"a8m.uri-component-encode\",\"a8m.slugify\",\"a8m.latinize\",\"a8m.strip-tags\",\"a8m.stringular\",\"a8m.truncate\",\"a8m.starts-with\",\"a8m.ends-with\",\"a8m.wrap\",\"a8m.trim\",\"a8m.ltrim\",\"a8m.rtrim\",\"a8m.repeat\",\"a8m.test\",\"a8m.match\",\"a8m.to-array\",\"a8m.concat\",\"a8m.contains\",\"a8m.unique\",\"a8m.is-empty\",\"a8m.after\",\"a8m.after-where\",\"a8m.before\",\"a8m.before-where\",\"a8m.defaults\",\"a8m.where\",\"a8m.reverse\",\"a8m.remove\",\"a8m.remove-with\",\"a8m.group-by\",\"a8m.count-by\",\"a8m.search-field\",\"a8m.fuzzy-by\",\"a8m.fuzzy\",\"a8m.omit\",\"a8m.pick\",\"a8m.every\",\"a8m.filter-by\",\"a8m.xor\",\"a8m.map\",\"a8m.first\",\"a8m.last\",\"a8m.flatten\",\"a8m.join\",\"a8m.math\",\"a8m.math.max\",\"a8m.math.min\",\"a8m.math.percent\",\"a8m.math.radix\",\"a8m.math.sum\",\"a8m.math.degrees\",\"a8m.math.radians\",\"a8m.math.byteFmt\",\"a8m.math.kbFmt\",\"a8m.math.shortFmt\",\"a8m.angular\",\"a8m.conditions\",\"a8m.is-null\",\"a8m.filter-watcher\"])}(window,window.angular);\nangular.module(\"ngLodash\",[]).constant(\"lodash\",null).config([\"$provide\",function(n){function t(n,t){if(n!==t){var r=n===n,e=t===t;if(n>t||!r||\"undefined\"==typeof n&&e)return 1;if(t>n||!e||\"undefined\"==typeof t&&r)return-1}return 0}function r(n,t,r){if(t!==t)return h(n,r);for(var e=(r||0)-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function e(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function u(n){return\"string\"==typeof n?n:null==n?\"\":n+\"\"}function i(n){return n.charCodeAt(0)}function o(n,t){for(var r=-1,e=n.length;++r<e&&t.indexOf(n.charAt(r))>-1;);return r}function a(n,t){for(var r=n.length;r--&&t.indexOf(n.charAt(r))>-1;);return r}function f(n,r){return t(n.criteria,r.criteria)||n.index-r.index}function c(n,r){for(var e=-1,u=n.criteria,i=r.criteria,o=u.length;++e<o;){var a=t(u[e],i[e]);if(a)return a}return n.index-r.index}function l(n){return Dn[n]}function s(n){return zn[n]}function p(n){return\"\\\\\"+Pn[n]}function h(n,t,r){for(var e=n.length,u=r?t||e:(t||0)-1;r?u--:++u<e;){var i=n[u];if(i!==i)return u}return-1}function v(n){return n&&\"object\"==typeof n||!1}function g(n){return 160>=n&&n>=9&&13>=n||32==n||160==n||5760==n||6158==n||n>=8192&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n)}function d(n,t){for(var r=-1,e=n.length,u=-1,i=[];++r<e;)n[r]===t&&(n[r]=z,i[++u]=r);return i}function y(n,t){for(var r,e=-1,u=n.length,i=-1,o=[];++e<u;){var a=n[e],f=t?t(a,e,n):a;e&&r===f||(r=f,o[++i]=a)}return o}function _(n){for(var t=-1,r=n.length;++t<r&&g(n.charCodeAt(t)););return t}function m(n){for(var t=n.length;t--&&g(n.charCodeAt(t)););return t}function w(n){return Mn[n]}function b(n){function g(n){if(v(n)&&!Mo(n)){if(n instanceof G)return n;if(Ki.call(n,\"__wrapped__\"))return new G(n.__wrapped__,n.__chain__,Hn(n.__actions__))}return new G(n)}function G(n,t,r){this.__actions__=r||[],this.__chain__=!!t,this.__wrapped__=n}function H(n){this.actions=null,this.dir=1,this.dropCount=0,this.filtered=!1,this.iteratees=null,this.takeCount=xo,this.views=null,this.wrapped=n}function nn(){var n=this.actions,t=this.iteratees,r=this.views,e=new H(this.wrapped);return e.actions=n?Hn(n):null,e.dir=this.dir,e.dropCount=this.dropCount,e.filtered=this.filtered,e.iteratees=t?Hn(t):null,e.takeCount=this.takeCount,e.views=r?Hn(r):null,e}function Dn(){if(this.filtered){var n=new H(this);n.dir=-1,n.filtered=!0}else n=this.clone(),n.dir*=-1;return n}function zn(){var n=this.wrapped.value();if(!Mo(n))return Yt(n,this.actions);var t=this.dir,r=0>t,e=dr(0,n.length,this.views),u=e.start,i=e.end,o=i-u,a=this.dropCount,f=go(o,this.takeCount-a),c=r?i:u-1,l=this.iteratees,s=l?l.length:0,p=0,h=[];n:for(;o--&&f>p;){c+=t;for(var v=-1,g=n[c];++v<s;){var d=l[v],y=d.iteratee,_=y(g,c,n),m=d.type;if(m==$)g=_;else if(!_){if(m==L)continue n;break n}}a?a--:h[p++]=g}return h}function Mn(){this.__data__={}}function qn(n){return this.has(n)&&delete this.__data__[n]}function Pn(n){return\"__proto__\"==n?x:this.__data__[n]}function Vn(n){return\"__proto__\"!=n&&Ki.call(this.__data__,n)}function Yn(n,t){return\"__proto__\"!=n&&(this.__data__[n]=t),this}function Gn(n){var t=n?n.length:0;for(this.data={hash:so(null),set:new uo};t--;)this.push(n[t])}function Jn(n,t){var r=n.data,e=\"string\"==typeof t||wu(t)?r.set.has(t):r.hash[t];return e?0:-1}function Zn(n){var t=this.data;\"string\"==typeof n||wu(n)?t.set.add(n):t.hash[n]=!0}function Hn(n,t){var r=-1,e=n.length;for(t||(t=Ci(e));++r<e;)t[r]=n[r];return t}function Qn(n,t){for(var r=-1,e=n.length;++r<e&&t(n[r],r,n)!==!1;);return n}function nt(n,t){for(var r=n.length;r--&&t(n[r],r,n)!==!1;);return n}function tt(n,t){for(var r=-1,e=n.length;++r<e;)if(!t(n[r],r,n))return!1;return!0}function rt(n,t){for(var r=-1,e=n.length,u=-1,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[++u]=o)}return i}function et(n,t){for(var r=-1,e=n.length,u=Ci(e);++r<e;)u[r]=t(n[r],r,n);return u}function ut(n){for(var t=-1,r=n.length,e=bo;++t<r;){var u=n[t];u>e&&(e=u)}return e}function it(n){for(var t=-1,r=n.length,e=xo;++t<r;){var u=n[t];e>u&&(e=u)}return e}function ot(n,t,r,e){var u=-1,i=n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function at(n,t,r,e){var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function ft(n,t){for(var r=-1,e=n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}function ct(n,t){return\"undefined\"==typeof n?t:n}function lt(n,t,r,e){return\"undefined\"!=typeof n&&Ki.call(e,r)?n:t}function st(n,t,r){var e=Vo(t);if(!r)return ht(t,n,e);for(var u=-1,i=e.length;++u<i;){var o=e[u],a=n[o],f=r(a,t[o],o,n,t);(f===f?f===a:a!==a)&&(\"undefined\"!=typeof a||o in n)||(n[o]=f)}return n}function pt(n,t){for(var r=-1,e=n.length,u=Ar(e),i=t.length,o=Ci(i);++r<i;){var a=t[r];u?(a=parseFloat(a),o[r]=br(a,e)?n[a]:x):o[r]=n[a]}return o}function ht(n,t,r){r||(r=t,t={});for(var e=-1,u=r.length;++e<u;){var i=r[e];t[i]=n[i]}return t}function vt(n,t){for(var r=-1,e=t.length;++r<e;){var u=t[r];n[u]=cr(n[u],j,n)}return n}function gt(n,t,r){var e=typeof n;return\"function\"==e?\"undefined\"!=typeof t&&wr(n)?Xt(n,t,r):n:null==n?wi:\"object\"==e?Ft(n):Bt(n+\"\")}function dt(n,t,r,e,u,i,o){var a;if(r&&(a=u?r(n,e,u):r(n)),\"undefined\"!=typeof a)return a;if(!wu(n))return n;var f=Mo(n);if(f){if(a=yr(n),!t)return Hn(n,a)}else{var c=Yi.call(n),l=c==Y;if(c!=X&&c!=M&&(!l||u))return $n[c]?mr(n,c,t):u?n:{};if(a=_r(l?{}:n),!t)return ht(n,a,Vo(n))}i||(i=[]),o||(o=[]);for(var s=i.length;s--;)if(i[s]==n)return o[s];return i.push(n),o.push(a),(f?Qn:kt)(n,function(e,u){a[u]=dt(e,t,r,u,n,i,o)}),a}function yt(n,t,r,e){if(!mu(n))throw new Bi(D);return io(function(){n.apply(x,qt(r,e))},t)}function _t(n,t){var e=n?n.length:0,u=[];if(!e)return u;var i=-1,o=gr(),a=o==r,f=a&&t.length>=200&&So(t),c=t.length;f&&(o=Jn,a=!1,t=f);n:for(;++i<e;){var l=n[i];if(a&&l===l){for(var s=c;s--;)if(t[s]===l)continue n;u.push(l)}else o(t,l)<0&&u.push(l)}return u}function mt(n,t){var r=n?n.length:0;if(!Ar(r))return kt(n,t);for(var e=-1,u=Sr(n);++e<r&&t(u[e],e,u)!==!1;);return n}function wt(n,t){var r=n?n.length:0;if(!Ar(r))return Ot(n,t);for(var e=Sr(n);r--&&t(e[r],r,e)!==!1;);return n}function bt(n,t){var r=!0;return mt(n,function(n,e,u){return r=!!t(n,e,u)}),r}function xt(n,t){var r=[];return mt(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function At(n,t,r,e){var u;return r(n,function(n,r,i){return t(n,r,i)?(u=e?r:n,!1):void 0}),u}function jt(n,t,r,e){for(var u=(e||0)-1,i=n.length,o=-1,a=[];++u<i;){var f=n[u];if(v(f)&&Ar(f.length)&&(Mo(f)||pu(f))){t&&(f=jt(f,t,r));var c=-1,l=f.length;for(a.length+=l;++c<l;)a[++o]=f[c]}else r||(a[++o]=f)}return a}function Et(n,t,r){for(var e=-1,u=Sr(n),i=r(n),o=i.length;++e<o;){var a=i[e];if(t(u[a],a,u)===!1)break}return n}function Rt(n,t,r){for(var e=Sr(n),u=r(n),i=u.length;i--;){var o=u[i];if(t(e[o],o,e)===!1)break}return n}function It(n,t){return Et(n,t,qu)}function kt(n,t){return Et(n,t,Vo)}function Ot(n,t){return Rt(n,t,Vo)}function Ct(n,t){for(var r=-1,e=t.length,u=-1,i=[];++r<e;){var o=t[r];mu(n[o])&&(i[++u]=o)}return i}function Tt(n,t,r){var e=-1,u=\"function\"==typeof t,i=n?n.length:0,o=Ar(i)?Ci(i):[];return mt(n,function(n){var i=u?t:null!=n&&n[t];o[++e]=i?i.apply(n,r):x}),o}function St(n,t,r,e,u,i){if(n===t)return 0!==n||1/n==1/t;var o=typeof n,a=typeof t;return\"function\"!=o&&\"object\"!=o&&\"function\"!=a&&\"object\"!=a||null==n||null==t?n!==n&&t!==t:Nt(n,t,St,r,e,u,i)}function Nt(n,t,r,e,u,i,o){var a=Mo(n),f=Mo(t),c=q,l=q;a||(c=Yi.call(n),c==M?c=X:c!=X&&(a=ku(n))),f||(l=Yi.call(t),l==M?l=X:l!=X&&(f=ku(t)));var s=c==X,p=l==X,h=c==l;if(h&&!a&&!s)return sr(n,t,c);var v=s&&Ki.call(n,\"__wrapped__\"),g=p&&Ki.call(t,\"__wrapped__\");if(v||g)return r(v?n.value():n,g?t.value():t,e,u,i,o);if(!h)return!1;i||(i=[]),o||(o=[]);for(var d=i.length;d--;)if(i[d]==n)return o[d]==t;i.push(n),o.push(t);var y=(a?lr:pr)(n,t,r,e,u,i,o);return i.pop(),o.pop(),y}function Ut(n,t,r,e,u){var i=t.length;if(null==n)return!i;for(var o=-1,a=!u;++o<i;)if(a&&e[o]?r[o]!==n[t[o]]:!Ki.call(n,t[o]))return!1;for(o=-1;++o<i;){var f=t[o];if(a&&e[o])var c=Ki.call(n,f);else{var l=n[f],s=r[o];c=u?u(l,s,f):x,\"undefined\"==typeof c&&(c=St(s,l,u,!0))}if(!c)return!1}return!0}function Wt(n,t){var r=[];return mt(n,function(n,e,u){r.push(t(n,e,u))}),r}function Ft(n){var t=Vo(n),r=t.length;if(1==r){var e=t[0],u=n[e];if(jr(u))return function(n){return null!=n&&u===n[e]&&Ki.call(n,e)}}for(var i=Ci(r),o=Ci(r);r--;)u=n[t[r]],i[r]=u,o[r]=jr(u);return function(n){return Ut(n,t,i,o)}}function Lt(n,t,r,e,u){var i=Ar(t.length)&&(Mo(t)||ku(t));return(i?Qn:kt)(t,function(t,o,a){if(v(t))return e||(e=[]),u||(u=[]),$t(n,a,o,Lt,r,e,u);var f=n[o],c=r?r(f,t,o,n,a):x,l=\"undefined\"==typeof c;l&&(c=t),!i&&\"undefined\"==typeof c||!l&&(c===c?c===f:f!==f)||(n[o]=c)}),n}function $t(n,t,r,e,u,i,o){for(var a=i.length,f=t[r];a--;)if(i[a]==f)return void(n[r]=o[a]);var c=n[r],l=u?u(c,f,r,n,t):x,s=\"undefined\"==typeof l;s&&(l=f,Ar(f.length)&&(Mo(f)||ku(f))?l=Mo(c)?c:c?Hn(c):[]:Po(f)||pu(f)?l=pu(c)?Tu(c):Po(c)?c:{}:s=!1),i.push(f),o.push(l),s?n[r]=e(l,f,u,i,o):(l===l?l!==c:c===c)&&(n[r]=l)}function Bt(n){return function(t){return null==t?x:t[n]}}function Dt(n,r){var e=r.length,u=pt(n,r);for(r.sort(t);e--;){var i=parseFloat(r[e]);if(i!=o&&br(i)){var o=i;oo.call(n,i,1)}}return u}function zt(n,t){return n+no(wo()*(t-n+1))}function Mt(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function qt(n,t,r){var e=-1,u=n.length;t=null==t?0:+t||0,0>t&&(t=-t>u?0:u+t),r=\"undefined\"==typeof r||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Ci(u);++e<u;)i[e]=n[e+t];return i}function Pt(n,t){var r;return mt(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function Kt(n,t){var e=-1,u=gr(),i=n.length,o=u==r,a=o&&i>=200,f=a&&So(),c=[];f?(u=Jn,o=!1):(a=!1,f=t?[]:c);n:for(;++e<i;){var l=n[e],s=t?t(l,e,n):l;if(o&&l===l){for(var p=f.length;p--;)if(f[p]===s)continue n;t&&f.push(s),c.push(l)}else u(f,s)<0&&((t||a)&&f.push(s),c.push(l))}return c}function Vt(n,t){for(var r=-1,e=t.length,u=Ci(e);++r<e;)u[r]=n[t[r]];return u}function Yt(n,t){var r=n;r instanceof H&&(r=r.value());for(var e=-1,u=t.length;++e<u;){var i=[r],o=t[e];ro.apply(i,o.args),r=o.func.apply(o.thisArg,i)}return r}function Gt(n,t,r){var e=0,u=n?n.length:e;if(\"number\"==typeof t&&t===t&&Eo>=u){for(;u>e;){var i=e+u>>>1,o=n[i];(r?t>=o:t>o)?e=i+1:u=i}return u}return Jt(n,t,wi,r)}function Jt(n,t,r,e){t=r(t);for(var u=0,i=n?n.length:0,o=t!==t,a=\"undefined\"==typeof t;i>u;){var f=no((u+i)/2),c=r(n[f]),l=c===c;if(o)var s=l||e;else s=a?l&&(e||\"undefined\"!=typeof c):e?t>=c:t>c;s?u=f+1:i=f}return go(i,jo)}function Xt(n,t,r){if(\"function\"!=typeof n)return wi;if(\"undefined\"==typeof t)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)};case 5:return function(r,e,u,i,o){return n.call(t,r,e,u,i,o)}}return function(){return n.apply(t,arguments)}}function Zt(n){return Zi.call(n,0)}function Ht(n,t,r){for(var e=r.length,u=-1,i=vo(n.length-e,0),o=-1,a=t.length,f=Ci(i+a);++o<a;)f[o]=t[o];for(;++u<e;)f[r[u]]=n[u];for(;i--;)f[o++]=n[u++];return f}function Qt(n,t,r){for(var e=-1,u=r.length,i=-1,o=vo(n.length-u,0),a=-1,f=t.length,c=Ci(o+f);++i<o;)c[i]=n[i];for(var l=i;++a<f;)c[l+a]=t[a];for(;++e<u;)c[l+r[e]]=n[i++];return c}function nr(n,t){return function(r,e,u){var i=t?t():{};if(e=vr(e,u,3),Mo(r))for(var o=-1,a=r.length;++o<a;){var f=r[o];n(i,f,e(f,o,r),r)}else mt(r,function(t,r,u){n(i,t,e(t,r,u),u)});return i}}function tr(n){return function(){var t=arguments.length,r=arguments[0];if(2>t||null==r)return r;if(t>3&&xr(arguments[1],arguments[2],arguments[3])&&(t=2),t>3&&\"function\"==typeof arguments[t-2])var e=Xt(arguments[--t-1],arguments[t--],5);else t>2&&\"function\"==typeof arguments[t-1]&&(e=arguments[--t]);for(var u=0;++u<t;){var i=arguments[u];i&&n(r,i,e)}return r}}function rr(n,t){function r(){return(this instanceof r?e:n).apply(t,arguments)}var e=ur(n);return r}function er(n){return function(t){for(var r=-1,e=di(ni(t)),u=e.length,i=\"\";++r<u;)i=n(i,e[r],r);return i}}function ur(n){return function(){var t=Co(n.prototype),r=n.apply(t,arguments);return wu(r)?r:t}}function ir(n,t){return function(r,e,u){u&&xr(r,e,u)&&(e=null);var o=vr(),a=null==e;if(o===gt&&a||(a=!1,e=o(e,u,3)),a){var f=Mo(r);if(f||!Iu(r))return n(f?r:Tr(r));e=i}return hr(r,e,t)}}function or(n,t,r,e,u,i,o,a,f,c){function l(){for(var w=arguments.length,b=w,x=Ci(w);b--;)x[b]=arguments[b];if(e&&(x=Ht(x,e,u)),i&&(x=Qt(x,i,o)),v||y){var A=l.placeholder,R=d(x,A);if(w-=R.length,c>w){var I=a?Hn(a):null,k=vo(c-w,0),T=v?R:null,S=v?null:R,N=v?x:null,U=v?null:x;t|=v?O:C,t&=~(v?C:O),g||(t&=~(j|E));var W=or(n,t,r,N,T,U,S,I,f,k);return W.placeholder=A,W}}var F=p?r:this;return h&&(n=F[m]),a&&(x=kr(x,a)),s&&f<x.length&&(x.length=f),(this instanceof l?_||ur(n):n).apply(F,x)}var s=t&S,p=t&j,h=t&E,v=t&I,g=t&R,y=t&k,_=!h&&ur(n),m=n;return l}function ar(n,t,r){var e=n.length;if(t=+t,e>=t||!po(t))return\"\";var u=t-e;return r=null==r?\" \":r+\"\",fi(r,Hi(u/r.length)).slice(0,u)}function fr(n,t,r,e){function u(){for(var t=-1,a=arguments.length,f=-1,c=e.length,l=Ci(a+c);++f<c;)l[f]=e[f];for(;a--;)l[f++]=arguments[++t];return(this instanceof u?o:n).apply(i?r:this,l)}var i=t&j,o=ur(n);return u}function cr(n,t,r,e,u,i,o,a){var f=t&E;if(!f&&!mu(n))throw new Bi(D);var c=e?e.length:0;if(c||(t&=~(O|C),e=u=null),c-=u?u.length:0,t&C){var l=e,s=u;e=u=null}var p=!f&&No(n),h=[n,t,r,e,u,l,s,i,o,a];if(p&&p!==!0&&(Er(h,p),t=h[1],a=h[9]),h[9]=null==a?f?0:n.length:vo(a-c,0)||0,t==j)var v=rr(h[0],h[2]);else v=t!=O&&t!=(j|O)||h[4].length?or.apply(null,h):fr.apply(null,h);var g=p?To:Uo;return g(v,h)}function lr(n,t,r,e,u,i,o){var a=-1,f=n.length,c=t.length,l=!0;if(f!=c&&!(u&&c>f))return!1;for(;l&&++a<f;){var s=n[a],p=t[a];if(l=x,e&&(l=u?e(p,s,a):e(s,p,a)),\"undefined\"==typeof l)if(u)for(var h=c;h--&&(p=t[h],!(l=s&&s===p||r(s,p,e,u,i,o))););else l=s&&s===p||r(s,p,e,u,i,o)}return!!l}function sr(n,t,r){switch(r){case P:case K:return+n==+t;case V:return n.name==t.name&&n.message==t.message;case J:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case Z:case Q:return n==t+\"\"}return!1}function pr(n,t,r,e,u,i,o){var a=Vo(n),f=a.length,c=Vo(t),l=c.length;if(f!=l&&!u)return!1;for(var s,p=-1;++p<f;){var h=a[p],v=Ki.call(t,h);if(v){var g=n[h],d=t[h];v=x,e&&(v=u?e(d,g,h):e(g,d,h)),\"undefined\"==typeof v&&(v=g&&g===d||r(g,d,e,u,i,o))}if(!v)return!1;s||(s=\"constructor\"==h)}if(!s){var y=n.constructor,_=t.constructor;if(y!=_&&\"constructor\"in n&&\"constructor\"in t&&!(\"function\"==typeof y&&y instanceof y&&\"function\"==typeof _&&_ instanceof _))return!1}return!0}function hr(n,t,r){var e=r?xo:bo,u=e,i=u;return mt(n,function(n,o,a){var f=t(n,o,a);((r?u>f:f>u)||f===e&&f===i)&&(u=f,i=n)}),i}function vr(n,t,r){var e=g.callback||_i;return e=e===_i?gt:e,r?e(n,t,r):e}function gr(n,t,e){var u=g.indexOf||Kr;return u=u===Kr?r:u,n?u(n,t,e):u}function dr(n,t,r){for(var e=-1,u=r?r.length:0;++e<u;){var i=r[e],o=i.size;switch(i.type){case\"drop\":n+=o;break;case\"dropRight\":t-=o;break;case\"take\":t=go(t,n+o);break;case\"takeRight\":n=vo(n,t-o)}}return{start:n,end:t}}function yr(n){var t=n.length,r=new n.constructor(t);return t&&\"string\"==typeof n[0]&&Ki.call(n,\"index\")&&(r.index=n.index,r.input=n.input),r}function _r(n){var t=n.constructor;return\"function\"==typeof t&&t instanceof t||(t=Fi),new t}function mr(n,t,r){var e=n.constructor;switch(t){case tn:return Zt(n);case P:case K:return new e(+n);case rn:case en:case un:case on:case an:case fn:case cn:case ln:case sn:var u=n.buffer;return new e(r?Zt(u):u,n.byteOffset,n.length);case J:case Q:return new e(n);case Z:var i=new e(n.source,An.exec(n));i.lastIndex=n.lastIndex}return i}function wr(n){var t=g.support,r=!(t.funcNames?n.name:t.funcDecomp);if(!r){var e=qi.call(n);t.funcNames||(r=!jn.test(e)),r||(r=Tn.test(e)||Au(n),To(n,r))}return r}function br(n,t){return n=+n,t=null==t?Io:t,n>-1&&n%1==0&&t>n}function xr(n,t,r){if(!wu(r))return!1;var e=typeof t;if(\"number\"==e)var u=r.length,i=Ar(u)&&br(t,u);else i=\"string\"==e&&t in r;return i&&r[t]===n}function Ar(n){return\"number\"==typeof n&&n>-1&&n%1==0&&Io>=n}function jr(n){return n===n&&(0===n?1/n>0:!wu(n))}function Er(n,t){var r=n[1],e=t[1],u=r|e,i=S|T,o=j|E,a=i|o|R|k,f=r&S&&!(e&S),c=r&T&&!(e&T),l=(c?n:t)[7],s=(f?n:t)[8],p=!(r>=T&&e>o||r>o&&e>=T),h=u>=i&&a>=u&&(T>r||(c||f)&&l.length<=s);if(!p&&!h)return n;e&j&&(n[2]=t[2],u|=r&j?0:R);var v=t[3];if(v){var g=n[3];n[3]=g?Ht(g,v,t[4]):Hn(v),n[4]=g?d(n[3],z):Hn(t[4])}return v=t[5],v&&(g=n[5],n[5]=g?Qt(g,v,t[6]):Hn(v),n[6]=g?d(n[5],z):Hn(t[6])),v=t[7],v&&(n[7]=Hn(v)),e&S&&(n[8]=null==n[8]?t[8]:go(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u,n}function Rr(n,t){n=Sr(n);for(var r=-1,e=t.length,u={};++r<e;){var i=t[r];i in n&&(u[i]=n[i])}return u}function Ir(n,t){var r={};return It(n,function(n,e,u){t(n,e,u)&&(r[e]=n)}),r}function kr(n,t){for(var r=n.length,e=go(t.length,r),u=Hn(n);e--;){var i=t[e];n[e]=br(i,r)?u[i]:x}return n}function Or(n){var t;g.support;if(!v(n)||Yi.call(n)!=X||!Ki.call(n,\"constructor\")&&(t=n.constructor,\"function\"==typeof t&&!(t instanceof t)))return!1;var r;return It(n,function(n,t){r=t}),\"undefined\"==typeof r||Ki.call(n,r)}function Cr(n){for(var t=qu(n),r=t.length,e=r&&n.length,u=g.support,i=e&&Ar(e)&&(Mo(n)||u.nonEnumArgs&&pu(n)),o=-1,a=[];++o<r;){var f=t[o];(i&&br(f,e)||Ki.call(n,f))&&a.push(f)}return a}function Tr(n){return null==n?[]:Ar(n.length)?wu(n)?n:Fi(n):Xu(n)}function Sr(n){return wu(n)?n:Fi(n)}function Nr(n,t,r){t=(r?xr(n,t,r):null==t)?1:vo(+t||1,1);for(var e=0,u=n?n.length:0,i=-1,o=Ci(Hi(u/t));u>e;)o[++i]=qt(n,e,e+=t);return o}function Ur(n){for(var t=-1,r=n?n.length:0,e=-1,u=[];++t<r;){var i=n[t];i&&(u[++e]=i)}return u}function Wr(){for(var n=-1,t=arguments.length;++n<t;){var r=arguments[n];if(Mo(r)||pu(r))break}return _t(r,jt(arguments,!1,!0,++n))}function Fr(n,t,r){var e=n?n.length:0;return e?((r?xr(n,t,r):null==t)&&(t=1),qt(n,0>t?0:t)):[]}function Lr(n,t,r){var e=n?n.length:0;return e?((r?xr(n,t,r):null==t)&&(t=1),t=e-(+t||0),qt(n,0,0>t?0:t)):[]}function $r(n,t,r){var e=n?n.length:0;if(!e)return[];for(t=vr(t,r,3);e--&&t(n[e],e,n););return qt(n,0,e+1)}function Br(n,t,r){var e=n?n.length:0;if(!e)return[];var u=-1;for(t=vr(t,r,3);++u<e&&t(n[u],u,n););return qt(n,u)}function Dr(n,t,r){var e=-1,u=n?n.length:0;for(t=vr(t,r,3);++e<u;)if(t(n[e],e,n))return e;return-1}function zr(n,t,r){var e=n?n.length:0;for(t=vr(t,r,3);e--;)if(t(n[e],e,n))return e;return-1}function Mr(n){return n?n[0]:x}function qr(n,t,r){var e=n?n.length:0;return r&&xr(n,t,r)&&(t=!1),e?jt(n,t):[]}function Pr(n){var t=n?n.length:0;return t?jt(n,!0):[]}function Kr(n,t,e){var u=n?n.length:0;if(!u)return-1;if(\"number\"==typeof e)e=0>e?vo(u+e,0):e||0;else if(e){var i=Gt(n,t),o=n[i];return(t===t?t===o:o!==o)?i:-1}return r(n,t,e)}function Vr(n){return Lr(n,1)}function Yr(){for(var n=[],t=-1,e=arguments.length,u=[],i=gr(),o=i==r;++t<e;){var a=arguments[t];(Mo(a)||pu(a))&&(n.push(a),u.push(o&&a.length>=120&&So(t&&a)))}e=n.length;var f=n[0],c=-1,l=f?f.length:0,s=[],p=u[0];n:for(;++c<l;)if(a=f[c],(p?Jn(p,a):i(s,a))<0){for(t=e;--t;){var h=u[t];if((h?Jn(h,a):i(n[t],a))<0)continue n}p&&p.push(a),s.push(a)}return s}function Gr(n){var t=n?n.length:0;return t?n[t-1]:x}function Jr(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(\"number\"==typeof r)u=(0>r?vo(e+r,0):go(r||0,e-1))+1;else if(r){u=Gt(n,t,!0)-1;var i=n[u];return(t===t?t===i:i!==i)?u:-1}if(t!==t)return h(n,u,!0);for(;u--;)if(n[u]===t)return u;return-1}function Xr(){var n=arguments[0];if(!n||!n.length)return n;for(var t=0,r=gr(),e=arguments.length;++t<e;)for(var u=0,i=arguments[t];(u=r(n,i,u))>-1;)oo.call(n,u,1);return n}function Zr(n){return Dt(n||[],jt(arguments,!1,!1,1))}function Hr(n,t,r){var e=-1,u=n?n.length:0,i=[];for(t=vr(t,r,3);++e<u;){var o=n[e];t(o,e,n)&&(i.push(o),oo.call(n,e--,1),u--)}return i}function Qr(n){return Fr(n,1)}function ne(n,t,r){var e=n?n.length:0;return e?(r&&\"number\"!=typeof r&&xr(n,t,r)&&(t=0,r=e),qt(n,t,r)):[]}function te(n,t,r,e){var u=vr(r);return u===gt&&null==r?Gt(n,t):Jt(n,t,u(r,e,1))}function re(n,t,r,e){var u=vr(r);return u===gt&&null==r?Gt(n,t,!0):Jt(n,t,u(r,e,1),!0)}function ee(n,t,r){var e=n?n.length:0;return e?((r?xr(n,t,r):null==t)&&(t=1),qt(n,0,0>t?0:t)):[]}function ue(n,t,r){var e=n?n.length:0;return e?((r?xr(n,t,r):null==t)&&(t=1),t=e-(+t||0),qt(n,0>t?0:t)):[]}function ie(n,t,r){var e=n?n.length:0;if(!e)return[];for(t=vr(t,r,3);e--&&t(n[e],e,n););return qt(n,e+1)}function oe(n,t,r){var e=n?n.length:0;if(!e)return[];var u=-1;for(t=vr(t,r,3);++u<e&&t(n[u],u,n););return qt(n,0,u)}function ae(){return Kt(jt(arguments,!1,!0))}function fe(n,t,e,u){var i=n?n.length:0;if(!i)return[];\"boolean\"!=typeof t&&null!=t&&(u=e,e=xr(n,t,u)?null:t,t=!1);var o=vr();return(o!==gt||null!=e)&&(e=o(e,u,3)),t&&gr()==r?y(n,e):Kt(n,e)}function ce(n){for(var t=-1,r=(n&&n.length&&ut(et(n,Pi)))>>>0,e=Ci(r);++t<r;)e[t]=et(n,Bt(t));return e}function le(n){return _t(n,qt(arguments,1))}function se(){for(var n=-1,t=arguments.length;++n<t;){var r=arguments[n];if(Mo(r)||pu(r))var e=e?_t(e,r).concat(_t(r,e)):r}return e?Kt(e):[]}function pe(){for(var n=arguments.length,t=Ci(n);n--;)t[n]=arguments[n];return ce(t)}function he(n,t){var r=-1,e=n?n.length:0,u={};for(!e||t||Mo(n[0])||(t=[]);++r<e;){var i=n[r];t?u[i]=t[r]:i&&(u[i[0]]=i[1])}return u}function ve(n){var t=g(n);return t.__chain__=!0,t}function ge(n,t,r){return t.call(r,n),n}function de(n,t,r){return t.call(r,n)}function ye(){return ve(this)}function _e(){var n=this.__wrapped__;return n instanceof H?(this.__actions__.length&&(n=new H(this)),new G(n.reverse())):this.thru(function(n){return n.reverse()})}function me(){return this.value()+\"\"}function we(){return Yt(this.__wrapped__,this.__actions__)}function be(n){var t=n?n.length:0;return Ar(t)&&(n=Tr(n)),pt(n,jt(arguments,!1,!1,1))}function xe(n,t,r){var e=n?n.length:0;return Ar(e)||(n=Xu(n),e=n.length),e?(r=\"number\"==typeof r?0>r?vo(e+r,0):r||0:0,\"string\"==typeof n||!Mo(n)&&Iu(n)?e>r&&n.indexOf(t,r)>-1:gr(n,t,r)>-1):!1}function Ae(n,t,r){var e=Mo(n)?tt:bt;return(\"function\"!=typeof t||\"undefined\"!=typeof r)&&(t=vr(t,r,3)),e(n,t)}function je(n,t,r){var e=Mo(n)?rt:xt;return t=vr(t,r,3),e(n,t)}function Ee(n,t,r){if(Mo(n)){var e=Dr(n,t,r);return e>-1?n[e]:x}return t=vr(t,r,3),At(n,t,mt)}function Re(n,t,r){return t=vr(t,r,3),At(n,t,wt)}function Ie(n,t){return Ee(n,Ft(t))}function ke(n,t,r){return\"function\"==typeof t&&\"undefined\"==typeof r&&Mo(n)?Qn(n,t):mt(n,Xt(t,r,3))}function Oe(n,t,r){return\"function\"==typeof t&&\"undefined\"==typeof r&&Mo(n)?nt(n,t):wt(n,Xt(t,r,3))}function Ce(n,t){return Tt(n,t,qt(arguments,2))}function Te(n,t,r){var e=Mo(n)?et:Wt;return t=vr(t,r,3),e(n,t)}function Se(n,t){return Te(n,Bt(t+\"\"))}function Ne(n,t,r,e){var u=Mo(n)?ot:Mt;return u(n,vr(t,e,4),r,arguments.length<3,mt)}function Ue(n,t,r,e){var u=Mo(n)?at:Mt;return u(n,vr(t,e,4),r,arguments.length<3,wt)}function We(n,t,r){var e=Mo(n)?rt:xt;return t=vr(t,r,3),e(n,function(n,r,e){return!t(n,r,e)})}function Fe(n,t,r){if(r?xr(n,t,r):null==t){n=Tr(n);var e=n.length;return e>0?n[zt(0,e-1)]:x}var u=Le(n);return u.length=go(0>t?0:+t||0,u.length),u}function Le(n){n=Tr(n);for(var t=-1,r=n.length,e=Ci(r);++t<r;){var u=zt(0,t);t!=u&&(e[t]=e[u]),e[u]=n[t]}return e}function $e(n){var t=n?n.length:0;return Ar(t)?t:Vo(n).length}function Be(n,t,r){var e=Mo(n)?ft:Pt;return(\"function\"!=typeof t||\"undefined\"!=typeof r)&&(t=vr(t,r,3)),e(n,t)}function De(n,t,r){var u=-1,i=n?n.length:0,o=Ar(i)?Ci(i):[];return r&&xr(n,t,r)&&(t=null),t=vr(t,r,3),mt(n,function(n,r,e){o[++u]={criteria:t(n,r,e),index:u,value:n}}),e(o,f)}function ze(n){var t=arguments;t.length>3&&xr(t[1],t[2],t[3])&&(t=[n,t[1]]);var r=-1,u=n?n.length:0,i=jt(t,!1,!1,1),o=Ar(u)?Ci(u):[];return mt(n,function(n,t,e){for(var u=i.length,a=Ci(u);u--;)a[u]=null==n?x:n[i[u]];o[++r]={criteria:a,index:r,value:n}}),e(o,c)}function Me(n,t){return je(n,Ft(t))}function qe(n,t){if(!mu(t)){if(!mu(n))throw new Bi(D);var r=n;n=t,t=r}return n=po(n=+n)?n:0,function(){return--n<1?t.apply(this,arguments):void 0}}function Pe(n,t,r){return r&&xr(n,t,r)&&(t=null),t=n&&null==t?n.length:vo(+t||0,0),cr(n,S,null,null,null,null,t)}function Ke(n,t){var r;if(!mu(t)){if(!mu(n))throw new Bi(D);var e=n;n=t,t=e}return function(){return--n>0?r=t.apply(this,arguments):t=null,r}}function Ve(n,t){var r=j;if(arguments.length>2){var e=qt(arguments,2),u=d(e,Ve.placeholder);r|=O}return cr(n,r,t,e,u)}function Ye(n){return vt(n,arguments.length>1?jt(arguments,!1,!1,1):Du(n))}function Ge(n,t){var r=j|E;if(arguments.length>2){var e=qt(arguments,2),u=d(e,Ge.placeholder);r|=O}return cr(t,r,n,e,u)}function Je(n,t,r){r&&xr(n,t,r)&&(t=null);var e=cr(n,I,null,null,null,null,null,t);return e.placeholder=Je.placeholder,e}function Xe(n,t,r){r&&xr(n,t,r)&&(t=null);var e=cr(n,k,null,null,null,null,null,t);return e.placeholder=Xe.placeholder,e}function Ze(n,t,r){function e(){p&&Qi(p),f&&Qi(f),f=p=h=x}function u(){var r=t-(zo()-l);if(0>=r||r>t){f&&Qi(f);var e=h;f=p=h=x,e&&(v=zo(),c=n.apply(s,a),p||f||(a=s=null))}else p=io(u,r)}function i(){p&&Qi(p),f=p=h=x,(d||g!==t)&&(v=zo(),c=n.apply(s,a),p||f||(a=s=null))}function o(){if(a=arguments,l=zo(),s=this,h=d&&(p||!y),g===!1)var r=y&&!p;else{f||y||(v=l);var e=g-(l-v),o=0>=e||e>g;o?(f&&(f=Qi(f)),v=l,c=n.apply(s,a)):f||(f=io(i,e))}return o&&p?p=Qi(p):p||t===g||(p=io(u,t)),r&&(o=!0,c=n.apply(s,a)),!o||p||f||(a=s=null),c}var a,f,c,l,s,p,h,v=0,g=!1,d=!0;if(!mu(n))throw new Bi(D);if(t=0>t?0:t,r===!0){var y=!0;d=!1}else wu(r)&&(y=r.leading,g=\"maxWait\"in r&&vo(+r.maxWait||0,t),d=\"trailing\"in r?r.trailing:d);return o.cancel=e,o}function He(n){return yt(n,1,arguments,1)}function Qe(n,t){return yt(n,t,arguments,2)}function nu(){var n=arguments,t=n.length;if(!t)return function(){};if(!tt(n,mu))throw new Bi(D);return function(){for(var r=0,e=n[r].apply(this,arguments);++r<t;)e=n[r].call(this,e);return e}}function tu(){var n=arguments,t=n.length-1;if(0>t)return function(){};if(!tt(n,mu))throw new Bi(D);return function(){for(var r=t,e=n[r].apply(this,arguments);r--;)e=n[r].call(this,e);return e}}function ru(n,t){if(!mu(n)||t&&!mu(t))throw new Bi(D);var r=function(){var e=r.cache,u=t?t.apply(this,arguments):arguments[0];if(e.has(u))return e.get(u);var i=n.apply(this,arguments);return e.set(u,i),i};return r.cache=new ru.Cache,r}function eu(n){if(!mu(n))throw new Bi(D);return function(){return!n.apply(this,arguments)}}function uu(n){return Ke(n,2)}function iu(n){var t=qt(arguments,1),r=d(t,iu.placeholder);return cr(n,O,null,t,r)}function ou(n){var t=qt(arguments,1),r=d(t,ou.placeholder);return cr(n,C,null,t,r)}function au(n){var t=jt(arguments,!1,!1,1);return cr(n,T,null,null,null,t)}function fu(n,t,r){var e=!0,u=!0;if(!mu(n))throw new Bi(D);return r===!1?e=!1:wu(r)&&(e=\"leading\"in r?!!r.leading:e,u=\"trailing\"in r?!!r.trailing:u),Bn.leading=e,Bn.maxWait=+t,Bn.trailing=u,Ze(n,t,Bn)}function cu(n,t){return t=null==t?wi:t,cr(t,O,null,[n],[])}function lu(n,t,r,e){return\"boolean\"!=typeof t&&null!=t&&(e=r,r=xr(n,t,e)?null:t,t=!1),r=\"function\"==typeof r&&Xt(r,e,1),dt(n,t,r)}function su(n,t,r){return t=\"function\"==typeof t&&Xt(t,r,1),dt(n,!0,t)}function pu(n){var t=v(n)?n.length:x;return Ar(t)&&Yi.call(n)==M||!1}function hu(n){return n===!0||n===!1||v(n)&&Yi.call(n)==P||!1}function vu(n){return v(n)&&Yi.call(n)==K||!1}function gu(n){return n&&1===n.nodeType&&v(n)&&Yi.call(n).indexOf(\"Element\")>-1||!1}function du(n){if(null==n)return!0;var t=n.length;return Ar(t)&&(Mo(n)||Iu(n)||pu(n)||v(n)&&mu(n.splice))?!t:!Vo(n).length}function yu(n,t,r,e){if(r=\"function\"==typeof r&&Xt(r,e,3),!r&&jr(n)&&jr(t))return n===t;var u=r?r(n,t):x;return\"undefined\"==typeof u?St(n,t,r):!!u}function _u(n){return v(n)&&\"string\"==typeof n.message&&Yi.call(n)==V||!1}function mu(n){return\"function\"==typeof n||!1}function wu(n){var t=typeof n;return\"function\"==t||n&&\"object\"==t||!1}function bu(n,t,r,e){var u=Vo(t),i=u.length;if(r=\"function\"==typeof r&&Xt(r,e,3),!r&&1==i){var o=u[0],a=t[o];if(jr(a))return null!=n&&a===n[o]&&Ki.call(n,o)}for(var f=Ci(i),c=Ci(i);i--;)a=f[i]=t[u[i]],c[i]=jr(a);return Ut(n,u,f,c,r)}function xu(n){return Eu(n)&&n!=+n}function Au(n){return null==n?!1:Yi.call(n)==Y?Ji.test(qi.call(n)):v(n)&&Rn.test(n)||!1}function ju(n){return null===n}function Eu(n){return\"number\"==typeof n||v(n)&&Yi.call(n)==J||!1}function Ru(n){return v(n)&&Yi.call(n)==Z||!1}function Iu(n){return\"string\"==typeof n||v(n)&&Yi.call(n)==Q||!1}function ku(n){return v(n)&&Ar(n.length)&&Ln[Yi.call(n)]||!1}function Ou(n){return\"undefined\"==typeof n}function Cu(n){var t=n?n.length:0;return Ar(t)?t?Hn(n):[]:Xu(n)}function Tu(n){return ht(n,qu(n))}function Su(n,t,r){var e=Co(n);return r&&xr(n,t,r)&&(t=null),t?ht(t,e,Vo(t)):e}function Nu(n){if(null==n)return n;var t=Hn(arguments);return t.push(ct),Ko.apply(x,t)}function Uu(n,t,r){return t=vr(t,r,3),At(n,t,kt,!0)}function Wu(n,t,r){return t=vr(t,r,3),At(n,t,Ot,!0)}function Fu(n,t,r){return(\"function\"!=typeof t||\"undefined\"!=typeof r)&&(t=Xt(t,r,3)),Et(n,t,qu)}function Lu(n,t,r){return t=Xt(t,r,3),Rt(n,t,qu)}function $u(n,t,r){return(\"function\"!=typeof t||\"undefined\"!=typeof r)&&(t=Xt(t,r,3)),kt(n,t)}function Bu(n,t,r){return t=Xt(t,r,3),Rt(n,t,Vo)}function Du(n){return Ct(n,qu(n))}function zu(n,t){return n?Ki.call(n,t):!1}function Mu(n,t,r){r&&xr(n,t,r)&&(t=null);for(var e=-1,u=Vo(n),i=u.length,o={};++e<i;){var a=u[e],f=n[a];t?Ki.call(o,f)?o[f].push(a):o[f]=[a]:o[f]=a}return o}function qu(n){if(null==n)return[];wu(n)||(n=Fi(n));var t=n.length;t=t&&Ar(t)&&(Mo(n)||Oo.nonEnumArgs&&pu(n))&&t||0;for(var r=n.constructor,e=-1,u=\"function\"==typeof r&&r.prototype==n,i=Ci(t),o=t>0;++e<t;)i[e]=e+\"\";for(var a in n)o&&br(a,t)||\"constructor\"==a&&(u||!Ki.call(n,a))||i.push(a);return i}function Pu(n,t,r){var e={};return t=vr(t,r,3),kt(n,function(n,r,u){e[r]=t(n,r,u)}),e}function Ku(n,t,r){if(null==n)return{};if(\"function\"!=typeof t){var e=et(jt(arguments,!1,!1,1),$i);return Rr(n,_t(qu(n),e))}return t=Xt(t,r,3),Ir(n,function(n,r,e){return!t(n,r,e)})}function Vu(n){for(var t=-1,r=Vo(n),e=r.length,u=Ci(e);++t<e;){var i=r[t];u[t]=[i,n[i]]}return u}function Yu(n,t,r){return null==n?{}:\"function\"==typeof t?Ir(n,Xt(t,r,3)):Rr(n,jt(arguments,!1,!1,1))}function Gu(n,t,r){var e=null==n?x:n[t];return\"undefined\"==typeof e&&(e=r),mu(e)?e.call(n):e}function Ju(n,t,r,e){var u=Mo(n)||ku(n);if(t=vr(t,e,4),null==r)if(u||wu(n)){var i=n.constructor;r=u?Mo(n)?new i:[]:Co(\"function\"==typeof i&&i.prototype)}else r={};return(u?Qn:kt)(n,function(n,e,u){return t(r,n,e,u)}),r}function Xu(n){return Vt(n,Vo(n))}function Zu(n){return Vt(n,qu(n))}function Hu(n,t,r){r&&xr(n,t,r)&&(t=r=null);var e=null==n,u=null==t;if(null==r&&(u&&\"boolean\"==typeof n?(r=n,n=1):\"boolean\"==typeof t&&(r=t,u=!0)),e&&u&&(t=1,u=!1),n=+n||0,u?(t=n,n=0):t=+t||0,r||n%1||t%1){var i=wo();return go(n+i*(t-n+parseFloat(\"1e-\"+((i+\"\").length-1))),t)}return zt(n,t)}function Qu(n){return n=u(n),n&&n.charAt(0).toUpperCase()+n.slice(1)}function ni(n){return n=u(n),n&&n.replace(In,l)}function ti(n,t,r){n=u(n),t+=\"\";var e=n.length;return r=(\"undefined\"==typeof r?e:go(0>r?0:+r||0,e))-t.length,r>=0&&n.indexOf(t,r)==r}function ri(n){return n=u(n),n&&_n.test(n)?n.replace(dn,s):n}function ei(n){return n=u(n),n&&Cn.test(n)?n.replace(On,\"\\\\$&\"):n}function ui(n,t,r){n=u(n),t=+t;var e=n.length;if(e>=t||!po(t))return n;var i=(t-e)/2,o=no(i),a=Hi(i);return r=ar(\"\",a,r),r.slice(0,o)+n+r}function ii(n,t,r){return n=u(n),n&&ar(n,t,r)+n}function oi(n,t,r){return n=u(n),n&&n+ar(n,t,r)}function ai(n,t,r){return r&&xr(n,t,r)&&(t=0),mo(n,t)}function fi(n,t){var r=\"\";if(n=u(n),t=+t,1>t||!n||!po(t))return r;do t%2&&(r+=n),t=no(t/2),n+=n;while(t);return r}function ci(n,t,r){return n=u(n),r=null==r?0:go(0>r?0:+r||0,n.length),n.lastIndexOf(t,r)==r}function li(n,t,r){var e=g.templateSettings;r&&xr(n,t,r)&&(t=r=null),n=u(n),t=st(st({},r||t),e,lt);var i,o,a=st(st({},t.imports),e.imports,lt),f=Vo(a),c=Vt(a,f),l=0,s=t.interpolate||kn,h=\"__p += '\",v=Li((t.escape||kn).source+\"|\"+s.source+\"|\"+(s===bn?xn:kn).source+\"|\"+(t.evaluate||kn).source+\"|$\",\"g\"),d=\"//# sourceURL=\"+(\"sourceURL\"in t?t.sourceURL:\"lodash.templateSources[\"+ ++Fn+\"]\")+\"\\n\";n.replace(v,function(t,r,e,u,a,f){return e||(e=u),h+=n.slice(l,f).replace(Sn,p),\nr&&(i=!0,h+=\"' +\\n__e(\"+r+\") +\\n'\"),a&&(o=!0,h+=\"';\\n\"+a+\";\\n__p += '\"),e&&(h+=\"' +\\n((__t = (\"+e+\")) == null ? '' : __t) +\\n'\"),l=f+t.length,t}),h+=\"';\\n\";var y=t.variable;y||(h=\"with (obj) {\\n\"+h+\"\\n}\\n\"),h=(o?h.replace(pn,\"\"):h).replace(hn,\"$1\").replace(vn,\"$1;\"),h=\"function(\"+(y||\"obj\")+\") {\\n\"+(y?\"\":\"obj || (obj = {});\\n\")+\"var __t, __p = ''\"+(i?\", __e = _.escape\":\"\")+(o?\", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\":\";\\n\")+h+\"return __p\\n}\";var _=yi(function(){return Ni(f,d+\"return \"+h).apply(x,c)});if(_.source=h,_u(_))throw _;return _}function si(n,t,r){var e=n;return(n=u(n))?(r?xr(e,t,r):null==t)?n.slice(_(n),m(n)+1):(t+=\"\",n.slice(o(n,t),a(n,t)+1)):n}function pi(n,t,r){var e=n;return n=u(n),n?(r?xr(e,t,r):null==t)?n.slice(_(n)):n.slice(o(n,t+\"\")):n}function hi(n,t,r){var e=n;return n=u(n),n?(r?xr(e,t,r):null==t)?n.slice(0,m(n)+1):n.slice(0,a(n,t+\"\")+1):n}function vi(n,t,r){r&&xr(n,t,r)&&(t=null);var e=N,i=U;if(null!=t)if(wu(t)){var o=\"separator\"in t?t.separator:o;e=\"length\"in t?+t.length||0:e,i=\"omission\"in t?u(t.omission):i}else e=+t||0;if(n=u(n),e>=n.length)return n;var a=e-i.length;if(1>a)return i;var f=n.slice(0,a);if(null==o)return f+i;if(Ru(o)){if(n.slice(a).search(o)){var c,l,s=n.slice(0,a);for(o.global||(o=Li(o.source,(An.exec(o)||\"\")+\"g\")),o.lastIndex=0;c=o.exec(s);)l=c.index;f=f.slice(0,null==l?a:l)}}else if(n.indexOf(o,a)!=a){var p=f.lastIndexOf(o);p>-1&&(f=f.slice(0,p))}return f+i}function gi(n){return n=u(n),n&&yn.test(n)?n.replace(gn,w):n}function di(n,t,r){return r&&xr(n,t,r)&&(t=null),n=u(n),n.match(t||Nn)||[]}function yi(n){try{return n()}catch(t){return _u(t)?t:Si(t)}}function _i(n,t,r){return r&&xr(n,t,r)&&(t=null),v(n)?bi(n):gt(n,t)}function mi(n){return function(){return n}}function wi(n){return n}function bi(n){return Ft(dt(n,!0))}function xi(n,t,r){if(null==r){var e=wu(t),u=e&&Vo(t),i=u&&u.length&&Ct(t,u);(i?i.length:e)||(i=!1,r=t,t=n,n=this)}i||(i=Ct(t,Vo(t)));var o=!0,a=-1,f=mu(n),c=i.length;r===!1?o=!1:wu(r)&&\"chain\"in r&&(o=r.chain);for(;++a<c;){var l=i[a],s=t[l];n[l]=s,f&&(n.prototype[l]=function(t){return function(){var r=this.__chain__;if(o||r){var e=n(this.__wrapped__);return(e.__actions__=Hn(this.__actions__)).push({func:t,args:arguments,thisArg:n}),e.__chain__=r,e}var u=[this.value()];return ro.apply(u,arguments),t.apply(n,u)}}(s))}return n}function Ai(){return n._=Gi,this}function ji(){}function Ei(n){return Bt(n+\"\")}function Ri(n){return function(t){return null==n?x:n[t]}}function Ii(n,t,r){r&&xr(n,t,r)&&(t=r=null),n=+n||0,r=null==r?1:+r||0,null==t?(t=n,n=0):t=+t||0;for(var e=-1,u=vo(Hi((t-n)/(r||1)),0),i=Ci(u);++e<u;)i[e]=n,n+=r;return i}function ki(n,t,r){if(n=+n,1>n||!po(n))return[];var e=-1,u=Ci(go(n,Ao));for(t=Xt(t,r,1);++e<n;)Ao>e?u[e]=t(e):t(e);return u}function Oi(n){var t=++Vi;return u(n)+t}n=n?Xn.defaults(Kn.Object(),n,Xn.pick(Kn,Wn)):Kn;var Ci=n.Array,Ti=n.Date,Si=n.Error,Ni=n.Function,Ui=n.Math,Wi=n.Number,Fi=n.Object,Li=n.RegExp,$i=n.String,Bi=n.TypeError,Di=Ci.prototype,zi=Fi.prototype,Mi=(Mi=n.window)&&Mi.document,qi=Ni.prototype.toString,Pi=Bt(\"length\"),Ki=zi.hasOwnProperty,Vi=0,Yi=zi.toString,Gi=n._,Ji=Li(\"^\"+ei(Yi).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),Xi=Au(Xi=n.ArrayBuffer)&&Xi,Zi=Au(Zi=Xi&&new Xi(0).slice)&&Zi,Hi=Ui.ceil,Qi=n.clearTimeout,no=Ui.floor,to=Au(to=Fi.getPrototypeOf)&&to,ro=Di.push,eo=zi.propertyIsEnumerable,uo=Au(uo=n.Set)&&uo,io=n.setTimeout,oo=Di.splice,ao=Au(ao=n.Uint8Array)&&ao,fo=(Di.unshift,Au(fo=n.WeakMap)&&fo),co=function(){try{var t=Au(t=n.Float64Array)&&t,r=new t(new Xi(10),0,1)&&t}catch(e){}return r}(),lo=Au(lo=Ci.isArray)&&lo,so=Au(so=Fi.create)&&so,po=n.isFinite,ho=Au(ho=Fi.keys)&&ho,vo=Ui.max,go=Ui.min,yo=Au(yo=Ti.now)&&yo,_o=Au(_o=Wi.isFinite)&&_o,mo=n.parseInt,wo=Ui.random,bo=Wi.NEGATIVE_INFINITY,xo=Wi.POSITIVE_INFINITY,Ao=Ui.pow(2,32)-1,jo=Ao-1,Eo=Ao>>>1,Ro=co?co.BYTES_PER_ELEMENT:0,Io=Ui.pow(2,53)-1,ko=fo&&new fo,Oo=g.support={};!function(t){Oo.funcDecomp=!Au(n.WinRTError)&&Tn.test(b),Oo.funcNames=\"string\"==typeof Ni.name;try{Oo.dom=11===Mi.createDocumentFragment().nodeType}catch(r){Oo.dom=!1}try{Oo.nonEnumArgs=!eo.call(arguments,1)}catch(r){Oo.nonEnumArgs=!0}}(0,0),g.templateSettings={escape:mn,evaluate:wn,interpolate:bn,variable:\"\",imports:{_:g}};var Co=function(){function t(){}return function(r){if(wu(r)){t.prototype=r;var e=new t;t.prototype=null}return e||n.Object()}}(),To=ko?function(n,t){return ko.set(n,t),n}:wi;Zi||(Zt=Xi&&ao?function(n){var t=n.byteLength,r=co?no(t/Ro):0,e=r*Ro,u=new Xi(t);if(r){var i=new co(u,0,r);i.set(new co(n,0,r))}return t!=e&&(i=new ao(u,e),i.set(new ao(n,e))),u}:mi(null));var So=so&&uo?function(n){return new Gn(n)}:mi(null),No=ko?function(n){return ko.get(n)}:ji,Uo=function(){var n=0,t=0;return function(r,e){var u=zo(),i=F-(u-t);if(t=u,i>0){if(++n>=W)return r}else n=0;return To(r,e)}}(),Wo=nr(function(n,t,r){Ki.call(n,r)?++n[r]:n[r]=1}),Fo=nr(function(n,t,r){Ki.call(n,r)?n[r].push(t):n[r]=[t]}),Lo=nr(function(n,t,r){n[r]=t}),$o=ir(ut),Bo=ir(it,!0),Do=nr(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),zo=yo||function(){return(new Ti).getTime()},Mo=lo||function(n){return v(n)&&Ar(n.length)&&Yi.call(n)==q||!1};Oo.dom||(gu=function(n){return n&&1===n.nodeType&&v(n)&&!Po(n)||!1});var qo=_o||function(n){return\"number\"==typeof n&&po(n)};(mu(/x/)||ao&&!mu(ao))&&(mu=function(n){return Yi.call(n)==Y});var Po=to?function(n){if(!n||Yi.call(n)!=X)return!1;var t=n.valueOf,r=Au(t)&&(r=to(t))&&to(r);return r?n==r||to(n)==r:Or(n)}:Or,Ko=tr(st),Vo=ho?function(n){if(n)var t=n.constructor,r=n.length;return\"function\"==typeof t&&t.prototype===n||\"function\"!=typeof n&&r&&Ar(r)?Cr(n):wu(n)?ho(n):[]}:Cr,Yo=tr(Lt),Go=er(function(n,t,r){return t=t.toLowerCase(),n+(r?t.charAt(0).toUpperCase()+t.slice(1):t)}),Jo=er(function(n,t,r){return n+(r?\"-\":\"\")+t.toLowerCase()});8!=mo(Un+\"08\")&&(ai=function(n,t,r){return(r?xr(n,t,r):null==t)?t=0:t&&(t=+t),n=si(n),mo(n,t||(En.test(n)?16:10))});var Xo=er(function(n,t,r){return n+(r?\"_\":\"\")+t.toLowerCase()}),Zo=er(function(n,t,r){return n+(r?\" \":\"\")+(t.charAt(0).toUpperCase()+t.slice(1))});return G.prototype=g.prototype,Mn.prototype[\"delete\"]=qn,Mn.prototype.get=Pn,Mn.prototype.has=Vn,Mn.prototype.set=Yn,Gn.prototype.push=Zn,ru.Cache=Mn,g.after=qe,g.ary=Pe,g.assign=Ko,g.at=be,g.before=Ke,g.bind=Ve,g.bindAll=Ye,g.bindKey=Ge,g.callback=_i,g.chain=ve,g.chunk=Nr,g.compact=Ur,g.constant=mi,g.countBy=Wo,g.create=Su,g.curry=Je,g.curryRight=Xe,g.debounce=Ze,g.defaults=Nu,g.defer=He,g.delay=Qe,g.difference=Wr,g.drop=Fr,g.dropRight=Lr,g.dropRightWhile=$r,g.dropWhile=Br,g.filter=je,g.flatten=qr,g.flattenDeep=Pr,g.flow=nu,g.flowRight=tu,g.forEach=ke,g.forEachRight=Oe,g.forIn=Fu,g.forInRight=Lu,g.forOwn=$u,g.forOwnRight=Bu,g.functions=Du,g.groupBy=Fo,g.indexBy=Lo,g.initial=Vr,g.intersection=Yr,g.invert=Mu,g.invoke=Ce,g.keys=Vo,g.keysIn=qu,g.map=Te,g.mapValues=Pu,g.matches=bi,g.memoize=ru,g.merge=Yo,g.mixin=xi,g.negate=eu,g.omit=Ku,g.once=uu,g.pairs=Vu,g.partial=iu,g.partialRight=ou,g.partition=Do,g.pick=Yu,g.pluck=Se,g.property=Ei,g.propertyOf=Ri,g.pull=Xr,g.pullAt=Zr,g.range=Ii,g.rearg=au,g.reject=We,g.remove=Hr,g.rest=Qr,g.shuffle=Le,g.slice=ne,g.sortBy=De,g.sortByAll=ze,g.take=ee,g.takeRight=ue,g.takeRightWhile=ie,g.takeWhile=oe,g.tap=ge,g.throttle=fu,g.thru=de,g.times=ki,g.toArray=Cu,g.toPlainObject=Tu,g.transform=Ju,g.union=ae,g.uniq=fe,g.unzip=ce,g.values=Xu,g.valuesIn=Zu,g.where=Me,g.without=le,g.wrap=cu,g.xor=se,g.zip=pe,g.zipObject=he,g.backflow=tu,g.collect=Te,g.compose=tu,g.each=ke,g.eachRight=Oe,g.extend=Ko,g.iteratee=_i,g.methods=Du,g.object=he,g.select=je,g.tail=Qr,g.unique=fe,xi(g,g),g.attempt=yi,g.camelCase=Go,g.capitalize=Qu,g.clone=lu,g.cloneDeep=su,g.deburr=ni,g.endsWith=ti,g.escape=ri,g.escapeRegExp=ei,g.every=Ae,g.find=Ee,g.findIndex=Dr,g.findKey=Uu,g.findLast=Re,g.findLastIndex=zr,g.findLastKey=Wu,g.findWhere=Ie,g.first=Mr,g.has=zu,g.identity=wi,g.includes=xe,g.indexOf=Kr,g.isArguments=pu,g.isArray=Mo,g.isBoolean=hu,g.isDate=vu,g.isElement=gu,g.isEmpty=du,g.isEqual=yu,g.isError=_u,g.isFinite=qo,g.isFunction=mu,g.isMatch=bu,g.isNaN=xu,g.isNative=Au,g.isNull=ju,g.isNumber=Eu,g.isObject=wu,g.isPlainObject=Po,g.isRegExp=Ru,g.isString=Iu,g.isTypedArray=ku,g.isUndefined=Ou,g.kebabCase=Jo,g.last=Gr,g.lastIndexOf=Jr,g.max=$o,g.min=Bo,g.noConflict=Ai,g.noop=ji,g.now=zo,g.pad=ui,g.padLeft=ii,g.padRight=oi,g.parseInt=ai,g.random=Hu,g.reduce=Ne,g.reduceRight=Ue,g.repeat=fi,g.result=Gu,g.runInContext=b,g.size=$e,g.snakeCase=Xo,g.some=Be,g.sortedIndex=te,g.sortedLastIndex=re,g.startCase=Zo,g.startsWith=ci,g.template=li,g.trim=si,g.trimLeft=pi,g.trimRight=hi,g.trunc=vi,g.unescape=gi,g.uniqueId=Oi,g.words=di,g.all=Ae,g.any=Be,g.contains=xe,g.detect=Ee,g.foldl=Ne,g.foldr=Ue,g.head=Mr,g.include=xe,g.inject=Ne,xi(g,function(){var n={};return kt(g,function(t,r){g.prototype[r]||(n[r]=t)}),n}(),!1),g.sample=Fe,g.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return Fe(t,n)}):Fe(this.value())},g.VERSION=A,Qn([\"bind\",\"bindKey\",\"curry\",\"curryRight\",\"partial\",\"partialRight\"],function(n){g[n].placeholder=g}),Qn([\"filter\",\"map\",\"takeWhile\"],function(n,t){var r=t==L;H.prototype[n]=function(n,e){var u=this.clone(),i=u.filtered,o=u.iteratees||(u.iteratees=[]);return u.filtered=i||r||t==B&&u.dir<0,o.push({iteratee:vr(n,e,3),type:t}),u}}),Qn([\"drop\",\"take\"],function(n,t){var r=n+\"Count\",e=n+\"While\";H.prototype[n]=function(e){e=null==e?1:vo(+e||0,0);var u=this.clone();if(u.filtered){var i=u[r];u[r]=t?go(i,e):i+e}else{var o=u.views||(u.views=[]);o.push({size:e,type:n+(u.dir<0?\"Right\":\"\")})}return u},H.prototype[n+\"Right\"]=function(t){return this.reverse()[n](t).reverse()},H.prototype[n+\"RightWhile\"]=function(n,t){return this.reverse()[e](n,t).reverse()}}),Qn([\"first\",\"last\"],function(n,t){var r=\"take\"+(t?\"Right\":\"\");H.prototype[n]=function(){return this[r](1).value()[0]}}),Qn([\"initial\",\"rest\"],function(n,t){var r=\"drop\"+(t?\"\":\"Right\");H.prototype[n]=function(){return this[r](1)}}),Qn([\"pluck\",\"where\"],function(n,t){var r=t?\"filter\":\"map\",e=t?Ft:Bt;H.prototype[n]=function(n){return this[r](e(t?n:n+\"\"))}}),H.prototype.dropWhile=function(n,t){var r,e,u=this.dir<0;return n=vr(n,t,3),this.filter(function(t,i,o){return r=r&&(u?e>i:i>e),e=i,r||(r=!n(t,i,o))})},H.prototype.reject=function(n,t){return n=vr(n,t,3),this.filter(function(t,r,e){return!n(t,r,e)})},H.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=0>n?this.takeRight(-n):this.drop(n);return\"undefined\"!=typeof t&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},kt(H.prototype,function(n,t){var r=g[t],e=/^(?:first|last)$/.test(t);g.prototype[t]=function(){var t=this.__wrapped__,u=arguments,i=this.__chain__,o=!!this.__actions__.length,a=t instanceof H,f=a&&!o;if(e&&!i)return f?n.call(t):r.call(g,this.value());var c=function(n){var t=[n];return ro.apply(t,u),r.apply(g,t)};if(a||Mo(t)){var l=f?t:new H(this),s=n.apply(l,u);if(!e&&(o||s.actions)){var p=s.actions||(s.actions=[]);p.push({func:de,args:[c],thisArg:g})}return new G(s,i)}return this.thru(c)}}),Qn([\"concat\",\"join\",\"pop\",\"push\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=Di[n],r=/^(?:push|sort|unshift)$/.test(n)?\"tap\":\"thru\",e=/^(?:join|pop|shift)$/.test(n);g.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),H.prototype.clone=nn,H.prototype.reverse=Dn,H.prototype.value=zn,g.prototype.chain=ye,g.prototype.reverse=_e,g.prototype.toString=me,g.prototype.toJSON=g.prototype.valueOf=g.prototype.value=we,g.prototype.collect=g.prototype.map,g.prototype.head=g.prototype.first,g.prototype.select=g.prototype.filter,g.prototype.tail=g.prototype.rest,g}var x,A=\"3.1.0\",j=1,E=2,R=4,I=8,k=16,O=32,C=64,T=128,S=256,N=30,U=\"...\",W=150,F=16,L=0,$=1,B=2,D=\"Expected a function\",z=\"__lodash_placeholder__\",M=\"[object Arguments]\",q=\"[object Array]\",P=\"[object Boolean]\",K=\"[object Date]\",V=\"[object Error]\",Y=\"[object Function]\",G=\"[object Map]\",J=\"[object Number]\",X=\"[object Object]\",Z=\"[object RegExp]\",H=\"[object Set]\",Q=\"[object String]\",nn=\"[object WeakMap]\",tn=\"[object ArrayBuffer]\",rn=\"[object Float32Array]\",en=\"[object Float64Array]\",un=\"[object Int8Array]\",on=\"[object Int16Array]\",an=\"[object Int32Array]\",fn=\"[object Uint8Array]\",cn=\"[object Uint8ClampedArray]\",ln=\"[object Uint16Array]\",sn=\"[object Uint32Array]\",pn=/\\b__p \\+= '';/g,hn=/\\b(__p \\+=) '' \\+/g,vn=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,gn=/&(?:amp|lt|gt|quot|#39|#96);/g,dn=/[&<>\"'` + \"`\" + `]/g,yn=RegExp(gn.source),_n=RegExp(dn.source),mn=/<%-([\\s\\S]+?)%>/g,wn=/<%([\\s\\S]+?)%>/g,bn=/<%=([\\s\\S]+?)%>/g,xn=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,An=/\\w*$/,jn=/^\\s*function[ \\n\\r\\t]+\\w/,En=/^0[xX]/,Rn=/^\\[object .+?Constructor\\]$/,In=/[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g,kn=/($^)/,On=/[.*+?^${}()|[\\]\\/\\\\]/g,Cn=RegExp(On.source),Tn=/\\bthis\\b/,Sn=/['\\n\\r\\u2028\\u2029\\\\]/g,Nn=function(){var n=\"[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\",t=\"[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+\";return RegExp(n+\"{2,}(?=\"+n+t+\")|\"+n+\"?\"+t+\"|\"+n+\"+|[0-9]+\",\"g\")}(),Un=\" \t\\x0B\\f \\ufeff\\n\\r\\u2028\\u2029 ᠎             　\",Wn=[\"Array\",\"ArrayBuffer\",\"Date\",\"Error\",\"Float32Array\",\"Float64Array\",\"Function\",\"Int8Array\",\"Int16Array\",\"Int32Array\",\"Math\",\"Number\",\"Object\",\"RegExp\",\"Set\",\"String\",\"_\",\"clearTimeout\",\"document\",\"isFinite\",\"parseInt\",\"setTimeout\",\"TypeError\",\"Uint8Array\",\"Uint8ClampedArray\",\"Uint16Array\",\"Uint32Array\",\"WeakMap\",\"window\",\"WinRTError\"],Fn=-1,Ln={};Ln[rn]=Ln[en]=Ln[un]=Ln[on]=Ln[an]=Ln[fn]=Ln[cn]=Ln[ln]=Ln[sn]=!0,Ln[M]=Ln[q]=Ln[tn]=Ln[P]=Ln[K]=Ln[V]=Ln[Y]=Ln[G]=Ln[J]=Ln[X]=Ln[Z]=Ln[H]=Ln[Q]=Ln[nn]=!1;var $n={};$n[M]=$n[q]=$n[tn]=$n[P]=$n[K]=$n[rn]=$n[en]=$n[un]=$n[on]=$n[an]=$n[J]=$n[X]=$n[Z]=$n[Q]=$n[fn]=$n[cn]=$n[ln]=$n[sn]=!0,$n[V]=$n[Y]=$n[G]=$n[H]=$n[nn]=!1;var Bn={leading:!1,maxWait:0,trailing:!1},Dn={\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\"},zn={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"` + \"`\" + `\":\"&#96;\"},Mn={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&#39;\":\"'\",\"&#96;\":\"` + \"`\" + `\"},qn={\"function\":!0,object:!0},Pn={\"\\\\\":\"\\\\\",\"'\":\"'\",\"\\n\":\"n\",\"\\r\":\"r\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},Kn=qn[typeof window]&&window!==(this&&this.window)?window:this,Vn=qn[typeof exports]&&exports&&!exports.nodeType&&exports,Yn=qn[typeof module]&&module&&!module.nodeType&&module,Gn=Vn&&Yn&&\"object\"==typeof global&&global;!Gn||Gn.global!==Gn&&Gn.window!==Gn&&Gn.self!==Gn||(Kn=Gn);var Jn=Yn&&Yn.exports===Vn&&Vn,Xn=b();\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd?define(function(){return Xn}):Vn&&Yn&&(Jn?(Yn.exports=Xn)._=Xn:Vn._=Xn),n.constant(\"lodash\",Xn)}]);\n!function(e,t){\"use strict\";var r=e.String;r.prototype.format||(r.prototype.format=function(){var e,r=this,n=function(e){return!isNaN(parseFloat(e))&&isFinite(e)},o=function(){var e=function(e){var r=function(e){return new Array(e)};switch(!0){case/^#\\{(\\w+)\\}*$/.test(e):this.formatter=function(e,t){return e.replace(\"#{\"+RegExp.$1+\"}\",t[RegExp.$1])};break;case/^([ds])$/.test(e):this.formatter=function(t,r){if(\"d\"===RegExp.$1&&!n(r))throw new TypeError;return t.replace(\"%\"+e,r)};break;case/^(o)$/.test(e):this.formatter=function(t,r){if(!n(r))throw new TypeError;return t.replace(\"%\"+e,parseInt(r).toString(8))};break;case/^(b)$/.test(e):this.formatter=function(t,r){if(!n(r))throw new TypeError;return t.replace(\"%\"+e,parseInt(r).toString(2))};break;case/^([xX])$/.test(e):this.formatter=function(t,r){if(!n(r))throw new TypeError;var o=parseInt(r).toString(16);return\"X\"===e&&(o=o.toUpperCase()),t.replace(\"%\"+e,o)};break;case/^(c)$/.test(e):this.formatter=function(t,r){if(!n(r))throw new TypeError;return t.replace(\"%\"+e,String.fromCharCode(r))};break;case/^(u)$/.test(e):this.formatter=function(t,r){if(!n(r))throw new TypeError;return t.replace(\"%\"+e,parseInt(r,10)>>>0)};break;case/^(-?)(\\d*).?(\\d?)(e)$/.test(e):this.formatter=function(o,a){if(!n(a))throw new TypeError;var i,s,c,p=\"-\"===RegExp.$1,f=RegExp.$2,l=\"\"!==RegExp.$3?RegExp.$3:t,g=a.toExponential(l);return\"\"!==f&&(l!==t?(c=f-g.length,c>=0&&(g=p?g+r(c+1).join(\" \"):r(c+1).join(\" \")+g)):(i=g.split(\"e\")[0],s=\"e\"+g.split(\"e\")[1],c=f-(i.length+s.length),g=c>=0?i+r(c+1).join(\"0\")+s:i.slice(0,c)+s)),o.replace(\"%\"+e,g)};break;case/^(-?)(\\d*).?(\\d?)(f)$/.test(e):this.formatter=function(t,o){if(!n(o))throw new TypeError;var a,i,s=\"-\"===RegExp.$1,c=RegExp.$2,p=RegExp.$3,f=\".\".length,l=o>0?Math.floor(o):Math.ceil(o),g=parseFloat(o).toFixed(\"\"!==p?p:6);return\"\"!==c&&(\"\"!==p?(a=l.toString().length+f+parseInt(p,10),i=c-a,g=s?parseFloat(o).toFixed(p)+r(i+1).join(\" \"):r(i+1).join(\" \")+parseFloat(o).toFixed(p)):g=parseFloat(o).toFixed(c-(l.toString().length+f))),t.replace(\"%\"+e,g)};break;case/^([0\\-]?)(\\d+)d$/.test(e):this.formatter=function(t,o){if(!n(o))throw new TypeError;var a=RegExp.$2-o.toString().length,i=\"\";switch(0>a&&(a=0),RegExp.$1){case\"\":i=(r(a+1).join(\" \")+o).slice(-RegExp.$2);break;case\"-\":i=(o+r(a+1).join(\" \")).slice(-RegExp.$2);break;case\"0\":i=(r(a+1).join(\"0\")+o).slice(-RegExp.$2)}return t.replace(\"%\"+e,i)};break;case/^(-?)(\\d)s$/.test(e):this.formatter=function(t,n){var o=RegExp.$2-n.toString().length,a=\"\";switch(0>o&&(o=0),RegExp.$1){case\"\":a=(r(o+1).join(\" \")+n).slice(-RegExp.$2);break;case\"-\":a=(n+r(o+1).join(\" \")).slice(-RegExp.$2)}return t.replace(\"%\"+e,a)};break;case/^(-?\\d?)\\.(\\d)s$/.test(e):this.formatter=function(t,n){var o,a,i=\"\";return\"\"===RegExp.$1?i=n.slice(0,RegExp.$2):(n=n.slice(0,RegExp.$2),o=Math.abs(RegExp.$1),a=o-n.toString().length,i=-1!==RegExp.$1.indexOf(\"-\")?(n+r(a+1).join(\" \")).slice(-o):(r(a+1).join(\" \")+n).slice(-o)),t.replace(\"%\"+e,i)};break;default:this.formatter=function(e,t){return e}}};return e.prototype={format:function(e,t){return this.formatter.call(this,e,t)}},e}(),a=Array.prototype.slice.call(arguments);if(1===a.length&&\"object\"==typeof a[0])for(e=0;e<Object.keys(a[0]).length;e+=1)r.match(/(#\\{\\w+\\})/)&&(r=new o(RegExp.$1).format(r,a[0]));else for(e=0;e<a.length;e+=1)r.match(/%([.#0-9\\-]*[bcdefosuxX])/)&&(r=new o(RegExp.$1).format(r,a[e]));return r})}(\"undefined\"!=typeof global?global:window);\n!function(e){function n(){var e=arguments[0],r=n.cache;return r[e]&&r.hasOwnProperty(e)||(r[e]=n.parse(e)),n.format.call(null,r[e],arguments)}function r(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function t(e,n){return Array(n+1).join(e)}var i={not_string:/[^s]/,number:/[dief]/,text:/^[^\\x25]+/,modulo:/^\\x25{2}/,placeholder:/^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fiosuxX])/,key:/^([a-z_][a-z_\\d]*)/i,key_access:/^\\.([a-z_][a-z_\\d]*)/i,index_access:/^\\[(\\d+)\\]/,sign:/^[\\+\\-]/};n.format=function(e,s){var a,o,l,f,c,p,u,d=1,g=e.length,h=\"\",x=[],b=!0,y=\"\";for(o=0;g>o;o++)if(h=r(e[o]),\"string\"===h)x[x.length]=e[o];else if(\"array\"===h){if(f=e[o],f[2])for(a=s[d],l=0;l<f[2].length;l++){if(!a.hasOwnProperty(f[2][l]))throw new Error(n(\"[sprintf] property '%s' does not exist\",f[2][l]));a=a[f[2][l]]}else a=f[1]?s[f[1]]:s[d++];if(\"function\"==r(a)&&(a=a()),i.not_string.test(f[8])&&\"number\"!=r(a)&&isNaN(a))throw new TypeError(n(\"[sprintf] expecting number but found %s\",r(a)));switch(i.number.test(f[8])&&(b=a>=0),f[8]){case\"b\":a=a.toString(2);break;case\"c\":a=String.fromCharCode(a);break;case\"d\":case\"i\":a=parseInt(a,10);break;case\"e\":a=f[7]?a.toExponential(f[7]):a.toExponential();break;case\"f\":a=f[7]?parseFloat(a).toFixed(f[7]):parseFloat(a);break;case\"o\":a=a.toString(8);break;case\"s\":a=(a=String(a))&&f[7]?a.substring(0,f[7]):a;break;case\"u\":a>>>=0;break;case\"x\":a=a.toString(16);break;case\"X\":a=a.toString(16).toUpperCase()}!i.number.test(f[8])||b&&!f[3]?y=\"\":(y=b?\"+\":\"-\",a=a.toString().replace(i.sign,\"\")),p=f[4]?\"0\"===f[4]?\"0\":f[4].charAt(1):\" \",u=f[6]-(y+a).length,c=f[6]&&u>0?t(p,u):\"\",x[x.length]=f[5]?y+a+c:\"0\"===p?y+c+a:c+y+a}return x.join(\"\")},n.cache={},n.parse=function(e){for(var n=e,r=[],t=[],s=0;n;){if(null!==(r=i.text.exec(n)))t[t.length]=r[0];else if(null!==(r=i.modulo.exec(n)))t[t.length]=\"%\";else{if(null===(r=i.placeholder.exec(n)))throw new SyntaxError(\"[sprintf] unexpected placeholder\");if(r[2]){s|=1;var a=[],o=r[2],l=[];if(null===(l=i.key.exec(o)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");for(a[a.length]=l[1];\"\"!==(o=o.substring(l[0].length));)if(null!==(l=i.key_access.exec(o)))a[a.length]=l[1];else{if(null===(l=i.index_access.exec(o)))throw new SyntaxError(\"[sprintf] failed to parse named argument key\");a[a.length]=l[1]}r[2]=a}else s|=2;if(3===s)throw new Error(\"[sprintf] mixing positional and named placeholders is not (yet) supported\");t[t.length]=r}n=n.substring(r[0].length)}return t};var s=function(e,r,t){return t=(r||[]).slice(0),t.splice(0,0,e),n.apply(null,t)};\"undefined\"!=typeof exports?(exports.sprintf=n,exports.vsprintf=s):(e.sprintf=n,e.vsprintf=s,\"function\"==typeof define&&define.amd&&define(function(){return{sprintf:n,vsprintf:s}}))}(\"undefined\"==typeof window?this:window);\n!function(require){\"use strict\";function push(t,e){return t=t.slice(),t.push(e),t}function unshift(t,e){return e=e.slice(),e.unshift(t),e}function JSONPath(t,e,r){return this instanceof JSONPath?(t=t||{},this.resultType=t.resultType&&t.resultType.toLowerCase()||\"value\",this.flatten=t.flatten||!1,this.wrap=t.hasOwnProperty(\"wrap\")?t.wrap:!0,this.sandbox=t.sandbox||{},t.autostart!==!1?this.evaluate(e||t.json,r||t.path):void 0):new JSONPath(t,e,r)}Array.isArray||(Array.isArray=function(t){return\"[object Array]\"===Object.prototype.toString.call(t)});var isNode=\"undefined\"!=typeof module&&!!module.exports,vm=isNode?require(\"vm\"):{runInNewContext:function(expr,context){return eval(Object.keys(context).reduce(function(t,e){return\"var \"+e+\"=\"+JSON.stringify(context[e])+\";\"+t},expr))}},cache={};JSONPath.prototype.evaluate=function(t,e){var r=this;if(this.obj=t,e&&t&&(\"value\"===this.resultType||\"path\"===this.resultType)){var n=this._normalize(e);\"$\"===n[0]&&n.length>1&&n.shift();var a=this._trace(n,t,[\"$\"]);return a=a.filter(function(t){return t&&!t.isParentSelector}),a.length?1!==a.length||this.wrap||Array.isArray(a[0].value)?a.reduce(function(t,e){var n=e[r.resultType];return\"path\"===r.resultType&&(n=r._asPath(n)),r.flatten&&Array.isArray(n)?t=t.concat(n):t.push(n),t},[]):a[0][this.resultType]||!1:this.wrap?[]:!1}},JSONPath.prototype._normalize=function(t){if(cache[t])return cache[t];var e=[],r=t.replace(/[\\['](\\??\\(.*?\\))[\\]']/g,function(t,r){return\"[#\"+(e.push(r)-1)+\"]\"}).replace(/'?\\.'?|\\['?/g,\";\").replace(/(?:;)?(\\^+)(?:;)?/g,function(t,e){return\";\"+e.split(\"\").join(\";\")+\";\"}).replace(/;;;|;;/g,\";..;\").replace(/;$|'?\\]|'$/g,\"\"),n=r.split(\";\").map(function(t){var r=t.match(/#([0-9]+)/);return r&&r[1]?e[r[1]]:t});return cache[t]=n,cache[t]},JSONPath.prototype._asPath=function(t){var e,r,n=t,a=\"$\";for(e=1,r=n.length;r>e;e++)a+=/^[0-9*]+$/.test(n[e])?\"[\"+n[e]+\"]\":\"['\"+n[e]+\"']\";return a},JSONPath.prototype._trace=function(t,e,r){function n(t){o=o.concat(t)}var a=this;if(!t.length)return[{path:r,value:e}];var i=t[0],s=t.slice(1);if(\"^\"===i)return r.length?[{path:r.slice(0,-1),expr:s,isParentSelector:!0}]:[];var o=[];if(e&&e.hasOwnProperty(i))n(this._trace(s,e[i],push(r,i)));else if(\"*\"===i)this._walk(i,s,e,r,function(t,e,r,i,s){n(a._trace(unshift(t,r),i,s))});else if(\"..\"===i)n(this._trace(s,e,r)),this._walk(i,s,e,r,function(t,e,r,i,s){\"object\"==typeof i[t]&&n(a._trace(unshift(\"..\",r),i[t],push(s,t)))});else if(\"(\"===i[0])n(this._trace(unshift(this._eval(i,e,r[r.length],r),s),e,r));else if(0===i.indexOf(\"?(\"))this._walk(i,s,e,r,function(t,e,i,s,o){a._eval(e.replace(/^\\?\\((.*?)\\)$/,\"$1\"),s[t],t,r)&&n(a._trace(unshift(t,i),s,o))});else if(i.indexOf(\",\")>-1){var h,u;for(h=i.split(\",\"),u=0;u<h.length;u++)n(this._trace(unshift(h[u],s),e,r))}else/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(i)&&n(this._slice(i,s,e,r));return o.reduce(function(t,r){return t.concat(r.isParentSelector?a._trace(r.expr,e,r.path):[r])},[])},JSONPath.prototype._walk=function(t,e,r,n,a){var i,s,o;if(Array.isArray(r))for(i=0,s=r.length;s>i;i++)a(i,t,e,r,n);else if(\"object\"==typeof r)for(o in r)r.hasOwnProperty(o)&&a(o,t,e,r,n)},JSONPath.prototype._slice=function(t,e,r,n){if(Array.isArray(r)){var a,i=r.length,s=t.split(\":\"),o=s[0]&&parseInt(s[0],10)||0,h=s[1]&&parseInt(s[1],10)||i,u=s[2]&&parseInt(s[2],10)||1;o=0>o?Math.max(0,o+i):Math.min(i,o),h=0>h?Math.max(0,h+i):Math.min(i,h);var c=[];for(a=o;h>a;a+=u)c=c.concat(this._trace(unshift(a,e),r,n));return c}},JSONPath.prototype._eval=function(t,e,r,n){if(!this.obj||!e)return!1;t.indexOf(\"@path\")>-1&&(this.sandbox._path=this._asPath(n.concat([r])),t=t.replace(/@path/g,\"_path\")),t.indexOf(\"@\")>-1&&(this.sandbox._v=e,t=t.replace(/@/g,\"_v\"));try{return vm.runInNewContext(t,this.sandbox)}catch(a){throw console.log(a),new Error(\"jsonPath: \"+a.message+\": \"+t)}},JSONPath.eval=function(t,e,r){return new JSONPath(r,t,e)},\"undefined\"==typeof module?(window.jsonPath={eval:JSONPath.eval},window.JSONPath=JSONPath):module.exports=JSONPath}(\"undefined\"==typeof require?null:require);`)\n\nfunc appAssetsJsBaseJsBytes() ([]byte, error) {\n\treturn _appAssetsJsBaseJs, nil\n}\n\nfunc appAssetsJsBaseJs() (*asset, error) {\n\tbytes, err := appAssetsJsBaseJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/assets/js/base.js\", size: 477099, mode: os.FileMode(416), modTime: time.Unix(1454116398, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"><path d=\"M5 8l4 4 4-4z\"/></svg>`)\n\nfunc appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvgBytes() ([]byte, error) {\n\treturn _appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvg, nil\n}\n\nfunc appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvg() (*asset, error) {\n\tbytes, err := appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/img/icons/ic_arrow_drop_down_18px.svg\", size: 114, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n    <path d=\"M7 10l5 5 5-5z\"/>\n    <path d=\"M0 0h24v24h-24z\" fill=\"none\"/>\n</svg>\n`)\n\nfunc appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvgBytes() ([]byte, error) {\n\treturn _appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvg, nil\n}\n\nfunc appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvg() (*asset, error) {\n\tbytes, err := appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/img/icons/ic_arrow_drop_down_24px.svg\", size: 166, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardImgIconsIc_close_18pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"><path d=\"M14.53 4.53l-1.06-1.06L9 7.94 4.53 3.47 3.47 4.53 7.94 9l-4.47 4.47 1.06 1.06L9 10.06l4.47 4.47 1.06-1.06L10.06 9z\"/></svg>`)\n\nfunc appComponentsDashboardImgIconsIc_close_18pxSvgBytes() ([]byte, error) {\n\treturn _appComponentsDashboardImgIconsIc_close_18pxSvg, nil\n}\n\nfunc appComponentsDashboardImgIconsIc_close_18pxSvg() (*asset, error) {\n\tbytes, err := appComponentsDashboardImgIconsIc_close_18pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/img/icons/ic_close_18px.svg\", size: 215, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardImgIconsIc_close_24pxSvg = []byte(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/></svg>`)\n\nfunc appComponentsDashboardImgIconsIc_close_24pxSvgBytes() ([]byte, error) {\n\treturn _appComponentsDashboardImgIconsIc_close_24pxSvg, nil\n}\n\nfunc appComponentsDashboardImgIconsIc_close_24pxSvg() (*asset, error) {\n\tbytes, err := appComponentsDashboardImgIconsIc_close_24pxSvgBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/img/icons/ic_close_24px.svg\", size: 202, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardManifestJson = []byte(`{\n  \"description\": \"The basic Kubernetes UI dashboard... \",\n  \"routes\": [\n    {\n      \"description\": \"Dashboard visualization.\",\n      \"url\": \"/\",\n      \"templateUrl\": \"components/dashboard/pages/home.html\"\n    },\n    {\n      \"description\": \"Pods\",\n      \"url\": \"/pods\",\n      \"templateUrl\": \"components/dashboard/views/listPods.html\"\n    },\n    {\n      \"description\": \"Services\",\n      \"url\": \"/services\",\n      \"templateUrl\": \"components/dashboard/views/listServices.html\"\n    },\n    {\n      \"description\": \"Replication Controllers\",\n      \"url\": \"/replicationcontrollers\",\n      \"templateUrl\": \"components/dashboard/views/listReplicationControllers.html\"\n    },\n    {\n      \"description\": \"Events\",\n      \"url\": \"/events\",\n      \"templateUrl\": \"components/dashboard/views/listEvents.html\"\n    },\n    {\n      \"description\": \"Nodes\",\n      \"url\": \"/nodes\",\n      \"templateUrl\": \"components/dashboard/views/listMinions.html\"\n    },\n    {\n      \"description\": \"Replication Controller\",\n      \"url\": \"/replicationcontrollers/:namespaceId/:replicationControllerId\",\n      \"templateUrl\": \"components/dashboard/views/replication.html\"\n    },\n    {\n      \"description\": \"Service\",\n      \"url\": \"/services/:namespaceId/:serviceId\",\n      \"templateUrl\": \"components/dashboard/views/service.html\"\n    },\n    {\n      \"description\": \"Node\",\n      \"url\": \"/nodes/:nodeId\",\n      \"templateUrl\": \"components/dashboard/views/node.html\"\n    },\n    {\n      \"description\": \"Explore\",\n      \"url\": \"/groups/:grouping*?/selector/:selector*?\",\n      \"templateUrl\": \"components/dashboard/views/groups.html\"\n    },\n    {\n      \"description\": \"Pod\",\n      \"url\": \"/pods/:namespaceId/:podId\",\n      \"templateUrl\": \"components/dashboard/views/pod.html\"\n    }\n  ]\n}\n`)\n\nfunc appComponentsDashboardManifestJsonBytes() ([]byte, error) {\n\treturn _appComponentsDashboardManifestJson, nil\n}\n\nfunc appComponentsDashboardManifestJson() (*asset, error) {\n\tbytes, err := appComponentsDashboardManifestJsonBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/manifest.json\", size: 1739, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardPagesFooterHtml = []byte(`<p></p>`)\n\nfunc appComponentsDashboardPagesFooterHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardPagesFooterHtml, nil\n}\n\nfunc appComponentsDashboardPagesFooterHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardPagesFooterHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/pages/footer.html\", size: 7, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardPagesHeaderHtml = []byte(`<div layout-fill>\n<md-toolbar md-scroll-shrink class=\"dashboard-subnav\">\n   <div class=\"md-toolbar-tools\">\n      <div layout=\"row\" flex class=\"fill-height\">\n         <div class=\"md-toolbar-item md-breadcrumb\"></div>\n         <span ng-if=\"menu.currentPage.name !== menu.currentSection.name\">\n         <span hide-sm hide-md><a href=\"#{{menu.currentSection.url}}\">{{menu.currentSection.name}}</a></span>\n         <span class=\"menu-separator-icon\" style=\"padding: 0 10px;\" hide-sm hide-md>\n         <img style=\"height: 12px;\" src=\"assets/img/docArrow.png\" alt=\"\" aria-hidden=\"true\">\n         </span>\n         </span>\n         <span style=\"display: inline-block;\">{{(menu.currentPage | humanizeDoc) || 'Kubernetes' }}</span>\n         <span flex></span>\n         <div class=\"md-toolbar-item md-tools\" layout=\"row\">\n            <div layout=\"column\" class=\"selectSubPages\">\n               <md-select ng-model=\"page\" placeholder=\"Views\" class=\"selectTitle\">\n                  <md-optgroup label=\"Dashboard\">\n                  <md-option id=\"{{subpage.id}}\" ng-value=\"subpage.value\" ng-repeat=\"subpage in subpages | filter: {category: 'dashboard' }\">{{subpage.name}}</md-option>\n                  </md-option-group>\n               </md-select>\n            </div>\n         </div>\n      </div>\n   </div>\n</md-toolbar>\n</div>\n`)\n\nfunc appComponentsDashboardPagesHeaderHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardPagesHeaderHtml, nil\n}\n\nfunc appComponentsDashboardPagesHeaderHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardPagesHeaderHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/pages/header.html\", size: 1313, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardPagesHomeHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\" ng-controller=\"DashboardCtrl\" layout-fill>\n  <md-content>\n    <div ng-include=\"'components/dashboard/views/partials/cadvisor.html'\">&gt;</div>\n  </md-content>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardPagesHomeHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardPagesHomeHtml, nil\n}\n\nfunc appComponentsDashboardPagesHomeHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardPagesHomeHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/pages/home.html\", size: 247, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsGroupsHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"GroupCtrl\" layout=\"column\" class=\"body-wrapper groups\">\n    <md-content>\n      <!-- page header -->\n      <div class=\"header\" layout=\"row\">\n          <div class=\"\">Group by: </div>\n\n          <md-select placeholder=\"{{routeParams.grouping}}\" class=\"select-group-by\" ng-model=\"selectedGroupBy\" ng-change=\"changeGroupBy()\">\n              <md-option ng-value=\"g.value\" ng-repeat=\"g in groupByOptions\">{{g.name}}</md-option>\n          </md-select>\n\n          <div ng-if=\"selector\" layout=\"row\" class=\"selector-area\">\n            <div class=\"filter-label\">Filter:</div>\n\n            <div class=\"filter-text\">{{selector}}</div>\n            <div class=\"filter-area\" ng-if=\"selector && selector.length > 0\">\n\n              <button ng-click=\"clearSelector(routeParams.grouping)\" class=\"md-button cancel-button\">\n\n                <md-icon md-svg-src=\"components/dashboard/img/icons/ic_close_18px.svg\" class=\"cancel-icon\" alt=\"Cancel\"></md-icon>\n\n              </button>\n\n            </div>\n\n          </div>\n\n      </div>\n      <div class=\"group-item\" ng-repeat=\"(groupName,group) in groups.items\" ng-include=\"'components/dashboard/views/partials/groupBox.html'\"></div>\n    </md-content>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsGroupsHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsGroupsHtml, nil\n}\n\nfunc appComponentsDashboardViewsGroupsHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsGroupsHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/groups.html\", size: 1298, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListeventsHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListEventsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListeventsHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListeventsHtml, nil\n}\n\nfunc appComponentsDashboardViewsListeventsHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListeventsHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listEvents.html\", size: 326, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListminionsHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListMinionsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListminionsHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListminionsHtml, nil\n}\n\nfunc appComponentsDashboardViewsListminionsHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListminionsHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listMinions.html\", size: 348, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListpodsHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListpodsHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListpodsHtml, nil\n}\n\nfunc appComponentsDashboardViewsListpodsHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListpodsHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listPods.html\", size: 345, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListpodscardsHtml = []byte(`<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n\n    <md-whiteframe layout-margin class=\"md-whiteframe-z2\">\n    <md-toolbar class=\"\">\n      <div class=\"md-toolbar-tools\">\n        Pods\n      </div>\n    </md-toolbar>\n    <md-content>\n\n\n        <div class=\"pod-group\">\n          <md-grid-list md-cols=\"6\" md-row-height=\"1:1.5\" md-gutter=\"8px\" ng-repeat=\"(podName, groupPods) in groupedPods\">\n            <md-grid-tile md-rowspan=\"1\" md-colspan=\"2\" class=\"gray\">\n              <md-grid-tile-footer>\n                <div class=\"pod-title\"><h2>{{podName}}</h2></div>\n              </md-grid-tile-footer>\n            </md-grid-tile>\n\n            <md-grid-tile class=\"purple\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n              <div>\n\n                <div>\n                  Containers:\n                  <span ng-repeat=\"container in pod.desiredState.manifest.containers\">\n                    {{container.name}}\n                  </span>\n                </div>\n                <div>\n                  Images:\n                  <span ng-repeat=\"container in pod.desiredState.manifest.containers\">\n                    {{container.image}}\n                  </span>\n                </div>\n                <div>Internal IP: {{pod.currentState.podIP}}</div>\n                <div>\n                Labels:\n                  <span ng-repeat=\"(label, value) in pod.labels\">{{label}}={{value}}<span ng-show=\"!$last\">, </span></span>\n                </div>\n                <div>Status: {{pod.currentState.status}}</div>\n              </div>\n              <md-grid-tile-footer>\n\n                <div class=\"pod-host\">{{pod.currentState.host}}</div>\n                <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n              </md-grid-tile-footer>\n            </md-grid-tile>\n\n          </md-grid-list>\n        </div>\n\n\n    </md-content>\n    </md-whiteframe>\n\n  </div>\n</div>\n`)\n\nfunc appComponentsDashboardViewsListpodscardsHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListpodscardsHtml, nil\n}\n\nfunc appComponentsDashboardViewsListpodscardsHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListpodscardsHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listPodsCards.html\", size: 1967, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListpodsvisualizerHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n    <md-whiteframe layout-margin class=\"md-whiteframe-z2\">\n    <md-content>\n<div>\n<md-button class=\"md-primary\" ng-click=\"serverView = false\">By Name</md-button> |\n<md-button class=\"md-primary\" ng-click=\"serverView = true\">By Server</md-button>\n  <div style=\"float:right;\"><md-button class=\"md-primary\" ng-href=\"#/dashboard/pods\">View Pod Listing</md-button></div>\n</div>\n    <div class=\"pod-group\" ng-show=\"!serverView\" ng-include=\"'components/dashboard/views/partials/podTilesByName.html'\"></div>\n    <div class=\"pod-group\" ng-show=\"serverView\" ng-include=\"'components/dashboard/views/partials/podTilesByServer.html'\"></div>\n    </md-content>\n    </md-whiteframe>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListpodsvisualizerHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListpodsvisualizerHtml, nil\n}\n\nfunc appComponentsDashboardViewsListpodsvisualizerHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListpodsvisualizerHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listPodsVisualizer.html\", size: 841, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListreplicationcontrollersHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListReplicationControllersCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListreplicationcontrollersHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListreplicationcontrollersHtml, nil\n}\n\nfunc appComponentsDashboardViewsListreplicationcontrollersHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListreplicationcontrollersHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listReplicationControllers.html\", size: 363, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsListservicesHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListServicesCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsListservicesHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsListservicesHtml, nil\n}\n\nfunc appComponentsDashboardViewsListservicesHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsListservicesHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/listServices.html\", size: 349, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsNodeHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"NodeCtrl\" layout=\"column\" class=\"body-wrapper node\">\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n\n      <div class=\"heading\">\n        <span class=\"label\">Name:</span>\n        <span>{{node.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr ng-show=\"node.metadata.labels\">\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in node.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{node.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Addresses</td>\n            <td class=\"value\">\n              <div ng-repeat=\"a in node.status.addresses\">\n                {{a.address}}\n              </div>\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.status.capacity\">\n            <td class=\"name\">Capacity</td>\n            <td class=\"value\">\n              <table>\n                <tr ng-repeat=\"(label, value) in node.status.capacity\">\n                  <td>{{label}}:</td> <td>{{value}}</td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">System Info</td>\n            <td class=\"value\">\n              <table>\n              <tr ng-repeat=\"(label, value) in node.status.nodeInfo\">\n                <td>{{label}}:</td> <td>{{value}}</td>\n              </tr>\n              </table>\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.spec.podCIDR\">\n            <td class=\"name\">PodCIDR</td>\n            <td class=\"value\">\n              {{node.spec.podCIDR}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.spec.externalID\">\n            <td class=\"name\">ExternalID</td>\n            <td class=\"value\">\n              {{node.spec.externalID}}\n            </td>\n          </tr>\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsNodeHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsNodeHtml, nil\n}\n\nfunc appComponentsDashboardViewsNodeHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsNodeHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/node.html\", size: 2307, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPartialsCadvisorHtml = []byte(`<div class=\"dashboard\" ng-controller=\"cAdvisorController\">\n  <div class=\"server-overview\">\n    <md-content layout=\"row\" layout-wrap>\n      <div flex-sm=\"100\" flex-md=\"50\" flex-lg=\"33\" flex-gt-lg=\"25\" class=\"chart_area\" ng-repeat=\"minion in minions.items\">\n        <d3-minion-bar-gauge data=\"activeMinionDataById[minion.metadata.name]\" class=\"concentric\" graph-width=\"325\" graph-height=\"325\" thickness=18 />\n      </div>\n    </md-content>\n  </div>\n</div>\n`)\n\nfunc appComponentsDashboardViewsPartialsCadvisorHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPartialsCadvisorHtml, nil\n}\n\nfunc appComponentsDashboardViewsPartialsCadvisorHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPartialsCadvisorHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/partials/cadvisor.html\", size: 454, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPartialsGroupboxHtml = []byte(`<div>\n  <md-content>\n    <div class=\"server-overview\" layout=\"column\">\n      <!-- subheader -->\n      <div class=\"group-heading\" layout=\"row\">\n        <div class=\"label\">{{routeParams.grouping | ucfirst}}: <span class=\"bold\">{{ (groupName) || \"blank\"  }}</span></div>\n      </div>\n      <!-- render group data -->\n      <div ng-include=\"'components/dashboard/views/partials/groupItem.html'\"></div>\n      <div class=\"footer\">\n        <!-- Alternate box inside a box -->\n        <div ng-if=\"group.kind == 'grouping'\">\n          {{group.kind}}\n          <div ng-repeat=\"(groupName,group) in group.items\" ng-include=\"'components/dashboard/views/partials/groupBox.html'\"></div>\n        </div>\n        <md-divider></md-divider>\n      </div>\n    </div>\n  </md-content>\n</div>\n`)\n\nfunc appComponentsDashboardViewsPartialsGroupboxHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPartialsGroupboxHtml, nil\n}\n\nfunc appComponentsDashboardViewsPartialsGroupboxHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPartialsGroupboxHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/partials/groupBox.html\", size: 769, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPartialsGroupitemHtml = []byte(`<div layout=\"row\" ng-if=\"group.kind != 'grouping'\">\n  <div>\n    <!-- Default box display -->\n      <div layout=\"row\" class=\"group-item\" ng-repeat=\"(groupType, data) in group | groupBy: 'metadata.labels.type'\">\n        <!-- left image -->\n        <div class=\"icon-area\">\n          <div class=\"group-icon\" style=\"background-color: {{getGroupColor(groupType)}}\"></div>\n        </div>\n        <!-- right area -->\n        <div class=\"group-main-area\" layout=\"column\">\n          <!-- type -->\n          <div class=\"subtype\">\n            {{groupType | ucfirst}}s\n          </div>\n          <!-- links -->\n          <div layout=\"row\" layout-wrap>\n            <div layout=\"row\" ng-repeat=\"item in data\">\n              <!-- title -->\n              <div ng-switch on='item.metadata.labels[\"type\"]'>\n                <div class=\"group-name\">\n                  <a ng-switch-when='pod' ng-href=\"#/dashboard/pods/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <a ng-switch-when='service' ng-href=\"#/dashboard/services/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <a ng-switch-when='replicationController' ng-href=\"#/dashboard/replicationcontrollers/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <div ng-switch-default>{{item.metadata.name}}</div>\n                </div>\n              </div>\n              <md-select ng-model=\"selectedFilter\" ng-change=\"changeFilterBy(selectedFilter)\" class=\"selectFilter\">\n                <md-optgroup label=\"FILTER\">\n                  <md-option ng-value=\"'{{key}}={{value}}'\" ng-repeat=\"(key, value) in item.metadata.labels\">{{key}}: {{value}}</md-option>\n                  </md-option-group>\n                </md-optgroup>\n              </md-select>\n              <!-- This is the official button design, but requires a custom dialog. Fix up after the demo. -->\n              <!-- <md-button ng-click=\"\" class=\"filter-button\" style=\"padding:0\">\n                <md-icon md-svg-src=\"components/dashboard/img/icons/ic_arrow_drop_down_18px.svg\" class=\"filter-icon\" aria-label=\"\" alt=\"Filter\"></md-icon>\n              </md-button> -->\n            </div>\n          </div>\n        </div>\n      </div>\n  </div>\n</div>\n`)\n\nfunc appComponentsDashboardViewsPartialsGroupitemHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPartialsGroupitemHtml, nil\n}\n\nfunc appComponentsDashboardViewsPartialsGroupitemHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPartialsGroupitemHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/partials/groupItem.html\", size: 2303, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPartialsPodtilesbynameHtml = []byte(`\n<md-grid-list class=\"list-color-{{$index + 1}}\" md-cols=\"6\" md-row-height=\"1:1\" md-gutter=\"8px\" ng-repeat=\"(podName, groupPods) in podsByName\">\n  <md-grid-tile md-rowspan=\"2\" md-colspan=\"2\" class=\"colored\">\n    <md-grid-tile-footer>\n      <div class=\"pod-title\"><h2>{{podName}} overview</h2></div>\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n  <md-grid-tile class=\"colored {{podStatusClass(pod)}}\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n    <md-grid-tile-header class=\"clear-bg\">\n\n      <div layout=\"row\">\n        <div class=\"labels\"><span ng-repeat=\"(label, value) in otherLabels(pod.labels)\">{{label}}: {{value}}<span ng-show=\"!$last\">, </span></span></div>\n\n        <div flex=\"20\" class=\"restarts\" ng-show=\"getPodRestarts(pod) > 0\">\n          <md-button class=\"md-fab restart-button\">\n              {{getPodRestarts(pod)}}\n          </md-button>\n        </div>\n      </div>\n\n    </md-grid-tile-header>\n    <div class=\"inner-box\">\n\n      <div ng-show=\"podStatusClass(pod)\">Status: {{pod.currentState.status}}</div>\n    </div>\n    <md-grid-tile-footer>\n\n      <div class=\"pod-host\">{{pod.currentState.host}}</div>\n      <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n    </md-grid-tile-footer>\n  </md-grid-tile>\n</md-grid-list>`)\n\nfunc appComponentsDashboardViewsPartialsPodtilesbynameHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPartialsPodtilesbynameHtml, nil\n}\n\nfunc appComponentsDashboardViewsPartialsPodtilesbynameHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPartialsPodtilesbynameHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/partials/podTilesByName.html\", size: 1287, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPartialsPodtilesbyserverHtml = []byte(`<md-grid-list class=\"\" md-cols=\"6\" md-row-height=\"1:1\" md-gutter=\"8px\" ng-repeat=\"(serverIp, groupPods) in podsByServer\">\n  <md-grid-tile md-rowspan=\"2\" md-colspan=\"2\" class=\"gray\">\n    <md-grid-tile-footer>\n      <div class=\"pod-title\"><h2>{{serverIp}} overview</h2></div>\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n  <md-grid-tile class=\"color-{{podIndexFromName(pod)}} {{podStatusClass(pod)}}\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n    <md-grid-tile-header class=\"clear-bg\">\n\n      <div layout=\"row\">\n        <div class=\"labels\"><span ng-repeat=\"(label, value) in otherLabels(pod.labels)\">{{label}}: {{value}}<span ng-show=\"!$last\">, </span></span></div>\n\n        <div flex=\"20\" class=\"restarts\" ng-show=\"getPodRestarts(pod) > 0\">\n          <md-button class=\"md-fab restart-button\">\n              {{getPodRestarts(pod)}}\n          </md-button>\n        </div>\n      </div>\n\n    </md-grid-tile-header>\n    <div class=\"inner-box\">\n\n      <div ng-show=\"podStatusClass(pod)\">Status: {{pod.currentState.status}}</div>\n    </div>\n    <md-grid-tile-footer>\n\n      <div class=\"pod-host\">{{pod.labels.name}}</div>\n      <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n</md-grid-list>`)\n\nfunc appComponentsDashboardViewsPartialsPodtilesbyserverHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPartialsPodtilesbyserverHtml, nil\n}\n\nfunc appComponentsDashboardViewsPartialsPodtilesbyserverHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPartialsPodtilesbyserverHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/partials/podTilesByServer.html\", size: 1281, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsPodHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"PodCtrl\" layout=\"column\" class=\"body-wrapper pod\">\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Name:</span>\n        <span>{{pod.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Status</td>\n            <td class=\"value\">\n              {{pod.status.phase}} on <a ng-href=\"#/dashboard/groups/host/selector/host={{pod.spec.host}}\">{{pod.spec.host}}</a>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{pod.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Host Networking</td>\n            <td class=\"value\">\n              {{pod.spec.host}}/{{pod.status.hostIP}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Pod Networking</td>\n            <td class=\"value\">\n              {{pod.status.podIP}}\n              <span ng-repeat=\"container in pod.spec.containers\">\n                <span ng-repeat=\"port in container.ports\">\n                  <span ng-show=\"port.containerPort\">\n                    {{port.name}}: {{port.containerPort}}{{$last ? '' : ', '}}\n                  </span>\n               </span>\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in pod.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{pod.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Containers</td>\n            <td class=\"value\">\n\n              <table class=\"containerTable\">\n                <tr>\n                  <td>Name</td>\n                  <td>Image</td>\n                  <td>Ready</td>\n                  <td>Restarts</td>\n                  <td>State</td>\n                </tr>\n                <tr ng-repeat=\"container in pod.status.containerStatuses\">\n                  <td>{{container.name}}</td>\n                  <td>{{container.image}}</td>\n                  <td>{{container.ready}}</td>\n                  <td>{{container.restartCount}}</td>\n                  <td>\n                    <div ng-show=\"container.state.running\">\n                      <div class=\"run-state\">Running</div>\n                      <div class=\"run-messages\">Started: {{container.state.running.startedAt | date:'medium'}}</div>\n                    </div>\n                    <div ng-show=\"container.state.waiting\">\n                      <div class=\"run-state\">Waiting</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.waiting.reason\">Reason: {{container.state.waiting.reason}}</div>\n                    </div>\n                    <div ng-show=\"container.state.termination\">\n                      <div class=\"run-state\">Terminated</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.reason\">Reason: {{container.state.termination.reason}}</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.message\">Message: {{container.state.termination.message}}</div>\n                      <div class=\"run-messages\">Exit Code: {{container.state.termination.exitCode}}</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.signal\">Signal: {{container.state.termination.signal}}</div>\n                      <div class=\"run-messages\">Started: {{container.state.termination.startedAt | date:'medium'}}</div>\n                      <div class=\"run-messages\">Finished: {{container.state.termination.finishedAt | date:'medium'}}</div>\n                    </div>\n                  </td>\n                </tr>\n              </table>\n\n\n            </td>\n          </tr>\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsPodHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsPodHtml, nil\n}\n\nfunc appComponentsDashboardViewsPodHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsPodHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/pod.html\", size: 4288, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsReplicationHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n<div ng-controller=\"ReplicationControllerCtrl\" layout=\"column\" class=\"body-wrapper\">\n\n  <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Replication Controller: </span>\n        <span>{{replicationController.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{replicationController.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Desired Replicas</td>\n            <td class=\"value\">\n              {{replicationController.spec.replicas}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Current Replicas</td>\n            <td class=\"value\">\n              {{replicationController.status.replicas}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"replicationController.spec.selector\">\n            <td class=\"name\">Selector</td>\n            <td class=\"value\">\n              <span ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                {{label}}={{value}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in replicationController.metadata.labels\">\n                  {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{replicationController.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Pods</td>\n            <td class=\"value\">\n              <div ng-show=\"replicationController.spec.selector && Object.keys(replicationController.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(replicationController.spec.selector)}},type=pod\">{{getSelectorUrlFragment(replicationController.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=pod\">{{label}}: {{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n\n          <tr>\n            <td class=\"name\">Related Services</td>\n            <td class=\"value\">\n              <div ng-show=\"replicationController.spec.selector && Object.keys(replicationController.spec.selector).length > 1\">\n\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(replicationController.spec.selector)}},type=pod\">{{getSelectorUrlFragment(replicationController.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                  <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=service\">{{label}}={{value}}</a>\n                </div>\n            </td>\n          </tr>\n\n\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n\n\n\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsReplicationHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsReplicationHtml, nil\n}\n\nfunc appComponentsDashboardViewsReplicationHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsReplicationHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/replication.html\", size: 3364, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appComponentsDashboardViewsServiceHtml = []byte(`<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ServiceCtrl\" layout=\"column\" class=\"body-wrapper service\">\n\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Service: </span>\n        <span>{{service.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{service.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Ports</td>\n            <td class=\"value\">\n              <div ng-repeat=\"port in service.spec.ports\">\n                <span ng-show=\"port.name\">\n                  {{port.name}}:\n                </span>\n                {{port.port}}/{{port.protocol}}\n\n                <div ng-show=\"port.nodePort && port.nodePort != 0\">\n                  Node Port: {{port.nodePort}}/{{port.protocol}}\n                </div>\n\n             </div>\n            </td>\n          </tr>\n\n\n          <tr>\n            <td class=\"name\">IP</td>\n            <td class=\"value\">\n              {{service.spec.portalIP}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"service.status.loadBalancer.ingress\">\n            <td class=\"name\">LoadBalancer Ingress</td>\n            <td class=\"value\">\n              <span ng-repeat=\"lb in service.status.loadBalancer.ingress\">\n                {{lb.ip || lb.hostname}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Session Affinity</td>\n            <td class=\"value\">\n              {{service.spec.sessionAffinity}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in service.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr ng-show=\"service.spec.selector\">\n            <td class=\"name\">Selector</td>\n            <td class=\"value\">\n              <span ng-repeat=\"(label, value) in service.spec.selector\">\n                {{label}}={{value}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{service.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Pods</td>\n            <td class=\"value\">\n              <div ng-show=\"service.spec.selector && Object.keys(service.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(service.spec.selector)}},type=pod\">{{getSelectorUrlFragment(service.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in service.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=pod\">{{label}}={{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Replication Controllers</td>\n            <td class=\"value\">\n              <div ng-show=\"service.spec.selector && Object.keys(service.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(service.spec.selector)}},type=replicationController\">{{getSelectorUrlFragment(service.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in service.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=replicationController\">{{label}}={{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n\n  </div>\n</div>\n<div dashboard-footer></div>\n`)\n\nfunc appComponentsDashboardViewsServiceHtmlBytes() ([]byte, error) {\n\treturn _appComponentsDashboardViewsServiceHtml, nil\n}\n\nfunc appComponentsDashboardViewsServiceHtml() (*asset, error) {\n\tbytes, err := appComponentsDashboardViewsServiceHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/components/dashboard/views/service.html\", size: 3967, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appIndexHtml = []byte(`<!DOCTYPE html>\n<html lang=\"en\" ng-app=\"kubernetesApp\" ng-strict-di>\n\n<head>\n    <title>Kubernetes UI</title>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\" />\n    <link rel=\"stylesheet\" href=\"vendor/angular-material/angular-material.css\">\n    <link rel=\"stylesheet\" href=\"assets/css/app.css\">\n    <link rel=\"shortcut icon\" href=\"assets/img/icons/favicon.png\" type=\"image/vnd.microsoft.icon\" />\n</head>\n\n<body layout=\"row\" ng-controller=\"PageCtrl\">\n    <md-sidenav layout=\"column\" md-is-locked-open=\"shouldLockOpen()\" style=\"overflow: hidden; display: flex;\" class=\"site-sidenav md-sidenav-left md-whiteframe-z2\" md-component-id=\"left\" md-closed>\n        <md-toolbar>\n            <h1 class=\"md-toolbar-tools\">\n                <a ng-href=\"#/dashboard\" layout=\"row\" flex>\n                    <span class=\"kubernetes-ui-logo\"></span>\n                    <div style=\"line-height:40px; text-indent: 15px;\">Kubernetes</div>\n                </a>\n            </h1>\n        </md-toolbar>\n        <md-content flex>\n            <div kubernetes-ui-menu role=\"kubernetes-ui-menu\"></div>\n            <div compile=\"sidenavLeft\"></div>\n        </md-content>\n    </md-sidenav>\n    <div layout=\"column\" layout-fill tabIndex=\"-1\" role=\"main\" flex>\n        <md-toolbar>\n            <div class=\"md-toolbar-tools\">\n                <h1 class=\"md-toolbar-tools\">\n                    <a ng-href=\"#/dashboard\" layout=\"row\" flex>\n                        <span class=\"kubernetes-ui-logo\"></span>\n                        <div style=\"line-height:40px; text-indent: 15px;\">Kubernetes</div>\n                    </a>\n                </h1>\n            </div>\n        </md-toolbar>\n        <md-content md-scroll-y flex>\n            <md-whiteframe layout layout-align=\"center center\">\n                <div ng-controller=\"TabCtrl\" class=\"tabsDefaultTabs\">\n                    <md-tabs md-selected=\"0\">\n                        <md-tab ng-repeat=\"tab in tabs\" md-on-select=\"switchTab($index)\" label=\"{{tab.title}}\">\n                            <div class=\"demo-tab tab{{$index%4}}\" layout=\"column\" layout-fill></div>\n                        </md-tab>\n                    </md-tabs>\n                    <div ng-view layout=\"column\" layout-fill role=\"main\"></div>\n                </div>\n            </md-whiteframe>\n        </md-content>\n    </div>\n    <script src=\"assets/js/base.js\"></script>\n    <script src=\"assets/js/app.js\"></script>\n</body>\n\n</html>\n`)\n\nfunc appIndexHtmlBytes() ([]byte, error) {\n\treturn _appIndexHtml, nil\n}\n\nfunc appIndexHtml() (*asset, error) {\n\tbytes, err := appIndexHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/index.html\", size: 2582, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appVendorAngularJsonHumanDistAngularJsonHumanCss = []byte(`.jh-key,.jh-root,.jh-root tr,.jh-type-array,.jh-type-object,.jh-value{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.jh-key,.jh-value{margin:0;padding:.2em}.jh-value{border-left:1px solid #ddd}.jh-type-bool,.jh-type-number{font-weight:700;text-align:center;color:#5286BC}.jh-type-string{font-style:italic;color:#839B00}.jh-array-key{font-style:italic;font-size:small;text-align:center}.jh-array-key,.jh-object-key{color:#444;vertical-align:top}.jh-type-array>tbody>tr:nth-child(odd),.jh-type-object>tbody>tr:nth-child(odd){background-color:#f5f5f5}.jh-type-array>tbody>tr:nth-child(even),.jh-type-object>tbody>tr:nth-child(even){background-color:#fff}.jh-type-array,.jh-type-object{width:100%;border-collapse:collapse}.jh-root{border:1px solid #ccc;margin:.2em}th.jh-key{text-align:left}.jh-type-array>tbody>tr,.jh-type-object>tbody>tr{border:1px solid #ddd;border-bottom:none}.jh-type-array>tbody>tr:last-child,.jh-type-object>tbody>tr:last-child{border-bottom:1px solid #ddd}.jh-type-array>tbody>tr:hover,.jh-type-object>tbody>tr:hover{border:1px solid #F99927}.jh-empty{font-style:italic;color:#999;font-size:small}`)\n\nfunc appVendorAngularJsonHumanDistAngularJsonHumanCssBytes() ([]byte, error) {\n\treturn _appVendorAngularJsonHumanDistAngularJsonHumanCss, nil\n}\n\nfunc appVendorAngularJsonHumanDistAngularJsonHumanCss() (*asset, error) {\n\tbytes, err := appVendorAngularJsonHumanDistAngularJsonHumanCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/vendor/angular-json-human/dist/angular-json-human.css\", size: 1151, mode: os.FileMode(416), modTime: time.Unix(1454116417, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appVendorAngularMaterialAngularMaterialCss = []byte(`/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */*,:after,:before{box-sizing:border-box}:focus{outline:0}body,html{height:100%;color:rgba(0,0,0,.87);background:#fff;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body p,html p{line-height:1.846}body h3,html h3{display:block;-webkit-margin-before:1em;-webkit-margin-after:1em;-webkit-margin-start:0;-webkit-margin-end:0;font-size:1.17em;font-weight:700}button,html,input,select,textarea{font-family:RobotoDraft,Roboto,'Helvetica Neue',sans-serif}body{margin:0;padding:0;outline:0}.inset{padding:10px}a{background:0 0;outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.75em;margin:2.33em 0}button,input,select,textarea{margin:0;font-size:100%;font-family:inherit;vertical-align:baseline}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default}textarea{vertical-align:top;overflow:auto}input[type=checkbox],input[type=radio]{padding:0;box-sizing:border-box}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box;-webkit-box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;text-transform:none;width:1px}.md-shadow{position:absolute;top:0;left:0;bottom:0;right:0;border-radius:inherit;pointer-events:none}.md-button.md-fab,.md-button.md-raised:not([disabled]),.md-shadow-bottom-z-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}.md-button.md-fab:not([disabled]):focus,.md-button.md-fab:not([disabled]):hover,.md-button.md-raised:not([disabled]):focus,.md-button.md-raised:not([disabled]):hover,.md-shadow-bottom-z-2{box-shadow:0 4px 8px 0 rgba(0,0,0,.4)}.md-shadow-animated.md-shadow{transition:box-shadow .28s cubic-bezier(.4,0,.2,1)}.md-ripple-container{pointer-events:none;position:absolute;overflow:hidden;left:0;top:0;width:100%;height:100%;transition:all .55s cubic-bezier(.25,.8,.25,1)}.md-ripple{position:absolute;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;opacity:0;border-radius:50%}.md-ripple.md-ripple-placed{transition:left .9s cubic-bezier(.25,.8,.25,1),top .9s cubic-bezier(.25,.8,.25,1),margin .65s cubic-bezier(.25,.8,.25,1),border .65s cubic-bezier(.25,.8,.25,1),width .65s cubic-bezier(.25,.8,.25,1),height .65s cubic-bezier(.25,.8,.25,1),opacity .65s cubic-bezier(.25,.8,.25,1),-webkit-transform .65s cubic-bezier(.25,.8,.25,1);transition:left .9s cubic-bezier(.25,.8,.25,1),top .9s cubic-bezier(.25,.8,.25,1),margin .65s cubic-bezier(.25,.8,.25,1),border .65s cubic-bezier(.25,.8,.25,1),width .65s cubic-bezier(.25,.8,.25,1),height .65s cubic-bezier(.25,.8,.25,1),opacity .65s cubic-bezier(.25,.8,.25,1),transform .65s cubic-bezier(.25,.8,.25,1)}.md-ripple.md-ripple-scaled{-webkit-transform:scale(1);transform:scale(1)}.md-ripple.md-ripple-active,.md-ripple.md-ripple-full,.md-ripple.md-ripple-visible{opacity:.2}md-tab>.md-ripple-container .md-ripple{box-sizing:content-box;background-color:transparent!important;border-width:0;border-style:solid;opacity:.2;-webkit-transform:none!important;transform:none!important}md-tab>.md-ripple-container .md-ripple.md-ripple-active,md-tab>.md-ripple-container .md-ripple.md-ripple-full,md-tab>.md-ripple-container .md-ripple.md-ripple-visible{opacity:.2}[layout]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[layout-padding],[layout-padding]>[flex]{padding:8px}[layout-margin],[layout-margin]>[flex]{margin:8px}[layout-wrap]{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}[layout-fill]{margin:0;min-height:100%;width:100%}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:auto;height:inherit}}[flex]{-webkit-flex:1;-ms-flex:1;flex:1}[flex=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex=\"0\"]{max-width:0}[layout=column]>[flex=\"0\"]{max-height:0}[flex=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex=\"5\"]{max-width:5%}[layout=column]>[flex=\"5\"]{max-height:5%}[flex=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex=\"10\"]{max-width:10%}[layout=column]>[flex=\"10\"]{max-height:10%}[flex=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex=\"15\"]{max-width:15%}[layout=column]>[flex=\"15\"]{max-height:15%}[flex=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex=\"20\"]{max-width:20%}[layout=column]>[flex=\"20\"]{max-height:20%}[flex=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex=\"25\"]{max-width:25%}[layout=column]>[flex=\"25\"]{max-height:25%}[flex=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex=\"30\"]{max-width:30%}[layout=column]>[flex=\"30\"]{max-height:30%}[flex=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex=\"35\"]{max-width:35%}[layout=column]>[flex=\"35\"]{max-height:35%}[flex=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex=\"40\"]{max-width:40%}[layout=column]>[flex=\"40\"]{max-height:40%}[flex=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex=\"45\"]{max-width:45%}[layout=column]>[flex=\"45\"]{max-height:45%}[flex=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex=\"50\"]{max-width:50%}[layout=column]>[flex=\"50\"]{max-height:50%}[flex=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex=\"55\"]{max-width:55%}[layout=column]>[flex=\"55\"]{max-height:55%}[flex=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex=\"60\"]{max-width:60%}[layout=column]>[flex=\"60\"]{max-height:60%}[flex=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex=\"65\"]{max-width:65%}[layout=column]>[flex=\"65\"]{max-height:65%}[flex=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex=\"70\"]{max-width:70%}[layout=column]>[flex=\"70\"]{max-height:70%}[flex=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex=\"75\"]{max-width:75%}[layout=column]>[flex=\"75\"]{max-height:75%}[flex=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex=\"80\"]{max-width:80%}[layout=column]>[flex=\"80\"]{max-height:80%}[flex=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex=\"85\"]{max-width:85%}[layout=column]>[flex=\"85\"]{max-height:85%}[flex=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex=\"90\"]{max-width:90%}[layout=column]>[flex=\"90\"]{max-height:90%}[flex=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex=\"95\"]{max-width:95%}[layout=column]>[flex=\"95\"]{max-height:95%}[flex=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex=\"100\"]{max-width:100%}[layout=column]>[flex=\"100\"]{max-height:100%}[layout=row]>[flex=\"33\"],[layout=row]>[flex=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex=\"66\"],[layout=row]>[flex=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex=\"33\"],[layout=column]>[flex=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex=\"66\"],[layout=column]>[flex=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}[layout-align=\"center center\"],[layout-align=\"center start\"],[layout-align=\"center end\"],[layout-align=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align=\"end center\"],[layout-align=\"end start\"],[layout-align=\"end end\"],[layout-align=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align=\"space-around center\"],[layout-align=\"space-around start\"],[layout-align=\"space-around end\"],[layout-align=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align=\"space-between center\"],[layout-align=\"space-between start\"],[layout-align=\"space-between end\"],[layout-align=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align=\"center center\"],[layout-align=\"end center\"],[layout-align=\"space-around center\"],[layout-align=\"space-between center\"],[layout-align=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align=\"center start\"],[layout-align=\"end start\"],[layout-align=\"space-around start\"],[layout-align=\"space-between start\"],[layout-align=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align=\"center end\"],[layout-align=\"end end\"],[layout-align=\"space-around end\"],[layout-align=\"space-between end\"],[layout-align=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[flex-order=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}@media (max-width:599px){[hide-sm]:not([show-sm]):not([show]),[hide]:not([show-sm]):not([show]){display:none}[flex-order-sm=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-sm=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-sm=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-sm=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-sm=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-sm=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-sm=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-sm=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-sm=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-sm=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-sm=\"center center\"],[layout-align-sm=\"center start\"],[layout-align-sm=\"center end\"],[layout-align-sm=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-sm=\"end center\"],[layout-align-sm=\"end start\"],[layout-align-sm=\"end end\"],[layout-align-sm=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-sm=\"space-around center\"],[layout-align-sm=\"space-around start\"],[layout-align-sm=\"space-around end\"],[layout-align-sm=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-sm=\"space-between center\"],[layout-align-sm=\"space-between start\"],[layout-align-sm=\"space-between end\"],[layout-align-sm=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-sm=\"center center\"],[layout-align-sm=\"end center\"],[layout-align-sm=\"space-around center\"],[layout-align-sm=\"space-between center\"],[layout-align-sm=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-sm=\"center start\"],[layout-align-sm=\"end start\"],[layout-align-sm=\"space-around start\"],[layout-align-sm=\"space-between start\"],[layout-align-sm=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-sm=\"center end\"],[layout-align-sm=\"end end\"],[layout-align-sm=\"space-around end\"],[layout-align-sm=\"space-between end\"],[layout-align-sm=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-sm]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-sm=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-sm=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-sm]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-sm=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-sm=\"0\"]{max-width:0}[layout=column]>[flex-sm=\"0\"]{max-height:0}[flex-sm=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-sm=\"5\"]{max-width:5%}[layout=column]>[flex-sm=\"5\"]{max-height:5%}[flex-sm=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-sm=\"10\"]{max-width:10%}[layout=column]>[flex-sm=\"10\"]{max-height:10%}[flex-sm=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-sm=\"15\"]{max-width:15%}[layout=column]>[flex-sm=\"15\"]{max-height:15%}[flex-sm=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-sm=\"20\"]{max-width:20%}[layout=column]>[flex-sm=\"20\"]{max-height:20%}[flex-sm=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-sm=\"25\"]{max-width:25%}[layout=column]>[flex-sm=\"25\"]{max-height:25%}[flex-sm=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-sm=\"30\"]{max-width:30%}[layout=column]>[flex-sm=\"30\"]{max-height:30%}[flex-sm=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-sm=\"35\"]{max-width:35%}[layout=column]>[flex-sm=\"35\"]{max-height:35%}[flex-sm=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-sm=\"40\"]{max-width:40%}[layout=column]>[flex-sm=\"40\"]{max-height:40%}[flex-sm=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-sm=\"45\"]{max-width:45%}[layout=column]>[flex-sm=\"45\"]{max-height:45%}[flex-sm=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-sm=\"50\"]{max-width:50%}[layout=column]>[flex-sm=\"50\"]{max-height:50%}[flex-sm=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-sm=\"55\"]{max-width:55%}[layout=column]>[flex-sm=\"55\"]{max-height:55%}[flex-sm=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-sm=\"60\"]{max-width:60%}[layout=column]>[flex-sm=\"60\"]{max-height:60%}[flex-sm=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-sm=\"65\"]{max-width:65%}[layout=column]>[flex-sm=\"65\"]{max-height:65%}[flex-sm=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-sm=\"70\"]{max-width:70%}[layout=column]>[flex-sm=\"70\"]{max-height:70%}[flex-sm=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-sm=\"75\"]{max-width:75%}[layout=column]>[flex-sm=\"75\"]{max-height:75%}[flex-sm=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-sm=\"80\"]{max-width:80%}[layout=column]>[flex-sm=\"80\"]{max-height:80%}[flex-sm=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-sm=\"85\"]{max-width:85%}[layout=column]>[flex-sm=\"85\"]{max-height:85%}[flex-sm=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-sm=\"90\"]{max-width:90%}[layout=column]>[flex-sm=\"90\"]{max-height:90%}[flex-sm=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-sm=\"95\"]{max-width:95%}[layout=column]>[flex-sm=\"95\"]{max-height:95%}[flex-sm=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-sm=\"100\"]{max-width:100%}[layout=column]>[flex-sm=\"100\"]{max-height:100%}[layout=row]>[flex-sm=\"33\"],[layout=row]>[flex-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-sm=\"66\"],[layout=row]>[flex-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-sm=\"33\"],[layout=column]>[flex-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-sm=\"66\"],[layout=column]>[flex-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:600px){[flex-order-gt-sm=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-sm=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-sm=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-sm=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-sm=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-sm=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-sm=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-sm=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-sm=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-sm=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-sm=\"center center\"],[layout-align-gt-sm=\"center start\"],[layout-align-gt-sm=\"center end\"],[layout-align-gt-sm=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-sm=\"end center\"],[layout-align-gt-sm=\"end start\"],[layout-align-gt-sm=\"end end\"],[layout-align-gt-sm=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-sm=\"space-around center\"],[layout-align-gt-sm=\"space-around start\"],[layout-align-gt-sm=\"space-around end\"],[layout-align-gt-sm=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-sm=\"space-between center\"],[layout-align-gt-sm=\"space-between start\"],[layout-align-gt-sm=\"space-between end\"],[layout-align-gt-sm=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-sm=\"center center\"],[layout-align-gt-sm=\"end center\"],[layout-align-gt-sm=\"space-around center\"],[layout-align-gt-sm=\"space-between center\"],[layout-align-gt-sm=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-sm=\"center start\"],[layout-align-gt-sm=\"end start\"],[layout-align-gt-sm=\"space-around start\"],[layout-align-gt-sm=\"space-between start\"],[layout-align-gt-sm=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-sm=\"center end\"],[layout-align-gt-sm=\"end end\"],[layout-align-gt-sm=\"space-around end\"],[layout-align-gt-sm=\"space-between end\"],[layout-align-gt-sm=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-sm]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-sm=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-sm=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-sm]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-sm=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-sm=\"0\"]{max-width:0}[layout=column]>[flex-gt-sm=\"0\"]{max-height:0}[flex-gt-sm=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-sm=\"5\"]{max-width:5%}[layout=column]>[flex-gt-sm=\"5\"]{max-height:5%}[flex-gt-sm=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-sm=\"10\"]{max-width:10%}[layout=column]>[flex-gt-sm=\"10\"]{max-height:10%}[flex-gt-sm=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-sm=\"15\"]{max-width:15%}[layout=column]>[flex-gt-sm=\"15\"]{max-height:15%}[flex-gt-sm=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-sm=\"20\"]{max-width:20%}[layout=column]>[flex-gt-sm=\"20\"]{max-height:20%}[flex-gt-sm=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-sm=\"25\"]{max-width:25%}[layout=column]>[flex-gt-sm=\"25\"]{max-height:25%}[flex-gt-sm=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-sm=\"30\"]{max-width:30%}[layout=column]>[flex-gt-sm=\"30\"]{max-height:30%}[flex-gt-sm=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-sm=\"35\"]{max-width:35%}[layout=column]>[flex-gt-sm=\"35\"]{max-height:35%}[flex-gt-sm=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-sm=\"40\"]{max-width:40%}[layout=column]>[flex-gt-sm=\"40\"]{max-height:40%}[flex-gt-sm=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-sm=\"45\"]{max-width:45%}[layout=column]>[flex-gt-sm=\"45\"]{max-height:45%}[flex-gt-sm=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-sm=\"50\"]{max-width:50%}[layout=column]>[flex-gt-sm=\"50\"]{max-height:50%}[flex-gt-sm=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-sm=\"55\"]{max-width:55%}[layout=column]>[flex-gt-sm=\"55\"]{max-height:55%}[flex-gt-sm=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-sm=\"60\"]{max-width:60%}[layout=column]>[flex-gt-sm=\"60\"]{max-height:60%}[flex-gt-sm=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-sm=\"65\"]{max-width:65%}[layout=column]>[flex-gt-sm=\"65\"]{max-height:65%}[flex-gt-sm=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-sm=\"70\"]{max-width:70%}[layout=column]>[flex-gt-sm=\"70\"]{max-height:70%}[flex-gt-sm=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-sm=\"75\"]{max-width:75%}[layout=column]>[flex-gt-sm=\"75\"]{max-height:75%}[flex-gt-sm=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-sm=\"80\"]{max-width:80%}[layout=column]>[flex-gt-sm=\"80\"]{max-height:80%}[flex-gt-sm=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-sm=\"85\"]{max-width:85%}[layout=column]>[flex-gt-sm=\"85\"]{max-height:85%}[flex-gt-sm=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-sm=\"90\"]{max-width:90%}[layout=column]>[flex-gt-sm=\"90\"]{max-height:90%}[flex-gt-sm=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-sm=\"95\"]{max-width:95%}[layout=column]>[flex-gt-sm=\"95\"]{max-height:95%}[flex-gt-sm=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-sm=\"100\"]{max-width:100%}[layout=column]>[flex-gt-sm=\"100\"]{max-height:100%}[layout=row]>[flex-gt-sm=\"33\"],[layout=row]>[flex-gt-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-sm=\"66\"],[layout=row]>[flex-gt-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-sm=\"33\"],[layout=column]>[flex-gt-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-sm=\"66\"],[layout=column]>[flex-gt-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:600px) and (max-width:959px){[hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]),[hide-md]:not([show-md]):not([show]),[hide]:not([show-gt-sm]):not([show-md]):not([show]){display:none}[flex-order-md=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-md=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-md=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-md=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-md=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-md=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-md=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-md=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-md=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-md=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-md=\"center center\"],[layout-align-md=\"center start\"],[layout-align-md=\"center end\"],[layout-align-md=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-md=\"end center\"],[layout-align-md=\"end start\"],[layout-align-md=\"end end\"],[layout-align-md=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-md=\"space-around center\"],[layout-align-md=\"space-around start\"],[layout-align-md=\"space-around end\"],[layout-align-md=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-md=\"space-between center\"],[layout-align-md=\"space-between start\"],[layout-align-md=\"space-between end\"],[layout-align-md=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-md=\"center center\"],[layout-align-md=\"end center\"],[layout-align-md=\"space-around center\"],[layout-align-md=\"space-between center\"],[layout-align-md=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-md=\"center start\"],[layout-align-md=\"end start\"],[layout-align-md=\"space-around start\"],[layout-align-md=\"space-between start\"],[layout-align-md=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-md=\"center end\"],[layout-align-md=\"end end\"],[layout-align-md=\"space-around end\"],[layout-align-md=\"space-between end\"],[layout-align-md=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-md]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-md=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-md=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-md]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-md=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-md=\"0\"]{max-width:0}[layout=column]>[flex-md=\"0\"]{max-height:0}[flex-md=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-md=\"5\"]{max-width:5%}[layout=column]>[flex-md=\"5\"]{max-height:5%}[flex-md=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-md=\"10\"]{max-width:10%}[layout=column]>[flex-md=\"10\"]{max-height:10%}[flex-md=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-md=\"15\"]{max-width:15%}[layout=column]>[flex-md=\"15\"]{max-height:15%}[flex-md=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-md=\"20\"]{max-width:20%}[layout=column]>[flex-md=\"20\"]{max-height:20%}[flex-md=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-md=\"25\"]{max-width:25%}[layout=column]>[flex-md=\"25\"]{max-height:25%}[flex-md=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-md=\"30\"]{max-width:30%}[layout=column]>[flex-md=\"30\"]{max-height:30%}[flex-md=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-md=\"35\"]{max-width:35%}[layout=column]>[flex-md=\"35\"]{max-height:35%}[flex-md=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-md=\"40\"]{max-width:40%}[layout=column]>[flex-md=\"40\"]{max-height:40%}[flex-md=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-md=\"45\"]{max-width:45%}[layout=column]>[flex-md=\"45\"]{max-height:45%}[flex-md=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-md=\"50\"]{max-width:50%}[layout=column]>[flex-md=\"50\"]{max-height:50%}[flex-md=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-md=\"55\"]{max-width:55%}[layout=column]>[flex-md=\"55\"]{max-height:55%}[flex-md=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-md=\"60\"]{max-width:60%}[layout=column]>[flex-md=\"60\"]{max-height:60%}[flex-md=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-md=\"65\"]{max-width:65%}[layout=column]>[flex-md=\"65\"]{max-height:65%}[flex-md=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-md=\"70\"]{max-width:70%}[layout=column]>[flex-md=\"70\"]{max-height:70%}[flex-md=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-md=\"75\"]{max-width:75%}[layout=column]>[flex-md=\"75\"]{max-height:75%}[flex-md=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-md=\"80\"]{max-width:80%}[layout=column]>[flex-md=\"80\"]{max-height:80%}[flex-md=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-md=\"85\"]{max-width:85%}[layout=column]>[flex-md=\"85\"]{max-height:85%}[flex-md=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-md=\"90\"]{max-width:90%}[layout=column]>[flex-md=\"90\"]{max-height:90%}[flex-md=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-md=\"95\"]{max-width:95%}[layout=column]>[flex-md=\"95\"]{max-height:95%}[flex-md=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-md=\"100\"]{max-width:100%}[layout=column]>[flex-md=\"100\"]{max-height:100%}[layout=row]>[flex-md=\"33\"],[layout=row]>[flex-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-md=\"66\"],[layout=row]>[flex-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-md=\"33\"],[layout=column]>[flex-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-md=\"66\"],[layout=column]>[flex-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:960px){[flex-order-gt-md=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-md=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-md=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-md=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-md=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-md=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-md=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-md=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-md=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-md=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-md=\"center center\"],[layout-align-gt-md=\"center start\"],[layout-align-gt-md=\"center end\"],[layout-align-gt-md=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-md=\"end center\"],[layout-align-gt-md=\"end start\"],[layout-align-gt-md=\"end end\"],[layout-align-gt-md=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-md=\"space-around center\"],[layout-align-gt-md=\"space-around start\"],[layout-align-gt-md=\"space-around end\"],[layout-align-gt-md=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-md=\"space-between center\"],[layout-align-gt-md=\"space-between start\"],[layout-align-gt-md=\"space-between end\"],[layout-align-gt-md=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-md=\"center center\"],[layout-align-gt-md=\"end center\"],[layout-align-gt-md=\"space-around center\"],[layout-align-gt-md=\"space-between center\"],[layout-align-gt-md=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-md=\"center start\"],[layout-align-gt-md=\"end start\"],[layout-align-gt-md=\"space-around start\"],[layout-align-gt-md=\"space-between start\"],[layout-align-gt-md=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-md=\"center end\"],[layout-align-gt-md=\"end end\"],[layout-align-gt-md=\"space-around end\"],[layout-align-gt-md=\"space-between end\"],[layout-align-gt-md=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-md]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-md=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-md=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-md]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-md=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-md=\"0\"]{max-width:0}[layout=column]>[flex-gt-md=\"0\"]{max-height:0}[flex-gt-md=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-md=\"5\"]{max-width:5%}[layout=column]>[flex-gt-md=\"5\"]{max-height:5%}[flex-gt-md=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-md=\"10\"]{max-width:10%}[layout=column]>[flex-gt-md=\"10\"]{max-height:10%}[flex-gt-md=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-md=\"15\"]{max-width:15%}[layout=column]>[flex-gt-md=\"15\"]{max-height:15%}[flex-gt-md=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-md=\"20\"]{max-width:20%}[layout=column]>[flex-gt-md=\"20\"]{max-height:20%}[flex-gt-md=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-md=\"25\"]{max-width:25%}[layout=column]>[flex-gt-md=\"25\"]{max-height:25%}[flex-gt-md=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-md=\"30\"]{max-width:30%}[layout=column]>[flex-gt-md=\"30\"]{max-height:30%}[flex-gt-md=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-md=\"35\"]{max-width:35%}[layout=column]>[flex-gt-md=\"35\"]{max-height:35%}[flex-gt-md=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-md=\"40\"]{max-width:40%}[layout=column]>[flex-gt-md=\"40\"]{max-height:40%}[flex-gt-md=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-md=\"45\"]{max-width:45%}[layout=column]>[flex-gt-md=\"45\"]{max-height:45%}[flex-gt-md=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-md=\"50\"]{max-width:50%}[layout=column]>[flex-gt-md=\"50\"]{max-height:50%}[flex-gt-md=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-md=\"55\"]{max-width:55%}[layout=column]>[flex-gt-md=\"55\"]{max-height:55%}[flex-gt-md=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-md=\"60\"]{max-width:60%}[layout=column]>[flex-gt-md=\"60\"]{max-height:60%}[flex-gt-md=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-md=\"65\"]{max-width:65%}[layout=column]>[flex-gt-md=\"65\"]{max-height:65%}[flex-gt-md=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-md=\"70\"]{max-width:70%}[layout=column]>[flex-gt-md=\"70\"]{max-height:70%}[flex-gt-md=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-md=\"75\"]{max-width:75%}[layout=column]>[flex-gt-md=\"75\"]{max-height:75%}[flex-gt-md=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-md=\"80\"]{max-width:80%}[layout=column]>[flex-gt-md=\"80\"]{max-height:80%}[flex-gt-md=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-md=\"85\"]{max-width:85%}[layout=column]>[flex-gt-md=\"85\"]{max-height:85%}[flex-gt-md=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-md=\"90\"]{max-width:90%}[layout=column]>[flex-gt-md=\"90\"]{max-height:90%}[flex-gt-md=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-md=\"95\"]{max-width:95%}[layout=column]>[flex-gt-md=\"95\"]{max-height:95%}[flex-gt-md=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-md=\"100\"]{max-width:100%}[layout=column]>[flex-gt-md=\"100\"]{max-height:100%}[layout=row]>[flex-gt-md=\"33\"],[layout=row]>[flex-gt-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-md=\"66\"],[layout=row]>[flex-gt-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-md=\"33\"],[layout=column]>[flex-gt-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-md=\"66\"],[layout=column]>[flex-gt-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:960px) and (max-width:1199px){[hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]),[hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]),[hide-lg]:not([show-lg]):not([show]),[hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]){display:none}[flex-order-lg=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-lg=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-lg=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-lg=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-lg=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-lg=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-lg=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-lg=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-lg=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-lg=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-lg=\"center center\"],[layout-align-lg=\"center start\"],[layout-align-lg=\"center end\"],[layout-align-lg=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-lg=\"end center\"],[layout-align-lg=\"end start\"],[layout-align-lg=\"end end\"],[layout-align-lg=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-lg=\"space-around center\"],[layout-align-lg=\"space-around start\"],[layout-align-lg=\"space-around end\"],[layout-align-lg=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-lg=\"space-between center\"],[layout-align-lg=\"space-between start\"],[layout-align-lg=\"space-between end\"],[layout-align-lg=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-lg=\"center center\"],[layout-align-lg=\"end center\"],[layout-align-lg=\"space-around center\"],[layout-align-lg=\"space-between center\"],[layout-align-lg=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-lg=\"center start\"],[layout-align-lg=\"end start\"],[layout-align-lg=\"space-around start\"],[layout-align-lg=\"space-between start\"],[layout-align-lg=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-lg=\"center end\"],[layout-align-lg=\"end end\"],[layout-align-lg=\"space-around end\"],[layout-align-lg=\"space-between end\"],[layout-align-lg=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-lg]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-lg=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-lg=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-lg]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-lg=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-lg=\"0\"]{max-width:0}[layout=column]>[flex-lg=\"0\"]{max-height:0}[flex-lg=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-lg=\"5\"]{max-width:5%}[layout=column]>[flex-lg=\"5\"]{max-height:5%}[flex-lg=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-lg=\"10\"]{max-width:10%}[layout=column]>[flex-lg=\"10\"]{max-height:10%}[flex-lg=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-lg=\"15\"]{max-width:15%}[layout=column]>[flex-lg=\"15\"]{max-height:15%}[flex-lg=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-lg=\"20\"]{max-width:20%}[layout=column]>[flex-lg=\"20\"]{max-height:20%}[flex-lg=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-lg=\"25\"]{max-width:25%}[layout=column]>[flex-lg=\"25\"]{max-height:25%}[flex-lg=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-lg=\"30\"]{max-width:30%}[layout=column]>[flex-lg=\"30\"]{max-height:30%}[flex-lg=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-lg=\"35\"]{max-width:35%}[layout=column]>[flex-lg=\"35\"]{max-height:35%}[flex-lg=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-lg=\"40\"]{max-width:40%}[layout=column]>[flex-lg=\"40\"]{max-height:40%}[flex-lg=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-lg=\"45\"]{max-width:45%}[layout=column]>[flex-lg=\"45\"]{max-height:45%}[flex-lg=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-lg=\"50\"]{max-width:50%}[layout=column]>[flex-lg=\"50\"]{max-height:50%}[flex-lg=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-lg=\"55\"]{max-width:55%}[layout=column]>[flex-lg=\"55\"]{max-height:55%}[flex-lg=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-lg=\"60\"]{max-width:60%}[layout=column]>[flex-lg=\"60\"]{max-height:60%}[flex-lg=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-lg=\"65\"]{max-width:65%}[layout=column]>[flex-lg=\"65\"]{max-height:65%}[flex-lg=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-lg=\"70\"]{max-width:70%}[layout=column]>[flex-lg=\"70\"]{max-height:70%}[flex-lg=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-lg=\"75\"]{max-width:75%}[layout=column]>[flex-lg=\"75\"]{max-height:75%}[flex-lg=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-lg=\"80\"]{max-width:80%}[layout=column]>[flex-lg=\"80\"]{max-height:80%}[flex-lg=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-lg=\"85\"]{max-width:85%}[layout=column]>[flex-lg=\"85\"]{max-height:85%}[flex-lg=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-lg=\"90\"]{max-width:90%}[layout=column]>[flex-lg=\"90\"]{max-height:90%}[flex-lg=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-lg=\"95\"]{max-width:95%}[layout=column]>[flex-lg=\"95\"]{max-height:95%}[flex-lg=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-lg=\"100\"]{max-width:100%}[layout=column]>[flex-lg=\"100\"]{max-height:100%}[layout=row]>[flex-lg=\"33\"],[layout=row]>[flex-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-lg=\"66\"],[layout=row]>[flex-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-lg=\"33\"],[layout=column]>[flex-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-lg=\"66\"],[layout=column]>[flex-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:1200px){[hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]){display:none}[flex-order-gt-lg=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-lg=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-lg=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-lg=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-lg=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-lg=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-lg=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-lg=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-lg=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-lg=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-lg=\"center center\"],[layout-align-gt-lg=\"center start\"],[layout-align-gt-lg=\"center end\"],[layout-align-gt-lg=center]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-lg=\"end center\"],[layout-align-gt-lg=\"end start\"],[layout-align-gt-lg=\"end end\"],[layout-align-gt-lg=end]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-lg=\"space-around center\"],[layout-align-gt-lg=\"space-around start\"],[layout-align-gt-lg=\"space-around end\"],[layout-align-gt-lg=space-around]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-lg=\"space-between center\"],[layout-align-gt-lg=\"space-between start\"],[layout-align-gt-lg=\"space-between end\"],[layout-align-gt-lg=space-between]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-lg=\"center center\"],[layout-align-gt-lg=\"end center\"],[layout-align-gt-lg=\"space-around center\"],[layout-align-gt-lg=\"space-between center\"],[layout-align-gt-lg=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-lg=\"center start\"],[layout-align-gt-lg=\"end start\"],[layout-align-gt-lg=\"space-around start\"],[layout-align-gt-lg=\"space-between start\"],[layout-align-gt-lg=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-lg=\"center end\"],[layout-align-gt-lg=\"end end\"],[layout-align-gt-lg=\"space-around end\"],[layout-align-gt-lg=\"space-between end\"],[layout-align-gt-lg=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-lg]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-lg=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-lg=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-lg]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-lg=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-lg=\"0\"]{max-width:0}[layout=column]>[flex-gt-lg=\"0\"]{max-height:0}[flex-gt-lg=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-lg=\"5\"]{max-width:5%}[layout=column]>[flex-gt-lg=\"5\"]{max-height:5%}[flex-gt-lg=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-lg=\"10\"]{max-width:10%}[layout=column]>[flex-gt-lg=\"10\"]{max-height:10%}[flex-gt-lg=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-lg=\"15\"]{max-width:15%}[layout=column]>[flex-gt-lg=\"15\"]{max-height:15%}[flex-gt-lg=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-lg=\"20\"]{max-width:20%}[layout=column]>[flex-gt-lg=\"20\"]{max-height:20%}[flex-gt-lg=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-lg=\"25\"]{max-width:25%}[layout=column]>[flex-gt-lg=\"25\"]{max-height:25%}[flex-gt-lg=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-lg=\"30\"]{max-width:30%}[layout=column]>[flex-gt-lg=\"30\"]{max-height:30%}[flex-gt-lg=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-lg=\"35\"]{max-width:35%}[layout=column]>[flex-gt-lg=\"35\"]{max-height:35%}[flex-gt-lg=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-lg=\"40\"]{max-width:40%}[layout=column]>[flex-gt-lg=\"40\"]{max-height:40%}[flex-gt-lg=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-lg=\"45\"]{max-width:45%}[layout=column]>[flex-gt-lg=\"45\"]{max-height:45%}[flex-gt-lg=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-lg=\"50\"]{max-width:50%}[layout=column]>[flex-gt-lg=\"50\"]{max-height:50%}[flex-gt-lg=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-lg=\"55\"]{max-width:55%}[layout=column]>[flex-gt-lg=\"55\"]{max-height:55%}[flex-gt-lg=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-lg=\"60\"]{max-width:60%}[layout=column]>[flex-gt-lg=\"60\"]{max-height:60%}[flex-gt-lg=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-lg=\"65\"]{max-width:65%}[layout=column]>[flex-gt-lg=\"65\"]{max-height:65%}[flex-gt-lg=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-lg=\"70\"]{max-width:70%}[layout=column]>[flex-gt-lg=\"70\"]{max-height:70%}[flex-gt-lg=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-lg=\"75\"]{max-width:75%}[layout=column]>[flex-gt-lg=\"75\"]{max-height:75%}[flex-gt-lg=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-lg=\"80\"]{max-width:80%}[layout=column]>[flex-gt-lg=\"80\"]{max-height:80%}[flex-gt-lg=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-lg=\"85\"]{max-width:85%}[layout=column]>[flex-gt-lg=\"85\"]{max-height:85%}[flex-gt-lg=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-lg=\"90\"]{max-width:90%}[layout=column]>[flex-gt-lg=\"90\"]{max-height:90%}[flex-gt-lg=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-lg=\"95\"]{max-width:95%}[layout=column]>[flex-gt-lg=\"95\"]{max-height:95%}[flex-gt-lg=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-lg=\"100\"]{max-width:100%}[layout=column]>[flex-gt-lg=\"100\"]{max-height:100%}[layout=row]>[flex-gt-lg=\"33\"],[layout=row]>[flex-gt-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-lg=\"66\"],[layout=row]>[flex-gt-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-lg=\"33\"],[layout=column]>[flex-gt-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-lg=\"66\"],[layout=column]>[flex-gt-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@-webkit-keyframes md-autocomplete-list-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear}50%{opacity:0;height:40px;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{height:0;opacity:0}}@keyframes md-autocomplete-list-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear}50%{opacity:0;height:40px;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{height:0;opacity:0}}@-webkit-keyframes md-autocomplete-list-in{0%{opacity:0;height:0;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{opacity:0;height:40px}100%{opacity:1;height:40px}}@keyframes md-autocomplete-list-in{0%{opacity:0;height:0;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{opacity:0;height:40px}100%{opacity:1;height:40px}}md-autocomplete{box-shadow:0 2px 5px rgba(0,0,0,.25);border-radius:2px;display:block;height:40px;position:relative;overflow:visible}md-autocomplete md-autocomplete-wrap{display:block;position:relative;overflow:visible;height:40px}md-autocomplete md-autocomplete-wrap md-progress-linear{position:absolute;bottom:0;left:0;width:100%;height:3px;transition:none}md-autocomplete md-autocomplete-wrap md-progress-linear .md-container{transition:none;top:auto;height:3px}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter{transition:opacity .15s linear}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter.ng-enter-active{opacity:1}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave{transition:opacity .15s linear}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave.ng-leave-active{opacity:0}md-autocomplete input{position:absolute;left:0;top:0;width:100%;box-sizing:border-box;border:none;box-shadow:none;padding:0 15px;font-size:14px;line-height:40px;height:40px;outline:0;z-index:2;background:0 0}md-autocomplete input::-ms-clear{display:none}md-autocomplete button{position:absolute;top:10px;right:10px;line-height:20px;z-index:2;text-align:center;width:20px;height:20px;cursor:pointer;border:none;border-radius:50%;padding:0;font-size:12px;background:0 0}md-autocomplete button:after{content:'';position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;border-radius:50%;-webkit-transform:scale(0);transform:scale(0);opacity:0;transition:all .4s cubic-bezier(.25,.8,.25,1);z-index:-1}md-autocomplete button:focus:after{-webkit-transform:scale(1);transform:scale(1);opacity:1}md-autocomplete button md-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0) scale(.9);transform:translate3d(-50%,-50%,0) scale(.9)}md-autocomplete button md-icon path{stroke-width:0}md-autocomplete button.ng-enter{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .15s ease-out;transition:transform .15s ease-out}md-autocomplete button.ng-enter.ng-enter-active{-webkit-transform:scale(1);transform:scale(1)}md-autocomplete button.ng-leave{transition:-webkit-transform .15s ease-out;transition:transform .15s ease-out}md-autocomplete button.ng-leave.ng-leave-active{-webkit-transform:scale(0);transform:scale(0)}md-autocomplete ul{position:absolute;top:100%;left:0;right:0;box-shadow:0 2px 5px rgba(0,0,0,.25);margin:0;list-style:none;padding:0;overflow:auto;max-height:225.5px;z-index:49}md-autocomplete ul li{border-top:1px solid #ddd;padding:0 15px;line-height:40px;font-size:14px;overflow:hidden;height:40px;transition:background .15s linear;cursor:pointer;margin:0}md-autocomplete ul li.ng-enter,md-autocomplete ul li.ng-hide-remove{transition:none;-webkit-animation:md-autocomplete-list-in .2s;animation:md-autocomplete-list-in .2s}md-autocomplete ul li.ng-hide-add,md-autocomplete ul li.ng-leave{transition:none;-webkit-animation:md-autocomplete-list-out .2s;animation:md-autocomplete-list-out .2s}md-backdrop{z-index:50;background-color:transparent;position:fixed;left:0;top:0;right:0;bottom:0}md-backdrop.md-select-backdrop{z-index:81}md-backdrop.md-dialog-backdrop{z-index:79}md-backdrop.md-bottom-sheet-backdrop{z-index:69}md-backdrop.md-sidenav-backdrop{z-index:59}md-backdrop.ng-enter{-webkit-animation:cubic-bezier(.25,.8,.25,1) mdBackdropFadeIn .5s both;animation:cubic-bezier(.25,.8,.25,1) mdBackdropFadeIn .5s both}md-backdrop.ng-leave{-webkit-animation:cubic-bezier(.55,0,.55,.2) mdBackdropFadeOut .2s both;animation:cubic-bezier(.55,0,.55,.2) mdBackdropFadeOut .2s both}@-webkit-keyframes mdBackdropFadeIn{from{opacity:0}to{opacity:1}}@keyframes mdBackdropFadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes mdBackdropFadeOut{from{opacity:1}to{opacity:0}}@keyframes mdBackdropFadeOut{from{opacity:1}to{opacity:0}}md-bottom-sheet{position:absolute;left:0;right:0;bottom:0;padding:8px 16px 88px;z-index:70;border-top:1px solid;-webkit-transform:translate3d(0,80px,0);transform:translate3d(0,80px,0);transition:all .4s cubic-bezier(.25,.8,.25,1);transition-property:-webkit-transform;transition-property:transform}md-bottom-sheet.md-has-header{padding-top:0}md-bottom-sheet.ng-enter{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}md-bottom-sheet.ng-enter-active{opacity:1;display:block;-webkit-transform:translate3d(0,80px,0)!important;transform:translate3d(0,80px,0)!important}md-bottom-sheet.ng-leave-active{-webkit-transform:translate3d(0,100%,0)!important;transform:translate3d(0,100%,0)!important;transition:all .3s cubic-bezier(.55,0,.55,.2)}md-bottom-sheet .md-subheader{background-color:transparent;font-family:RobotoDraft,Roboto,'Helvetica Neue',sans-serif;line-height:56px;padding:0;white-space:nowrap}md-bottom-sheet md-inline-icon{display:inline-block;height:24px;width:24px;fill:#444}md-bottom-sheet md-item{display:-webkit-flex;display:-ms-flexbox;display:flex;outline:0}md-bottom-sheet md-item:hover{cursor:pointer}md-bottom-sheet.md-list md-item{-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:48px}md-bottom-sheet.md-list md-item div.md-icon-container{display:inline-block;height:24px;margin-right:32px}md-bottom-sheet.md-grid{padding-left:24px;padding-right:24px;padding-top:0}md-bottom-sheet.md-grid md-list{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;transition:all .5s;-webkit-align-items:center;-ms-flex-align:center;align-items:center}md-bottom-sheet.md-grid md-item{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;transition:all .5s;height:96px;margin-top:8px;margin-bottom:8px}@media screen and (max-width:600px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 33.33333%;-ms-flex:1 1 33.33333%;flex:1 1 33.33333%;max-width:33.33333%}md-bottom-sheet.md-grid md-item:nth-of-type(3n+1){-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}md-bottom-sheet.md-grid md-item:nth-of-type(3n){-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}}@media screen and (min-width:600px) and (max-width:960px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 25%;-ms-flex:1 1 25%;flex:1 1 25%;max-width:25%}}@media screen and (min-width:960px) and (max-width:1200px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 16.66667%;-ms-flex:1 1 16.66667%;flex:1 1 16.66667%;max-width:16.66667%}}@media screen and (min-width:1200px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 14.28571%;-ms-flex:1 1 14.28571%;flex:1 1 14.28571%;max-width:14.28571%}}md-bottom-sheet.md-grid md-item .md-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:48px;padding-bottom:16px}md-bottom-sheet.md-grid md-item .md-grid-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:80px}md-bottom-sheet.md-grid md-item .md-icon-container{display:inline-block;box-sizing:border-box;height:48px;width:48px;margin:0}md-bottom-sheet.md-grid md-item p.md-grid-text{font-weight:300;line-height:16px;font-size:13px;margin:0;white-space:nowrap;width:64px;text-align:center;padding-top:8px}md-card{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-card>:not(md-card-content) img,md-card>img{-webkit-order:0;-ms-flex-order:0;order:0;width:100%}md-card md-card-content{-webkit-order:1;-ms-flex-order:1;order:1;padding:16px}.md-button{color:currentColor;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;outline:0;border:0;padding:6px;margin:0;background:0 0;white-space:nowrap;text-align:center;text-transform:uppercase;font-weight:500;font-style:inherit;font-variant:inherit;font-size:inherit;font-family:inherit;line-height:inherit;text-decoration:none;cursor:pointer;overflow:hidden;transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),-webkit-transform .4s cubic-bezier(.25,.8,.25,1);transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),transform .4s cubic-bezier(.25,.8,.25,1)}.md-button:focus{outline:0}.md-button:hover{text-decoration:none}.md-button.ng-hide{transition:none}.md-button.md-cornered{border-radius:0}.md-button.md-icon{padding:0;background:0 0}.md-button.md-raised{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-button.md-fab{z-index:20;width:56px;height:56px;border-radius:50%;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition:.2s linear;transition-property:-webkit-transform,box-shadow;transition-property:transform,box-shadow}.md-button.md-fab.md-fab-bottom-right{top:auto;right:20px;bottom:20px;left:auto;position:absolute}.md-button.md-fab.md-fab-bottom-left{top:auto;right:auto;bottom:20px;left:20px;position:absolute}.md-button.md-fab.md-fab-top-right{top:20px;right:20px;bottom:auto;left:auto;position:absolute}.md-button.md-fab.md-fab-top-left{top:20px;right:auto;bottom:auto;left:20px;position:absolute}.md-button.md-fab md-icon{margin-top:0}.md-button.md-fab.md-mini{width:40px;height:40px}.md-button:not([disabled]).md-fab:focus,.md-button:not([disabled]).md-fab:hover,.md-button:not([disabled]).md-raised:focus,.md-button:not([disabled]).md-raised:hover{-webkit-transform:translate3d(0,-1px,0);transform:translate3d(0,-1px,0)}.md-toast-open-top .md-button.md-fab-top-left,.md-toast-open-top .md-button.md-fab-top-right{-webkit-transform:translate3d(0,42px,0);transform:translate3d(0,42px,0)}.md-toast-open-top .md-button.md-fab-top-left:not([disabled]):focus,.md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover,.md-toast-open-top .md-button.md-fab-top-right:not([disabled]):focus,.md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover{-webkit-transform:translate3d(0,41px,0);transform:translate3d(0,41px,0)}.md-toast-open-bottom .md-button.md-fab-bottom-left,.md-toast-open-bottom .md-button.md-fab-bottom-right{-webkit-transform:translate3d(0,-42px,0);transform:translate3d(0,-42px,0)}.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):focus,.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover,.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):focus,.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover{-webkit-transform:translate3d(0,-43px,0);transform:translate3d(0,-43px,0)}.md-button-group{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;width:100%}.md-button-group>.md-button{-webkit-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.md-button-group>.md-button:first-child{border-radius:2px 0 0 2px}.md-button-group>.md-button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}md-checkbox{display:block;margin:15px;white-space:nowrap;cursor:pointer;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-checkbox .md-container{position:relative;top:4px;display:inline-block;width:18px;height:18px}md-checkbox .md-container:after{content:'';position:absolute;top:-10px;right:-10px;bottom:-10px;left:-10px}md-checkbox .md-container .md-ripple-container{position:absolute;display:block;width:auto;height:auto;left:-15px;top:-15px;right:-15px;bottom:-15px}md-checkbox .md-icon{transition:240ms;position:absolute;top:0;left:0;width:18px;height:18px;border:2px solid;border-radius:2px}md-checkbox.md-checked .md-icon{border:none}md-checkbox[disabled]{cursor:no-drop}md-checkbox:focus .md-label:not(:empty){border-color:#000}md-checkbox.md-checked .md-icon:after{-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;left:6px;top:2px;display:table;width:6px;height:12px;border:2px solid;border-top:0;border-left:0;content:' '}md-checkbox .md-label{border:1px dotted transparent;position:relative;display:inline-block;margin-left:10px;vertical-align:middle;white-space:normal;pointer-events:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}md-content{display:block;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}md-content[md-scroll-y]{overflow-y:auto;overflow-x:hidden}md-content[md-scroll-x]{overflow-x:auto;overflow-y:hidden}md-content.md-padding{padding:8px}@media (min-width:600px){md-content.md-padding{padding:16px}}.md-dialog-container{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;width:100%;height:100%;z-index:80}md-dialog{opacity:0;min-width:240px;max-width:80%;max-height:80%;position:relative;overflow:hidden;box-shadow:0 27px 24px 0 rgba(0,0,0,.2);display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}md-dialog.transition-in{opacity:1;transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}md-dialog.transition-out{transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate3d(0,100%,0) scale(.2);transform:translate3d(0,100%,0) scale(.2)}md-dialog md-content{-webkit-order:1;-ms-flex-order:1;order:1;padding:24px;overflow:auto;-webkit-overflow-scrolling:touch}md-dialog md-content:not([layout=row])>:first-child:not(.md-subheader){margin-top:0}md-dialog .md-actions{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-order:2;-ms-flex-order:2;order:2;box-sizing:border-box;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:16px;min-height:40px}md-dialog .md-actions>*{margin-left:8px}md-dialog.md-content-overflow .md-actions{border-top:1px solid}md-divider{display:block;border-top:1px solid;margin:0}md-divider[md-inset]{margin-left:80px}md-grid-list{display:block;position:relative}md-grid-list md-grid-tile{display:block;position:absolute}md-grid-list md-grid-tile figure{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0}md-grid-list md-grid-tile md-grid-tile-footer,md-grid-list md-grid-tile md-grid-tile-header{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.18);overflow:hidden;position:absolute;left:0;right:0}md-grid-list md-grid-tile md-grid-tile-footer h3,md-grid-list md-grid-tile md-grid-tile-footer h4,md-grid-list md-grid-tile md-grid-tile-header h3,md-grid-list md-grid-tile md-grid-tile-header h4{font-weight:400;margin:0 0 0 16px}md-grid-list md-grid-tile md-grid-tile-footer h3,md-grid-list md-grid-tile md-grid-tile-header h3{font-size:14px}md-grid-list md-grid-tile md-grid-tile-footer h4,md-grid-list md-grid-tile md-grid-tile-header h4{font-size:12px}md-grid-list md-grid-tile md-grid-tile-header{top:0}md-grid-list md-grid-tile md-grid-tile-footer{bottom:0}md-icon{margin:auto;background-repeat:no-repeat no-repeat;display:inline-block;vertical-align:middle;fill:currentcolor;height:24px;width:24px}md-input-container{display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-x:hidden;padding:2px 2px 26px}md-input-container input[type=color],md-input-container input[type=date],md-input-container input[type=datetime-local],md-input-container input[type=datetime],md-input-container input[type=email],md-input-container input[type=month],md-input-container input[type=number],md-input-container input[type=password],md-input-container input[type=search],md-input-container input[type=tel],md-input-container input[type=text],md-input-container input[type=time],md-input-container input[type=url],md-input-container input[type=week],md-input-container textarea{-moz-appearance:none;-webkit-appearance:none}md-input-container textarea{resize:none;overflow:hidden}md-input-container .md-placeholder,md-input-container label:not(.md-no-float){-webkit-order:1;-ms-flex-order:1;order:1;pointer-events:none;-webkit-font-smoothing:antialiased;padding-left:2px;z-index:1;-webkit-transform:translate3d(0,24px,0) scale(1);transform:translate3d(0,24px,0) scale(1);-webkit-transform-origin:left top;transform-origin:left top;transition:-webkit-transform cubic-bezier(.25,.8,.25,1) .25s;transition:transform cubic-bezier(.25,.8,.25,1) .25s}md-input-container .md-placeholder{position:absolute;top:0;opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;-webkit-transform:translate3d(0,30px,0);transform:translate3d(0,30px,0)}md-input-container.md-input-focused .md-placeholder{opacity:1;-webkit-transform:translate3d(0,24px,0);transform:translate3d(0,24px,0)}md-input-container.md-input-has-value .md-placeholder{transition:none;opacity:0}md-input-container:not(.md-input-has-value) input:not(:focus){color:transparent}md-input-container .md-input{-webkit-flex:1;-ms-flex:1;flex:1;-webkit-order:2;-ms-flex-order:2;order:2;display:block;background:0 0;padding:2px 2px 1px;border-width:0 0 1px;line-height:26px;-ms-flex-preferred-size:26px;border-radius:0}md-input-container .md-input:focus{outline:0}md-input-container .md-input:invalid{outline:0;box-shadow:none}md-input-container [data-ng-messages],md-input-container [ng-messages],md-input-container [x-ng-messages],md-input-container data-ng-messages,md-input-container ng-messages,md-input-container x-ng-messages{-webkit-order:3;-ms-flex-order:3;order:3;position:relative}md-input-container .md-char-counter,md-input-container [data-ng-message],md-input-container [ng-message],md-input-container [x-ng-message],md-input-container data-ng-message,md-input-container ng-message,md-input-container x-ng-message{-webkit-font-smoothing:antialiased;position:absolute;font-size:12px;line-height:24px}md-input-container .md-char-counter.ng-enter,md-input-container [data-ng-message].ng-enter,md-input-container [ng-message].ng-enter,md-input-container [x-ng-message].ng-enter,md-input-container data-ng-message.ng-enter,md-input-container ng-message.ng-enter,md-input-container x-ng-message.ng-enter{transition:all .4s cubic-bezier(.25,.8,.25,1);transition-delay:.2s}md-input-container .md-char-counter.ng-leave,md-input-container [data-ng-message].ng-leave,md-input-container [ng-message].ng-leave,md-input-container [x-ng-message].ng-leave,md-input-container data-ng-message.ng-leave,md-input-container ng-message.ng-leave,md-input-container x-ng-message.ng-leave{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-input-container .md-char-counter.ng-enter,md-input-container .md-char-counter.ng-leave.ng-leave-active,md-input-container [data-ng-message].ng-enter,md-input-container [data-ng-message].ng-leave.ng-leave-active,md-input-container [ng-message].ng-enter,md-input-container [ng-message].ng-leave.ng-leave-active,md-input-container [x-ng-message].ng-enter,md-input-container [x-ng-message].ng-leave.ng-leave-active,md-input-container data-ng-message.ng-enter,md-input-container data-ng-message.ng-leave.ng-leave-active,md-input-container ng-message.ng-enter,md-input-container ng-message.ng-leave.ng-leave-active,md-input-container x-ng-message.ng-enter,md-input-container x-ng-message.ng-leave.ng-leave-active{opacity:0;-webkit-transform:translate3d(0,-20%,0);transform:translate3d(0,-20%,0)}md-input-container .md-char-counter.ng-enter.ng-enter-active,md-input-container .md-char-counter.ng-leave,md-input-container [data-ng-message].ng-enter.ng-enter-active,md-input-container [data-ng-message].ng-leave,md-input-container [ng-message].ng-enter.ng-enter-active,md-input-container [ng-message].ng-leave,md-input-container [x-ng-message].ng-enter.ng-enter-active,md-input-container [x-ng-message].ng-leave,md-input-container data-ng-message.ng-enter.ng-enter-active,md-input-container data-ng-message.ng-leave,md-input-container ng-message.ng-enter.ng-enter-active,md-input-container ng-message.ng-leave,md-input-container x-ng-message.ng-enter.ng-enter-active,md-input-container x-ng-message.ng-leave{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-input-container .md-char-counter{bottom:2px;right:2px}md-input-container.md-input-focused label:not(.md-no-float),md-input-container.md-input-has-value label:not(.md-no-float){-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}md-input-container .md-input.ng-invalid.ng-dirty,md-input-container.md-input-focused .md-input{padding-bottom:0;border-width:0 0 2px}[disabled] md-input-container .md-input,md-input-container .md-input[disabled]{background-position:0 bottom;background-size:3px 1px;background-repeat:repeat-x}md-list{padding:8px 0}md-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;box-sizing:border-box;position:relative;padding:0}.md-tile-left{min-width:56px;margin-right:-16px}.md-tile-content{-webkit-flex:1;-ms-flex:1;flex:1;padding:16px;text-overflow:ellipsis}.md-tile-content h3{margin:0 0 3px;font-weight:400;font-size:1.1em}.md-tile-content h4{margin:0 0 3px;font-weight:400;font-size:.9em}.md-tile-content p{margin:0 0 3px;font-size:.75em}.md-tile-right{padding-right:0}@-webkit-keyframes outer-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes outer-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes left-wobble{0%,100%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@keyframes left-wobble{0%,100%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@-webkit-keyframes right-wobble{0%,100%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@keyframes right-wobble{0%,100%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@-webkit-keyframes sporadic-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes sporadic-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}md-progress-circular{width:50px;height:50px;display:block;position:relative;padding-top:0!important;margin-bottom:0!important;overflow:hidden}md-progress-circular .md-inner{width:50px;height:50px;position:relative}md-progress-circular .md-inner .md-gap{position:absolute;left:24px;right:24px;top:0;bottom:0;border-top:5px solid #000;box-sizing:border-box}md-progress-circular .md-inner .md-left,md-progress-circular .md-inner .md-right{position:absolute;top:0;height:50px;width:25px;overflow:hidden}md-progress-circular .md-inner .md-left .md-half-circle,md-progress-circular .md-inner .md-right .md-half-circle{position:absolute;top:0;width:50px;height:50px;box-sizing:border-box;border-width:5px;border-style:solid;border-color:#000 #000 transparent;border-radius:50%}md-progress-circular .md-inner .md-left{left:0}md-progress-circular .md-inner .md-left .md-half-circle{left:0;border-right-color:transparent}md-progress-circular .md-inner .md-right{right:0}md-progress-circular .md-inner .md-right .md-half-circle{right:0;border-left-color:transparent}md-progress-circular[value=\"0\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"0\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}md-progress-circular[value=\"0\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"1\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"1\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-131.4deg);transform:rotate(-131.4deg)}md-progress-circular[value=\"1\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"2\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"2\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-127.8deg);transform:rotate(-127.8deg)}md-progress-circular[value=\"2\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"3\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"3\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-124.2deg);transform:rotate(-124.2deg)}md-progress-circular[value=\"3\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"4\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"4\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-120.6deg);transform:rotate(-120.6deg)}md-progress-circular[value=\"4\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"5\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"5\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-117deg);transform:rotate(-117deg)}md-progress-circular[value=\"5\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"6\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"6\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-113.4deg);transform:rotate(-113.4deg)}md-progress-circular[value=\"6\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"7\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"7\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-109.8deg);transform:rotate(-109.8deg)}md-progress-circular[value=\"7\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"8\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"8\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-106.2deg);transform:rotate(-106.2deg)}md-progress-circular[value=\"8\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"9\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"9\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-102.6deg);transform:rotate(-102.6deg)}md-progress-circular[value=\"9\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"10\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"10\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-99deg);transform:rotate(-99deg)}md-progress-circular[value=\"10\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"11\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"11\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-95.4deg);transform:rotate(-95.4deg)}md-progress-circular[value=\"11\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"12\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"12\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-91.8deg);transform:rotate(-91.8deg)}md-progress-circular[value=\"12\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"13\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"13\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-88.2deg);transform:rotate(-88.2deg)}md-progress-circular[value=\"13\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"14\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"14\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-84.6deg);transform:rotate(-84.6deg)}md-progress-circular[value=\"14\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"15\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"15\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-81deg);transform:rotate(-81deg)}md-progress-circular[value=\"15\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"16\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"16\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-77.4deg);transform:rotate(-77.4deg)}md-progress-circular[value=\"16\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"17\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"17\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-73.8deg);transform:rotate(-73.8deg)}md-progress-circular[value=\"17\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"18\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"18\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-70.2deg);transform:rotate(-70.2deg)}md-progress-circular[value=\"18\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"19\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"19\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-66.6deg);transform:rotate(-66.6deg)}md-progress-circular[value=\"19\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"20\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"20\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-63deg);transform:rotate(-63deg)}md-progress-circular[value=\"20\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"21\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"21\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-59.4deg);transform:rotate(-59.4deg)}md-progress-circular[value=\"21\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"22\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"22\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-55.8deg);transform:rotate(-55.8deg)}md-progress-circular[value=\"22\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"23\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"23\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-52.2deg);transform:rotate(-52.2deg)}md-progress-circular[value=\"23\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"24\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"24\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-48.6deg);transform:rotate(-48.6deg)}md-progress-circular[value=\"24\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"25\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"25\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}md-progress-circular[value=\"25\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"26\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"26\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-41.4deg);transform:rotate(-41.4deg)}md-progress-circular[value=\"26\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"27\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"27\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-37.8deg);transform:rotate(-37.8deg)}md-progress-circular[value=\"27\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"28\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"28\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-34.2deg);transform:rotate(-34.2deg)}md-progress-circular[value=\"28\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"29\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"29\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-30.6deg);transform:rotate(-30.6deg)}md-progress-circular[value=\"29\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"30\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"30\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-27deg);transform:rotate(-27deg)}md-progress-circular[value=\"30\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"31\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"31\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-23.4deg);transform:rotate(-23.4deg)}md-progress-circular[value=\"31\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"32\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"32\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-19.8deg);transform:rotate(-19.8deg)}md-progress-circular[value=\"32\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"33\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"33\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-16.2deg);transform:rotate(-16.2deg)}md-progress-circular[value=\"33\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"34\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"34\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-12.6deg);transform:rotate(-12.6deg)}md-progress-circular[value=\"34\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"35\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"35\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-9deg);transform:rotate(-9deg)}md-progress-circular[value=\"35\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"36\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"36\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-5.4deg);transform:rotate(-5.4deg)}md-progress-circular[value=\"36\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"37\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"37\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-1.8deg);transform:rotate(-1.8deg)}md-progress-circular[value=\"37\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"38\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"38\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(1.8deg);transform:rotate(1.8deg)}md-progress-circular[value=\"38\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"39\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"39\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(5.4deg);transform:rotate(5.4deg)}md-progress-circular[value=\"39\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"40\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"40\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(9deg);transform:rotate(9deg)}md-progress-circular[value=\"40\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"41\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"41\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(12.6deg);transform:rotate(12.6deg)}md-progress-circular[value=\"41\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"42\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"42\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(16.2deg);transform:rotate(16.2deg)}md-progress-circular[value=\"42\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"43\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"43\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(19.8deg);transform:rotate(19.8deg)}md-progress-circular[value=\"43\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"44\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"44\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(23.4deg);transform:rotate(23.4deg)}md-progress-circular[value=\"44\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"45\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"45\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(27deg);transform:rotate(27deg)}md-progress-circular[value=\"45\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"46\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"46\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(30.6deg);transform:rotate(30.6deg)}md-progress-circular[value=\"46\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"47\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"47\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(34.2deg);transform:rotate(34.2deg)}md-progress-circular[value=\"47\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"48\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"48\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(37.8deg);transform:rotate(37.8deg)}md-progress-circular[value=\"48\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"49\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"49\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(41.4deg);transform:rotate(41.4deg)}md-progress-circular[value=\"49\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"50\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"50\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"50\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"51\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(138.6deg);transform:rotate(138.6deg)}md-progress-circular[value=\"51\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"51\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"52\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(142.2deg);transform:rotate(142.2deg)}md-progress-circular[value=\"52\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"52\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"53\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(145.8deg);transform:rotate(145.8deg)}md-progress-circular[value=\"53\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"53\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"54\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(149.4deg);transform:rotate(149.4deg)}md-progress-circular[value=\"54\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"54\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"55\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(153deg);transform:rotate(153deg)}md-progress-circular[value=\"55\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"55\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"56\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(156.6deg);transform:rotate(156.6deg)}md-progress-circular[value=\"56\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"56\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"57\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(160.2deg);transform:rotate(160.2deg)}md-progress-circular[value=\"57\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"57\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"58\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(163.8deg);transform:rotate(163.8deg)}md-progress-circular[value=\"58\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"58\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"59\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(167.4deg);transform:rotate(167.4deg)}md-progress-circular[value=\"59\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"59\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"60\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(171deg);transform:rotate(171deg)}md-progress-circular[value=\"60\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"60\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"61\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(174.6deg);transform:rotate(174.6deg)}md-progress-circular[value=\"61\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"61\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"62\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(178.2deg);transform:rotate(178.2deg)}md-progress-circular[value=\"62\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"62\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"63\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(181.8deg);transform:rotate(181.8deg)}md-progress-circular[value=\"63\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"63\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"64\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(185.4deg);transform:rotate(185.4deg)}md-progress-circular[value=\"64\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"64\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"65\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(189deg);transform:rotate(189deg)}md-progress-circular[value=\"65\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"65\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"66\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(192.6deg);transform:rotate(192.6deg)}md-progress-circular[value=\"66\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"66\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"67\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(196.2deg);transform:rotate(196.2deg)}md-progress-circular[value=\"67\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"67\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"68\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(199.8deg);transform:rotate(199.8deg)}md-progress-circular[value=\"68\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"68\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"69\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(203.4deg);transform:rotate(203.4deg)}md-progress-circular[value=\"69\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"69\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"70\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(207deg);transform:rotate(207deg)}md-progress-circular[value=\"70\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"70\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"71\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(210.6deg);transform:rotate(210.6deg)}md-progress-circular[value=\"71\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"71\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"72\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(214.2deg);transform:rotate(214.2deg)}md-progress-circular[value=\"72\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"72\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"73\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(217.8deg);transform:rotate(217.8deg)}md-progress-circular[value=\"73\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"73\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"74\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(221.4deg);transform:rotate(221.4deg)}md-progress-circular[value=\"74\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"74\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"75\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(225deg);transform:rotate(225deg)}md-progress-circular[value=\"75\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"75\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"76\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(228.6deg);transform:rotate(228.6deg)}md-progress-circular[value=\"76\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"76\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"77\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(232.2deg);transform:rotate(232.2deg)}md-progress-circular[value=\"77\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"77\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"78\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(235.8deg);transform:rotate(235.8deg)}md-progress-circular[value=\"78\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"78\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"79\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(239.4deg);transform:rotate(239.4deg)}md-progress-circular[value=\"79\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"79\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"80\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(243deg);transform:rotate(243deg)}md-progress-circular[value=\"80\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"80\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"81\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(246.6deg);transform:rotate(246.6deg)}md-progress-circular[value=\"81\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"81\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"82\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(250.2deg);transform:rotate(250.2deg)}md-progress-circular[value=\"82\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"82\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"83\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(253.8deg);transform:rotate(253.8deg)}md-progress-circular[value=\"83\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"83\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"84\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(257.4deg);transform:rotate(257.4deg)}md-progress-circular[value=\"84\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"84\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"85\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(261deg);transform:rotate(261deg)}md-progress-circular[value=\"85\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"85\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"86\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(264.6deg);transform:rotate(264.6deg)}md-progress-circular[value=\"86\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"86\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"87\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(268.2deg);transform:rotate(268.2deg)}md-progress-circular[value=\"87\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"87\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"88\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(271.8deg);transform:rotate(271.8deg)}md-progress-circular[value=\"88\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"88\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"89\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(275.4deg);transform:rotate(275.4deg)}md-progress-circular[value=\"89\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"89\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"90\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(279deg);transform:rotate(279deg)}md-progress-circular[value=\"90\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"90\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"91\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(282.6deg);transform:rotate(282.6deg)}md-progress-circular[value=\"91\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"91\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"92\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(286.2deg);transform:rotate(286.2deg)}md-progress-circular[value=\"92\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"92\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"93\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(289.8deg);transform:rotate(289.8deg)}md-progress-circular[value=\"93\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"93\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"94\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(293.4deg);transform:rotate(293.4deg)}md-progress-circular[value=\"94\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"94\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"95\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(297deg);transform:rotate(297deg)}md-progress-circular[value=\"95\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"95\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"96\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(300.6deg);transform:rotate(300.6deg)}md-progress-circular[value=\"96\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"96\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"97\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(304.2deg);transform:rotate(304.2deg)}md-progress-circular[value=\"97\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"97\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"98\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(307.8deg);transform:rotate(307.8deg)}md-progress-circular[value=\"98\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"98\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"99\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(311.4deg);transform:rotate(311.4deg)}md-progress-circular[value=\"99\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"99\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"100\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(315deg);transform:rotate(315deg)}md-progress-circular[value=\"100\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"100\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper{-webkit-animation:outer-rotate 2.91667s linear infinite;animation:outer-rotate 2.91667s linear infinite}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner{-webkit-animation:sporadic-rotate 5.25s cubic-bezier(.35,0,.25,1) infinite;animation:sporadic-rotate 5.25s cubic-bezier(.35,0,.25,1) infinite}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle,md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.3125s;animation-duration:1.3125s;-webkit-animation-timing-function:cubic-bezier(.35,0,.25,1);animation-timing-function:cubic-bezier(.35,0,.25,1)}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle{-webkit-animation-name:left-wobble;animation-name:left-wobble}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle{-webkit-animation-name:right-wobble;animation-name:right-wobble}md-progress-linear{display:block;width:100%;height:5px}md-progress-linear .md-container{overflow:hidden;position:relative;height:5px;top:5px;-webkit-transform:translate(0,5px) scale(1,0);transform:translate(0,5px) scale(1,0);transition:all .3s linear}md-progress-linear .md-container.md-ready{-webkit-transform:translate(0,0) scale(1,1);transform:translate(0,0) scale(1,1)}md-progress-linear .md-bar{height:5px;position:absolute;width:100%}md-progress-linear .md-bar1,md-progress-linear .md-bar2{transition:all .2s linear}md-progress-linear[md-mode=determinate] .md-bar1{display:none}md-progress-linear[md-mode=indeterminate] .md-bar1{-webkit-animation:indeterminate1 4s infinite linear;animation:indeterminate1 4s infinite linear}md-progress-linear[md-mode=indeterminate] .md-bar2{-webkit-animation:indeterminate2 4s infinite linear;animation:indeterminate2 4s infinite linear}md-progress-linear[md-mode=buffer] .md-container{background-color:transparent!important}md-progress-linear[md-mode=buffer] .md-dashed:before{content:\"\";display:block;height:5px;width:100%;margin-top:0;position:absolute;background-color:transparent;background-size:10px 10px!important;background-position:0 -23px;-webkit-animation:buffer 3s infinite linear;animation:buffer 3s infinite linear}md-progress-linear[md-mode=query] .md-bar2{-webkit-animation:query .8s infinite cubic-bezier(.39,.575,.565,1);animation:query .8s infinite cubic-bezier(.39,.575,.565,1)}@-webkit-keyframes indeterminate1{0%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}10%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}19.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}20%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}30%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}34.99%,36.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}37%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}47%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}52%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}55%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}58%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}61.99%,69.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}70%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}80%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}85%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}88%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}91%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}92.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}93%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}100%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}}@keyframes indeterminate1{0%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}10%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}19.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}20%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}30%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}34.99%,36.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}37%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}47%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}52%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}55%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}58%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}61.99%,69.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}70%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}80%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}85%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}88%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}91%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}92.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}93%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}100%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}}@-webkit-keyframes indeterminate2{0%,25.99%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}28%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}38%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}42.99%,46.99%,49.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}50%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}60%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}70%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}79.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}}@keyframes indeterminate2{0%,25.99%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}28%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}38%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}42.99%,46.99%,49.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}50%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}60%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}70%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}79.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}}@-webkit-keyframes query{0%{opacity:1;-webkit-transform:translateX(35%) scale(.3,1);transform:translateX(35%) scale(.3,1)}100%{opacity:0;-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}}@keyframes query{0%{opacity:1;-webkit-transform:translateX(35%) scale(.3,1);transform:translateX(35%) scale(.3,1)}100%{opacity:0;-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}}@-webkit-keyframes buffer{0%{opacity:1;background-position:0 -23px}50%{opacity:0}100%{opacity:1;background-position:-200px -23px}}@keyframes buffer{0%{opacity:1;background-position:0 -23px}50%{opacity:0}100%{opacity:1;background-position:-200px -23px}}.md-switch-thumb,md-radio-button{display:block;margin:15px;white-space:nowrap;cursor:pointer}.md-switch-thumb input,md-radio-button input{display:none}.md-switch-thumb .md-container,md-radio-button .md-container{position:relative;top:4px;display:inline-block;width:16px;height:16px;cursor:pointer}.md-switch-thumb .md-container .md-ripple-container,md-radio-button .md-container .md-ripple-container{position:absolute;display:block;width:48px;height:48px;left:-16px;top:-16px}.md-switch-thumb .md-off,md-radio-button .md-off{position:absolute;top:0;left:0;width:16px;height:16px;border:2px solid;border-radius:50%;transition:border-color ease .28s}.md-switch-thumb .md-on,md-radio-button .md-on{position:absolute;top:0;left:0;width:16px;height:16px;border-radius:50%;transition:-webkit-transform ease .28s;transition:transform ease .28s;-webkit-transform:scale(0);transform:scale(0)}.md-switch-thumb.md-checked .md-on,md-radio-button.md-checked .md-on{-webkit-transform:scale(.55);transform:scale(.55)}.md-switch-thumb .md-label,md-radio-button .md-label{position:relative;display:inline-block;margin-left:10px;margin-right:10px;vertical-align:middle;white-space:normal;pointer-events:none;width:auto}.md-switch-thumb .circle,md-radio-button .circle{border-radius:50%}md-radio-group{border:1px dotted transparent;display:block;outline:0}.radioButtondemoBasicUsage md-radio-group{border:none}.md-select-menu-container{position:absolute;left:0;top:0;z-index:99;opacity:0}.md-select-menu-container:not(.md-clickable){pointer-events:none}.md-select-menu-container md-progress-circular{display:table;margin:24px auto!important}.md-select-menu-container.md-active{opacity:1}.md-select-menu-container.md-active md-select-menu{transition:-webkit-transform all .4s cubic-bezier(.25,.8,.25,1);transition:transform all .4s cubic-bezier(.25,.8,.25,1);transition-duration:200ms}.md-select-menu-container.md-active md-select-menu>*{opacity:1;transition:all .3s cubic-bezier(.55,0,.55,.2);transition-duration:200ms;transition-delay:100ms}.md-select-menu-container.md-leave{opacity:0;transition:all .3s cubic-bezier(.55,0,.55,.2);transition-duration:250ms}md-select{display:inline-block;margin-top:20px}md-select[disabled]:hover{cursor:default}md-select:not([disabled]):hover{cursor:pointer}md-select:not([disabled]):focus .md-select-label{border-bottom:2px solid;padding-bottom:7px}.md-select-label{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-top:9px;padding-right:32px;padding-bottom:8px;border-bottom:1px solid;font-size:.875em;line-height:.8em;position:relative;box-sizing:border-box;min-width:64px}.md-select-label .md-select-icon:after{content:'\\25BC';display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;height:100%;top:0;right:2px;speak:none;-webkit-transform:scaleY(.6) scaleX(1);transform:scaleY(.6) scaleX(1)}md-select-menu{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;box-shadow:0 2px 5px 0 rgba(0,0,0,.26);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scale(1);transform:scale(1);max-height:256px;overflow-y:scroll}md-select-menu.md-reverse{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}md-select-menu:not(.md-overflow) md-content{padding-top:8px;padding-bottom:8px}md-select-menu md-content{min-width:136px}md-select-menu>*{opacity:0}md-option{cursor:pointer;position:relative;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:auto;padding:0 16px;height:48px}md-option .md-text{width:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:.875em}md-optgroup{display:block}md-optgroup label{display:block;font-size:.75em;text-transform:uppercase;padding:16px 8px}md-optgroup md-option{padding-left:24px}md-sidenav{position:absolute;width:304px;min-width:304px;max-width:304px;bottom:0;z-index:60;background-color:#fff;overflow:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}md-sidenav.md-closed{display:none}md-sidenav.md-closed-add,md-sidenav.md-closed-remove{display:-webkit-flex;display:-ms-flexbox;display:flex;transition:0s all}md-sidenav.md-closed-add.md-closed-add-active,md-sidenav.md-closed-remove.md-closed-remove-active{transition:all .4s cubic-bezier(.25,.8,.25,1)}md-sidenav.md-locked-open-add,md-sidenav.md-locked-open-remove{position:static;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-locked-open{width:304px;min-width:304px;max-width:304px}md-sidenav.md-locked-open,md-sidenav.md-locked-open-remove.md-closed,md-sidenav.md-locked-open.md-closed,md-sidenav.md-locked-open.md-closed.md-sidenav-left,md-sidenav.md-locked-open.md-closed.md-sidenav-right{position:static;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-locked-open-remove-active{transition:width .3s cubic-bezier(.55,0,.55,.2),min-width .3s cubic-bezier(.55,0,.55,.2);width:0;min-width:0}md-sidenav.md-closed.md-locked-open-add{width:0;min-width:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-closed.md-locked-open-add-active{transition:width .3s cubic-bezier(.55,0,.55,.2),min-width .3s cubic-bezier(.55,0,.55,.2);width:304px;min-width:304px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sidenav-backdrop.md-locked-open{display:none}.md-sidenav-left,md-sidenav{left:0;top:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sidenav-left.md-closed,md-sidenav.md-closed{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.md-sidenav-right{left:100%;top:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.md-sidenav-right.md-closed{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (max-width:360px){md-sidenav{width:85%}}@-webkit-keyframes sliderFocusThumb{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@keyframes sliderFocusThumb{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}md-slider{height:48px;position:relative;display:block;margin-left:4px;margin-right:4px;padding:0}md-slider .md-slider-wrapper{position:relative}md-slider .md-track-container{width:100%;position:absolute;top:23px;height:2px}md-slider .md-track{position:absolute;left:0;right:0;height:100%}md-slider .md-track-fill{transition:width .05s linear}md-slider .md-track-ticks{position:absolute;left:0;right:0;height:100%}md-slider .md-thumb-container{position:absolute;left:0;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);transition:left .1s linear}md-slider .md-thumb{z-index:1;position:absolute;left:-19px;top:5px;width:38px;height:38px;border-radius:38px;-webkit-transform:scale(.5);transform:scale(.5);transition:all .1s linear}md-slider .md-thumb:after{content:'';position:absolute;left:3px;top:3px;width:32px;height:32px;border-radius:32px;border:3px solid}md-slider .md-sign{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:absolute;left:-14px;top:-20px;width:28px;height:28px;border-radius:28px;-webkit-transform:scale(.4) translate3d(0,70px,0);transform:scale(.4) translate3d(0,70px,0);transition:all .2s ease-in-out}md-slider .md-sign:after{position:absolute;content:'';left:0;border-radius:16px;top:19px;border-left:14px solid transparent;border-right:14px solid transparent;border-top:16px solid;opacity:0;-webkit-transform:translate3d(0,-8px,0);transform:translate3d(0,-8px,0);transition:all .2s ease-in-out}md-slider .md-sign .md-thumb-text{z-index:1;font-size:12px;font-weight:700}md-slider .md-focus-thumb{position:absolute;left:-24px;top:0;width:48px;height:48px;border-radius:48px;display:none;opacity:0;background-color:silver;-webkit-animation:sliderFocusThumb .4s linear;animation:sliderFocusThumb .4s linear}md-slider .md-focus-ring{position:absolute;left:-24px;top:0;width:48px;height:48px;border-radius:48px;border:2px solid #D6D6D6;background-color:transparent;-webkit-transform:scale(0);transform:scale(0);transition:all .2s linear}md-slider .md-disabled-thumb{position:absolute;left:-22px;top:2px;width:44px;height:44px;border-radius:44px;-webkit-transform:scale(.35);transform:scale(.35);border:6px solid;display:none}md-slider.md-min .md-thumb:after{background-color:#fff}md-slider.md-min .md-sign{opacity:0}md-slider:focus{outline:0}md-slider.dragging .md-thumb-container,md-slider.dragging .md-track-fill{transition:none}md-slider:not([md-discrete]) .md-sign,md-slider:not([md-discrete]) .md-track-ticks{display:none}md-slider:not([md-discrete]):not([disabled]):hover .md-thumb{-webkit-transform:scale(.6);transform:scale(.6)}md-slider:not([md-discrete]):not([disabled]).active .md-focus-thumb,md-slider:not([md-discrete]):not([disabled]):focus .md-focus-thumb{display:block}md-slider:not([md-discrete]):not([disabled]).active .md-focus-ring,md-slider:not([md-discrete]):not([disabled]):focus .md-focus-ring{-webkit-transform:scale(1);transform:scale(1)}md-slider:not([md-discrete]):not([disabled]).active .md-thumb,md-slider:not([md-discrete]):not([disabled]):focus .md-thumb{-webkit-transform:scale(.85);transform:scale(.85)}md-slider[md-discrete] .md-focus-ring,md-slider[md-discrete] .md-focus-thumb{display:none}md-slider[md-discrete]:not([disabled]).active .md-sign,md-slider[md-discrete]:not([disabled]).active .md-sign:after,md-slider[md-discrete]:not([disabled]):focus .md-sign,md-slider[md-discrete]:not([disabled]):focus .md-sign:after{opacity:1;-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}md-slider[disabled] .md-sign,md-slider[disabled] .md-track-fill{display:none}md-slider[disabled] .md-thumb{-webkit-transform:scale(.35);transform:scale(.35)}md-slider[disabled] .md-disabled-thumb{display:block}.md-sticky-clone{z-index:2;top:0;left:0;right:0;position:absolute!important;-webkit-transform:translate3d(-9999px,-9999px,0);transform:translate3d(-9999px,-9999px,0)}.md-sticky-clone[sticky-state=active]{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sticky-clone[sticky-state=active]:not(.md-sticky-no-effect):after{-webkit-animation:subheaderStickyHoverIn .3s ease-out both;animation:subheaderStickyHoverIn .3s ease-out both}@-webkit-keyframes subheaderStickyHoverIn{0%{box-shadow:0 0 0 0 transparent}100%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}}@keyframes subheaderStickyHoverIn{0%{box-shadow:0 0 0 0 transparent}100%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}}@-webkit-keyframes subheaderStickyHoverOut{0%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}100%{box-shadow:0 0 0 0 transparent}}@keyframes subheaderStickyHoverOut{0%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}100%{box-shadow:0 0 0 0 transparent}}.md-subheader{display:block;font-size:.9em;font-weight:400;line-height:1em;padding:16px 0 16px 16px;margin:0 16px 0 0;position:relative}.md-subheader:not(.md-sticky-no-effect){transition:.2s ease-out margin}.md-subheader:not(.md-sticky-no-effect):after{position:absolute;left:0;bottom:0;top:0;right:-16px;content:''}.md-subheader:not(.md-sticky-no-effect).md-sticky-clone{z-index:2}.md-subheader:not(.md-sticky-no-effect)[sticky-state=active]{margin-top:-2px}.md-subheader:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state=active]:after{-webkit-animation:subheaderStickyHoverOut .3s ease-out both;animation:subheaderStickyHoverOut .3s ease-out both}.md-subheader .md-subheader-content{z-index:1;position:relative}md-switch{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin:15px;white-space:nowrap;cursor:pointer;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-switch .md-container{cursor:-webkit-grab;cursor:grab;width:36px;height:24px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:8px}md-switch:not([disabled]) .md-dragging,md-switch:not([disabled]).md-dragging .md-container{cursor:-webkit-grabbing;cursor:grabbing}md-switch .md-label{border-color:transparent;border-width:0}md-switch .md-bar{left:1px;width:34px;top:5px;height:14px;border-radius:8px;position:absolute}md-switch .md-thumb-container{top:2px;left:0;width:16px;position:absolute;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}md-switch.md-checked .md-thumb-container{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}md-switch .md-thumb{position:absolute;margin:0;left:0;top:0;outline:0;height:20px;width:20px;border-radius:50%;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-switch .md-thumb .md-ripple-container{position:absolute;display:block;width:auto;height:auto;left:-20px;top:-20px;right:-20px;bottom:-20px}md-switch:not(.md-dragging) .md-bar,md-switch:not(.md-dragging) .md-thumb,md-switch:not(.md-dragging) .md-thumb-container{transition:all .5s cubic-bezier(.35,0,.25,1);transition-property:-webkit-transform,background-color;transition-property:transform,background-color}md-switch:not(.md-dragging) .md-bar,md-switch:not(.md-dragging) .md-thumb{transition-delay:.05s}md-tabs{display:block;width:100%;font-weight:500;overflow:auto}.md-header{width:100%;height:48px;box-sizing:border-box;position:relative}.md-paginator{z-index:1;margin-right:-2px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:32px;min-height:100%;cursor:pointer;border:none;background-color:transparent;background-repeat:no-repeat;background-position:center center;position:absolute}.md-paginator.md-prev{left:0}.md-paginator.md-next{right:0}.md-paginator.md-next md-icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}md-tabs[center] .md-header:not(.md-paginating) .md-header-items{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.md-paginating .md-header-items-container{left:32px;right:32px}.md-header-items-container{overflow:hidden;position:absolute;left:0;right:0;height:100%;white-space:nowrap;font-size:14px;font-weight:500;text-transform:uppercase;margin:auto}.md-header-items-container .md-header-items{display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);height:100%;width:99999px}.md-tabs-content{overflow:hidden;width:100%;position:relative}.md-tabs-content .md-tab-content{height:100%}.md-tabs-content .md-tab-content.ng-hide.ng-animate{display:block!important}.md-tabs-content .md-tab-content.ng-animate{transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);-webkit-transform:translateX(0);transform:translateX(0)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-add{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-add.md-transition-rtl{-webkit-transform:translateX(100%);transform:translateX(100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove{position:absolute;-webkit-transform:translateX(100%);transform:translateX(100%);top:0;left:0;right:0;bottom:0}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.md-transition-rtl{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.ng-hide-remove-active{-webkit-transform:translateX(0);transform:translateX(0)}md-tabs-ink-bar{z-index:1;display:none;position:absolute;left:0;bottom:0;box-sizing:border-box;height:2px;margin-top:-2px;-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0}md-tabs-ink-bar.md-transition-right{transition:right .25s cubic-bezier(.35,0,.25,1),left .25s cubic-bezier(.35,0,.25,1) .075s}md-tabs-ink-bar.md-transition-left{transition:right .25s cubic-bezier(.35,0,.25,1) .075s,left .25s cubic-bezier(.35,0,.25,1)}md-tab{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:relative;z-index:0;overflow:hidden;height:100%;text-align:center;cursor:pointer;padding:20px 24px;box-sizing:border-box;transition:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-tab.md-tab-themed{transition:background .35s cubic-bezier(.35,0,.25,1),color .35s cubic-bezier(.35,0,.25,1)}md-tab[disabled]{pointer-events:none;cursor:default}md-tab:focus{outline:0}md-tab md-tab-label{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;z-index:100;opacity:1;overflow:hidden}.md-input-group label,md-input-group label{display:block}.md-input-group input[type=color],.md-input-group input[type=date],.md-input-group input[type=datetime-local],.md-input-group input[type=datetime],.md-input-group input[type=email],.md-input-group input[type=month],.md-input-group input[type=number],.md-input-group input[type=password],.md-input-group input[type=search],.md-input-group input[type=tel],.md-input-group input[type=text],.md-input-group input[type=time],.md-input-group input[type=url],.md-input-group input[type=week],.md-input-group textarea,md-input-group input[type=color],md-input-group input[type=date],md-input-group input[type=datetime-local],md-input-group input[type=datetime],md-input-group input[type=email],md-input-group input[type=month],md-input-group input[type=number],md-input-group input[type=password],md-input-group input[type=search],md-input-group input[type=tel],md-input-group input[type=text],md-input-group input[type=time],md-input-group input[type=url],md-input-group input[type=week],md-input-group textarea{display:block;border-width:0 0 1px;padding-top:2px;line-height:26px;padding-bottom:1px}.md-input-group input[type=color]:focus,.md-input-group input[type=date]:focus,.md-input-group input[type=datetime-local]:focus,.md-input-group input[type=datetime]:focus,.md-input-group input[type=email]:focus,.md-input-group input[type=month]:focus,.md-input-group input[type=number]:focus,.md-input-group input[type=password]:focus,.md-input-group input[type=search]:focus,.md-input-group input[type=tel]:focus,.md-input-group input[type=text]:focus,.md-input-group input[type=time]:focus,.md-input-group input[type=url]:focus,.md-input-group input[type=week]:focus,.md-input-group textarea:focus,md-input-group input[type=color]:focus,md-input-group input[type=date]:focus,md-input-group input[type=datetime-local]:focus,md-input-group input[type=datetime]:focus,md-input-group input[type=email]:focus,md-input-group input[type=month]:focus,md-input-group input[type=number]:focus,md-input-group input[type=password]:focus,md-input-group input[type=search]:focus,md-input-group input[type=tel]:focus,md-input-group input[type=text]:focus,md-input-group input[type=time]:focus,md-input-group input[type=url]:focus,md-input-group input[type=week]:focus,md-input-group textarea:focus{outline:0}.md-input-group input,.md-input-group textarea,md-input-group input,md-input-group textarea{background:0 0}.md-input-group,md-input-group{padding-bottom:2px;margin:10px 0 8px;position:relative;display:block}.md-input-group label,md-input-group label{font-size:1em;z-index:1;pointer-events:none;-webkit-font-smoothing:antialiased}.md-input-group label:hover,md-input-group label:hover{cursor:text}.md-input-group label,md-input-group label{-webkit-transform:translate3d(0,22px,0);transform:translate3d(0,22px,0);-webkit-transform-origin:left center;transform-origin:left center;transition:all .15s cubic-bezier(.35,0,.25,1)}.md-input-group input,.md-input-group textarea,md-input-group input,md-input-group textarea{border-bottom-width:1px;transition:all .15s cubic-bezier(.35,0,.25,1)}.md-input-group.md-input-focused label,md-input-group.md-input-focused label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group.md-input-focused input,.md-input-group.md-input-focused textarea,md-input-group.md-input-focused input,md-input-group.md-input-focused textarea{border-bottom-width:2px}.md-input-group.md-input-focused input,md-input-group.md-input-focused input{padding-bottom:0}.md-input-group.md-input-has-value label,.md-input-group.md-input-has-value:not(.md-input-focused) label,md-input-group.md-input-has-value label,md-input-group.md-input-has-value:not(.md-input-focused) label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group[disabled] input,.md-input-group[disabled] textarea,md-input-group[disabled] input,md-input-group[disabled] textarea{border-bottom-width:0;background-position:0 bottom;background-size:2px 1px;background-repeat:repeat-x;pointer-events:none}.md-input-group[disabled] label,md-input-group[disabled] label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group[disabled] :not(.md-input-has-value) label,md-input-group[disabled] :not(.md-input-has-value) label{-webkit-transform:translate3d(0,22px,0);transform:translate3d(0,22px,0);-webkit-transform-origin:left center;transform-origin:left center;transition:all .15s cubic-bezier(.35,0,.25,1)}md-toast{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;box-sizing:border-box;-webkit-align-items:center;-ms-flex-align:center;align-items:center;min-height:48px;padding-left:24px;padding-right:24px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26);border-radius:2px;font-size:14px;cursor:default;max-width:879px;max-height:40px;height:24px;z-index:90;opacity:1;-webkit-transform:translate3d(0,0,0) rotateZ(0deg);transform:translate3d(0,0,0) rotateZ(0deg);transition:all .4s cubic-bezier(.25,.8,.25,1)}md-toast.md-capsule{border-radius:24px}md-toast.ng-leave-active{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-toast.md-swipedown,md-toast.md-swipeleft,md-toast.md-swiperight,md-toast.md-swipeup{transition:all .4s cubic-bezier(.25,.8,.25,1)}md-toast.ng-enter{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}md-toast.ng-enter.md-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}md-toast.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}md-toast.ng-leave.ng-leave-active{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}md-toast.ng-leave.ng-leave-active.md-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}md-toast.ng-leave.ng-leave-active.md-swipeleft{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}md-toast.ng-leave.ng-leave-active.md-swiperight{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}md-toast .md-action{line-height:19px;margin-left:24px;cursor:pointer;text-transform:uppercase;float:right}@media (max-width:600px){md-toast{left:0;right:0;width:100%;max-width:100%;min-width:0;border-radius:0;bottom:0}md-toast.md-top{bottom:auto;top:0}}@media (min-width:600px){md-toast{min-width:288px}md-toast.md-bottom{bottom:8px}md-toast.md-left{left:8px}md-toast.md-right{right:8px}md-toast.md-top{top:8px}md-toast.ng-leave.ng-leave-active.md-swipeleft{-webkit-transform:translate3d(-100%,25%,0) rotateZ(-15deg);transform:translate3d(-100%,25%,0) rotateZ(-15deg)}md-toast.ng-leave.ng-leave-active.md-swiperight{-webkit-transform:translate3d(100%,25%,0) rotateZ(15deg);transform:translate3d(100%,25%,0) rotateZ(15deg)}md-toast.ng-leave.ng-leave-active.md-top.md-swipeleft{-webkit-transform:translate3d(-100%,0,0) rotateZ(-15deg);transform:translate3d(-100%,0,0) rotateZ(-15deg)}md-toast.ng-leave.ng-leave-active.md-top.md-swiperight{-webkit-transform:translate3d(100%,0,0) rotateZ(15deg);transform:translate3d(100%,0,0) rotateZ(15deg)}}md-toolbar{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;z-index:2;font-size:1.3em;min-height:64px;width:100%;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-toolbar.md-tall{height:128px;min-height:128px;max-height:128px}md-toolbar.md-medium-tall{height:88px;min-height:88px;max-height:88px}md-toolbar.md-medium-tall .md-toolbar-tools{height:48px;min-height:48px;max-height:48px}md-toolbar .md-indent{margin-left:64px}.md-toolbar-tools{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:100%;height:64px;max-height:64px;font-size:inherit;font-weight:400;padding:0 16px;margin:0}.md-toolbar-tools>*{font-size:inherit}.md-toolbar-tools h2,.md-toolbar-tools h3{font-weight:400}.md-toolbar-tools a{color:inherit;text-decoration:none}.md-toolbar-tools .fill-height{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.md-toolbar-tools .md-tools{margin-left:auto}.md-toolbar-tools .md-button{font-size:14px}md-tooltip{position:absolute;font-size:14px;z-index:100;overflow:hidden;pointer-events:none;border-radius:4px}md-tooltip .md-background{position:absolute;border-radius:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1}md-tooltip .md-background.md-show-add{transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0}md-tooltip .md-background.md-show,md-tooltip .md-background.md-show-add-active{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1}md-tooltip .md-background.md-show-remove{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip .md-background.md-show-remove.md-show-remove-active{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0}md-tooltip .md-content{position:relative;max-width:240px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:8px;background:0 0;opacity:0}md-tooltip .md-content.md-show-add{transition:all .4s cubic-bezier(.25,.8,.25,1);opacity:0}md-tooltip .md-content.md-show,md-tooltip .md-content.md-show-add-active{opacity:1}md-tooltip .md-content.md-show-remove{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip .md-content.md-show-remove.md-show-remove-active{opacity:0}md-tooltip.md-hide{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip.md-show{transition:all .4s cubic-bezier(.25,.8,.25,1);pointer-events:auto;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-whiteframe-z1{box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}.md-whiteframe-z2{box-shadow:0 8px 17px rgba(0,0,0,.2)}.md-whiteframe-z3{box-shadow:0 17px 50px rgba(0,0,0,.19)}.md-whiteframe-z4{box-shadow:0 16px 28px 0 rgba(0,0,0,.22)}.md-whiteframe-z5{box-shadow:0 27px 24px 0 rgba(0,0,0,.2)}`)\n\nfunc appVendorAngularMaterialAngularMaterialCssBytes() ([]byte, error) {\n\treturn _appVendorAngularMaterialAngularMaterialCss, nil\n}\n\nfunc appVendorAngularMaterialAngularMaterialCss() (*asset, error) {\n\tbytes, err := appVendorAngularMaterialAngularMaterialCssBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/vendor/angular-material/angular-material.css\", size: 159606, mode: os.FileMode(416), modTime: time.Unix(1454116399, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appVendorD3D3MinJs = []byte(`!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+=\"\")===pa||n[0]===va?va+n:n}function f(n){return(n+=\"\")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function E(n){return ya(n,_a),n}function A(n){return\"function\"==typeof n?n:function(){return Ma(n,this)}}function C(n){return\"function\"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:\"function\"==typeof t?n.local?o:a:n.local?i:u}function q(n){return n.trim().replace(/\\s+/g,\" \")}function L(n){return new RegExp(\"(?:^|\\\\s+)\"+ta.requote(n)+\"(?:\\\\s+|$)\",\"g\")}function T(n){return(n+\"\").trim().split(/^|\\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return\"function\"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute(\"class\")||\"\";r?(t.lastIndex=0,t.test(u)||e.setAttribute(\"class\",q(u+\" \"+n))):e.setAttribute(\"class\",q(u.replace(t,\" \")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:\"function\"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:\"function\"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return\"function\"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,c=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t<c;);return a}}function X(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[a]=u,u.$=e),u._=t}function i(){var t,e=new RegExp(\"^__on([^.]+)\"+ta.requote(n)+\"$\");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var a=\"__on\"+n,o=n.indexOf(\".\"),c=$;o>0&&(n=n.slice(0,o));var l=ka.get(n);return l&&(n=l,c=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=\".dragsuppress-\"+ ++Ea,u=\"click\"+r,i=ta.select(t(e)).on(\"touchmove\"+r,S).on(\"dragstart\"+r,S).on(\"selectstart\"+r,S);if(null==Na&&(Na=\"onselectstart\"in e?!1:x(e.style,\"userSelect\")),Na){var a=n(e).style,o=a[Na];a[Na]=\"none\"}return function(n){if(i.on(r,null),Na&&(a[Na]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Aa){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select(\"body\").append(\"svg\").style({position:\"absolute\",top:0,left:0,margin:0,padding:0,border:\"none\"},\"important\");var a=r[0][0].getScreenCTM();Aa=!(a.f||a.e),r.remove()}}return Aa?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?qa:Math.acos(n)}function tn(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function cn(n,t,e){return this instanceof cn?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof cn?new cn(n.h,n.s,n.l):_n(\"\"+n,wn,cn):new cn(n,t,e)}function ln(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Xa,r=vn(r)*$a,i=vn(i)*Ba,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(\"\"+n,yn,ln):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+\"\"}function bn(n){return 16>n?\"0\"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\\((.*)\\)/i.exec(n))switch(u=r[2].split(\",\"),r[1]){case\"hsl\":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case\"rgb\":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=Ga.get(n.toLowerCase()))?t(i.r,i.g,i.b):(null==n||\"#\"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,c=15&i,c=c<<4|c):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,c=255&i)),t(a,o,c))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=c>0&&1>c?0:r),new cn(r,u,c)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Xa),u=dn((.2126729*n+.7151522*t+.072175*e)/$a),i=dn((.0193339*n+.119192*t+.9503041*e)/Ba);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return\"%\"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return\"function\"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&\"function\"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=c.status;if(!t&&qn(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,c)}var i={},a=ta.dispatch(\"beforesend\",\"progress\",\"load\",\"error\"),o={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||\"withCredentials\"in c||!/^(http(s)?:)?\\/\\//.test(n)||(c=new XDomainRequest),\"onload\"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{a.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+\"\").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+\"\",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+\"\",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},[\"get\",\"post\"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&\"function\"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||\"accept\"in o||(o.accept=t+\",*/*\"),c.setRequestHeader)for(var s in o)c.setRequestHeader(s,o[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on(\"error\",u).on(\"load\",function(n){u(null,n)}),a.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,a,\"on\"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function qn(n){var t=n.responseType;return t&&\"text\"!==t?n.response:n.responseText}function Ln(){var n=Tn(),t=Rn()-n;t>24?(isFinite(t)&&(clearTimeout(to),to=setTimeout(Ln,t)),no=0):(no=1,ro(Ln))}function Tn(){var n=Date.now();for(eo=Ka;eo;)n>=eo.t&&(eo.f=eo.c(n-eo.t)),eo=eo.n;return n}function Rn(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Dn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Pn(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],c=0;u>0&&o>0&&(c+o+1>t&&(o=Math.max(1,t-c)),i.push(n.substring(u-=o,u+o)),!((c+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=io.exec(n),r=e[1]||\" \",a=e[2]||\">\",o=e[3]||\"-\",c=e[4]||\"\",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v=\"\",d=\"\",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||\"0\"===r&&\"=\"===a)&&(l=r=\"0\",a=\"=\"),g){case\"n\":f=!0,g=\"g\";break;case\"%\":p=100,d=\"%\",g=\"f\";break;case\"p\":p=100,d=\"%\",g=\"r\";break;case\"b\":case\"o\":case\"x\":case\"X\":\"#\"===c&&(v=\"0\"+g.toLowerCase());case\"c\":y=!1;case\"d\":m=!0,h=0;break;case\"s\":p=-1,g=\"r\"}\"$\"===c&&(v=u[0],d=u[1]),\"r\"!=g||h||(g=\"g\"),null!=h&&(\"g\"==g?h=Math.max(1,Math.min(21,h)):(\"e\"==g||\"f\"==g)&&(h=Math.max(0,Math.min(20,h)))),g=ao.get(g)||jn;var M=l&&f;return function(n){var e=d;if(m&&n%1)return\"\";var u=0>n||0===n&&0>1/n?(n=-n,\"-\"):\"-\"===o?\"\":o;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(\".\");if(0>_){var w=y?n.lastIndexOf(\"e\"):-1;0>w?(x=n,b=\"\"):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):\"\";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,(\"<\"===a?u+n+k:\">\"===a?k+u+n:\"^\"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function jn(n){return n+\"\"}function Fn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Hn(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new co(e-1)),1),e}function i(n,e){return t(n=new co(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{co=Fn;var r=new Fn;return r._=n,a(r,t,e)}finally{co=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var c=n.utc=On(n);return c.floor=c,c.round=On(r),c.ceil=On(u),c.offset=On(i),c.range=o,n}function On(n){return function(t,e){try{co=Fn;var r=new Fn;return r._=t,n(r,e)._}finally{co=Date}}}function In(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,c=0;++o<r;)37===n.charCodeAt(o)&&(a.push(n.slice(c,o)),null!=(u=so[e=n.charAt(++o)])&&(e=n.charAt(++o)),(i=A[e])&&(e=i(t,null==u?\"e\"===e?\" \":\"0\":u)),a.push(e),c=o+1);return a.push(n.slice(c,o)),a.join(\"\")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;\"p\"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&co!==Fn,a=new(i?Fn:co);return\"j\"in r?a.setFullYear(r.y,0,r.j):\"w\"in r&&(\"W\"in r||\"U\"in r)?(a.setFullYear(r.y,0,1),a.setFullYear(r.y,0,\"W\"in r?(r.w+6)%7+7*r.W-(a.getDay()+5)%7:r.w+7*r.U-(a.getDay()+6)%7)):a.setFullYear(r.y,r.m,r.d),a.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?a._:a},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,a,o=0,c=t.length,l=e.length;c>o;){if(r>=l)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in so?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function c(n,t,r){return e(n,A.x.toString(),t,r)}function l(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{co=Fn;var t=new co;return t._=n,r(t)}finally{co=Date}}var r=t(n);return e.parse=function(n){try{co=Fn;var t=r.parse(n);return t&&t._}finally{co=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ta.map(),x=Zn(v),b=Vn(v),_=Zn(d),w=Vn(d),S=Zn(m),k=Vn(m),N=Zn(y),E=Vn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Yn(n.getDate(),t,2)},e:function(n,t){return Yn(n.getDate(),t,2)},H:function(n,t){return Yn(n.getHours(),t,2)},I:function(n,t){return Yn(n.getHours()%12||12,t,2)},j:function(n,t){return Yn(1+oo.dayOfYear(n),t,3)},L:function(n,t){return Yn(n.getMilliseconds(),t,3)},m:function(n,t){return Yn(n.getMonth()+1,t,2)},M:function(n,t){return Yn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Yn(n.getSeconds(),t,2)},U:function(n,t){return Yn(oo.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Yn(oo.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Yn(n.getFullYear()%100,t,2)},Y:function(n,t){return Yn(n.getFullYear()%1e4,t,4)},Z:at,\"%\":function(){return\"%\"}},C={a:r,A:u,b:i,B:a,c:o,d:nt,e:nt,H:et,I:et,j:tt,L:it,m:Qn,M:rt,p:s,S:ut,U:$n,w:Xn,W:Bn,x:c,X:l,y:Jn,Y:Wn,Z:Gn,\"%\":ot};return t}function Yn(n,t,e){var r=0>n?\"-\":\"\",u=(r?-n:n)+\"\",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Zn(n){return new RegExp(\"^(?:\"+n.map(ta.requote).join(\"|\")+\")\",\"i\")}function Vn(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Xn(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function $n(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Bn(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Wn(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Jn(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.y=Kn(+r[0]),e+r[0].length):-1}function Gn(n,t,e){return/^[+-]\\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Kn(n){return n+(n>68?1900:2e3)}function Qn(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function nt(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function tt(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function et(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function rt(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function it(n,t,e){fo.lastIndex=0;var r=fo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?\"-\":\"+\",r=ga(t)/60|0,u=ga(t)%60;return e+Yn(r,\"0\",2)+Yn(u,\"0\",2)}function ot(n,t,e){ho.lastIndex=0;var r=ho.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function lt(){}function st(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ft(n,t){n&&mo.hasOwnProperty(n.type)&&mo[n.type](n,t)}function ht(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function gt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)ht(n[e],t,1);t.polygonEnd()}function pt(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,a=e>=0?1:-1,o=a*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(o),h=s*a*Math.sin(o);Mo.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;xo.point=function(a,o){xo.point=n,r=(t=a)*Da,u=Math.cos(o=(e=o)*Da/2+qa/4),i=Math.sin(o)},xo.lineEnd=function(){n(t,e)}}function vt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function dt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function yt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Mt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function xt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function bt(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function _t(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function wt(n,t){n*=Da;var e=Math.cos(t*=Da);St(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function St(n,t,e){++bo,wo+=(n-wo)/bo,So+=(t-So)/bo,ko+=(e-ko)/bo}function kt(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),a=i*Math.cos(n),o=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-t*c)*l+(l=t*o-e*a)*l),t*a+e*o+r*c);_o+=l,No+=l*(t+(t=a)),Eo+=l*(e+(e=o)),Ao+=l*(r+(r=c)),St(t,e,r)}var t,e,r;Lo.point=function(u,i){u*=Da;var a=Math.cos(i*=Da);t=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),Lo.point=n,St(t,e,r)}}function Nt(){Lo.point=wt}function Et(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),a=e*Math.cos(n),o=e*Math.sin(n),c=Math.sin(t),l=u*c-i*o,s=i*a-r*c,f=r*o-u*a,h=Math.sqrt(l*l+s*s+f*f),g=r*a+u*o+i*c,p=h&&-nn(g)/h,v=Math.atan2(h,g);Co+=p*l,zo+=p*s,qo+=p*f,_o+=v,No+=v*(r+(r=a)),Eo+=v*(u+(u=o)),Ao+=v*(i+(i=c)),St(r,u,i)}var t,e,r,u,i;Lo.point=function(a,o){t=a,e=o,Lo.point=n,a*=Da;var c=Math.cos(o*=Da);r=c*Math.cos(a),u=c*Math.sin(a),i=Math.sin(o),St(r,u,i)},Lo.lineEnd=function(){n(t,e),Lo.lineEnd=Nt,Lo.point=wt}}function At(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ct(){return!0}function zt(n,t,e,r,u){var i=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(_t(e,r)){u.lineStart();for(var o=0;t>o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var c=new Lt(e,n,null,!0),l=new Lt(e,null,c,!1);c.o=l,i.push(c),a.push(l),c=new Lt(r,n,null,!1),l=new Lt(r,null,c,!0),c.o=l,i.push(c),a.push(l)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,c=e,l=a.length;l>o;++o)a[o].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,l=s.length;l>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Lt(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Tt(n,t,e,r){return function(u,i){function a(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function o(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=o,d.lineStart()}function l(){y.point=a,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,a=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a<r;)i.point((u=n[a])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Rt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Ht(m,p);g.length?(b||(i.polygonStart(),b=!0),zt(g,Pt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Dt(),x=t(M),b=!1;return y}}function Rt(n){return n.length>1}function Dt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Pt(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+a)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-o)<Ca&&(i-=o*Ca),r=jt(e,r,i,a),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=i,r=a),u=o},lineEnd:function(){n.lineEnd(),e=r=NaN},clean:function(){return 2-t}}}function jt(n,t,e,r){var u,i,a=Math.sin(n-e);return ga(a)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ft(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Ht(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,a=0;Mo.reset();for(var o=0,c=t.length;c>o;++o){var l=t[o],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(Mo.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var N=mt(vt(f),vt(n));xt(N);var E=mt(u,N);xt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>Mo)^1&a}function Ot(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(_t(e,g)||_t(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&_t(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=vt(n),u=vt(t),a=[1,0,0],o=mt(r,u),c=dt(o,o),l=o[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=mt(a,o),p=Mt(a,f),v=Mt(o,h);yt(p,v);var d=g,m=dt(p,d),y=dt(d,d),M=m*m-y*(dt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Mt(d,(-m-x)/y);if(yt(b,p),b=bt(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=ga(E-qa)<Ca,C=A||Ca>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(ga(b[0]-w)<Ca?k:N):k<=b[1]&&b[1]<=N:E>qa^(w<=b[0]&&b[0]<=S)){var z=Mt(d,(-m+x)/y);return yt(z,p),[b,bt(z)]}}}function u(t,e){var r=a?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=ga(i)>Ca,c=pe(n,6*Da);return Tt(t,e,c,a?[0,-n]:[-qa,n-qa])}function It(n,t,e,r){return function(u){var i,a=u.a,o=u.b,c=a.x,l=a.y,s=o.x,f=o.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Yt(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],c=o.length,l=o[0];c>a;++a)i=o[a],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,o,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(o,c))||a(i,o)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Ro,Math.min(Ro,n)),t=Math.max(-Ro,Math.min(Ro,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Dt(),A=It(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),l(null,null,1,o),o.lineEnd()),u&&zt(v,i,t,l,o),o.polygonEnd()),v=d=m=null}};return C}}function Zt(n){var t=0,e=qa/3,r=ae(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Vt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function Xt(){function n(n,t){Po+=u*n-r*t,r=n,u=t}var t,e,r,u;Oo.point=function(i,a){Oo.point=n,t=r=i,e=u=a},Oo.lineEnd=function(){n(t,e)}}function $t(n,t){Uo>n&&(Uo=n),n>Fo&&(Fo=n),jo>t&&(jo=t),t>Ho&&(Ho=t)}function Bt(){function n(n,t){a.push(\"M\",n,\",\",t,i)}function t(n,t){a.push(\"M\",n,\",\",t),o.point=e}function e(n,t){a.push(\"L\",n,\",\",t)}function r(){o.point=n}function u(){a.push(\"Z\")}var i=Wt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Wt(n),o},result:function(){if(a.length){var n=a.join(\"\");return a=[],n}}};return o}function Wt(n){return\"m0,\"+n+\"a\"+n+\",\"+n+\" 0 1,1 0,\"+-2*n+\"a\"+n+\",\"+n+\" 0 1,1 0,\"+2*n+\"z\"}function Jt(n,t){wo+=n,So+=t,++ko}function Gt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);No+=a*(t+n)/2,Eo+=a*(e+r)/2,Ao+=a,Jt(t=n,e=r)}var t,e;Yo.point=function(r,u){Yo.point=n,Jt(t=r,e=u)}}function Kt(){Yo.point=Jt}function Qt(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);No+=a*(r+n)/2,Eo+=a*(u+t)/2,Ao+=a,a=u*n-r*t,Co+=a*(r+n),zo+=a*(u+t),qo+=3*a,Jt(r=n,u=t)}var t,e,r,u;Yo.point=function(i,a){Yo.point=n,Jt(t=r=i,e=u=a)},Yo.lineEnd=function(){n(t,e)}}function ne(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,La)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function te(n){function t(n){return(o?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=vt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){\nt.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||a>o*g+c*p+l*v)&&(u(t,e,r,o,c,l,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Da),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function ee(n){var t=te(function(t,e){return n([t*Pa,e*Pa])});return function(n){return oe(t(n))}}function re(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ie(n){return ae(function(){return n})()}function ae(n){function t(n){return n=o(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=o.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){o=At(a=se(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,c,l,s,f=te(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=To,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=oe(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,To):Ot((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Yt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,\"precision\"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function oe(n){return ue(n,function(t,e){n.point(t*Da,e*Da)})}function ce(n,t){return[n,t]}function le(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function se(n,t,e){return n?t||e?At(he(n),ge(t,e)):he(n):t||e?ge(t,e):le}function fe(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function he(n){var t=fe(n);return t.invert=fe(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+o*u;return[Math.atan2(c*i-s*a,o*r-l*u),tn(s*i+c*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+s*u),tn(s*r-o*u)]},e}function pe(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var c=a*t;null!=u?(u=ve(e,u),i=ve(e,i),(a>0?i>u:u>i)&&(u+=a*La)):(u=n+a*La,i=n-.5*c);for(var l,s=u;a>0?s>i:i>s;s-=c)o.point((l=bt([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function ve(n,t){var e=vt(t);e[0]-=n,xt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function de(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function ye(n){return n.source}function Me(n){return n.target}function xe(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Pa,Math.atan2(a,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function be(){function n(n,u){var i=Math.sin(u*=Da),a=Math.cos(u),o=ga((n*=Da)-t),c=Math.cos(o);Zo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*c)*o),e*i+r*a*c),t=n,e=i,r=a}var t,e,r;Vo.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Vo.point=n},Vo.lineEnd=function(){Vo.point=Vo.lineEnd=b}}function _e(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function we(n,t){function e(n,t){a>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ra]},e):ke}function Se(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ce:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function ke(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function Ne(n){var t,e=ie(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=i.apply(e,arguments);if(a===e){if(t=null==n){var o=qa*r(),c=u();i([[c[0]-o,c[1]-o],[c[0]+o,c[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Ee(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ae(n){return n[0]}function Ce(n){return n[1]}function ze(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Le(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Te(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(o*(c-l)-f*(u-i))/(f*a-o*s);return[u+h*a,c+h*s]}function Re(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function De(){er(this),this.edge=this.site=this.circle=null}function Pe(n){var t=rc.pop()||new De;return t.site=n,t}function Ue(n){$e(n),nc.remove(n),rc.push(n),er(n)}function je(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,o.unshift(c),Ue(c),c=i;o.unshift(c),$e(c);for(var l=a;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)a=l.N,o.push(l),Ue(l),l=a;o.push(l),$e(l);var s,f=o.length;for(s=1;f>s;++s)l=o[s],c=o[s-1],Qe(l.edge,c.site,l.site,u);c=o[0],l=o[f-1],l.edge=Ge(c.site,l.site,null,u),Xe(c),Xe(l)}function Fe(n){for(var t,e,r,u,i=n.x,a=n.y,o=nc._;o;)if(r=He(o,a)-i,r>Ca)o=o.L;else{if(u=i-Oe(o,a),!(u>Ca)){r>-Ca?(t=o.P,e=o):u>-Ca?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var c=Pe(n);if(nc.insert(t,c),t||e){if(t===e)return $e(t),e=Pe(t.site),nc.insert(c,e),c.edge=e.edge=Ge(t.site,c.site),Xe(t),void Xe(e);if(!e)return void(c.edge=Ge(t.site,c.site));$e(t),$e(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Qe(e.edge,l,p,x),c.edge=Ge(l,n,null,x),e.edge=Ge(n,p,null,x),Xe(t),Xe(e)}}function He(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-1/0;e=a.site;var o=e.x,c=e.y,l=c-t;if(!l)return o;var s=o-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+o)/2}function Oe(n,t){var e=n.N;if(e)return He(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ie(n){this.site=n,this.edges=[]}function Ye(n){for(var t,e,r,u,i,a,o,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Qo,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,c=o.length,a=0;c>a;)s=o[a].end(),r=s.x,u=s.y,l=o[++a%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(o.splice(a,0,new nr(Ke(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Ze(n,t){return t.angle-n.angle}function Ve(){er(this),this.x=this.y=this.arc=this.site=this.cy=null}function Xe(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var a=u.x,o=u.y,c=r.x-a,l=r.y-o,s=i.x-a,f=i.y-o,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+o,m=uc.pop()||new Ve;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ec._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}ec.insert(y,m),y||(tc=m)}}}}function $e(n){var t=n.circle;t&&(t.P||(tc=t.N),ec.remove(t),uc.push(t),er(t),n.circle=null)}function Be(n){for(var t,e=Ko,r=It(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!We(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function We(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,a=t[0][0],o=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(a>d||d>=o)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.x<a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}return n.a=i,n.b=e,!0}function Je(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ge(n,t,e,r){var u=new Je(n,t);return Ko.push(u),e&&Qe(u,n,t,e),r&&Qe(u,t,n,r),Qo[n.i].edges.push(new nr(u,n,t)),Qo[t.i].edges.push(new nr(u,t,n)),u}function Ke(n,t,e){var r=new Je(n,null);return r.a=t,r.b=e,Ko.push(r),r}function Qe(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function nr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function tr(){this._=null}function er(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function rr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ur(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function ir(n){for(;n.L;)n=n.L;return n}function ar(n,t){var e,r,u,i=n.sort(or).pop();for(Ko=[],Qo=new Array(n.length),nc=new tr,ec=new tr;;)if(u=tc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Qo[i.i]=new Ie(i),Fe(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;je(u.arc)}t&&(Be(t),Ye(t));var a={cells:Qo,edges:Ko};return nc=ec=Ko=Qo=null,a}function or(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function lr(n){return n.x}function sr(n){return n.y}function fr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function hr(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=t.nodes;c[0]&&hr(n,c[0],e,r,a,o),c[1]&&hr(n,c[1],a,r,u,o),c[2]&&hr(n,c[2],e,o,a,i),c[3]&&hr(n,c[3],a,o,u,i)}}function gr(n,t,e,r,u,i,a){var o,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,a),o}function pr(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return\"#\"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function vr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=yr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function dr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,u,i=ac.lastIndex=oc.lastIndex=0,a=-1,o=[],c=[];for(n+=\"\",t+=\"\";(e=ac.exec(n))&&(r=oc.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,c.push({i:a,x:dr(e,r)})),i=oc.lastIndex;return i<t.length&&(u=t.slice(i),o[a]?o[a]+=u:o[++a]=u),o.length<2?c[0]?(t=c[0].x,function(n){return t(n)+\"\"}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)o[(e=c[r]).i]=e.x(n);return o.join(\"\")})}function yr(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function Mr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(yr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function xr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function br(n){return function(t){return 1-n(1-t)}}function _r(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function wr(n){return n*n}function Sr(n){return n*n*n}function kr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Nr(n){return function(t){return Math.pow(t,n)}}function Er(n){return 1-Math.cos(n*Ra)}function Ar(n){return Math.pow(2,10*(n-1))}function Cr(n){return 1-Math.sqrt(1-n*n)}function zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Lr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Tr(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+\"\"}}function Rr(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ln(e+i*n,r+a*n,u+o*n)+\"\"}}function Dr(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+\"\"}}function Pr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Fr(t),u=jr(t,e),i=Fr(Hr(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function jr(n,t){return n[0]*t[0]+n[1]*t[1]}function Fr(n){var t=Math.sqrt(jr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Hr(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Or(n,t){var e,r=[],u=[],i=ta.transform(n),a=ta.transform(t),o=i.translate,c=a.translate,l=i.rotate,s=a.rotate,f=i.skew,h=a.skew,g=i.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push(\"translate(\",null,\",\",null,\")\"),u.push({i:1,x:dr(o[0],c[0])},{i:3,x:dr(o[1],c[1])})):r.push(c[0]||c[1]?\"translate(\"+c+\")\":\"\"),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+\"rotate(\",null,\")\")-2,x:dr(l,s)})):s&&r.push(r.pop()+\"rotate(\"+s+\")\"),f!=h?u.push({i:r.push(r.pop()+\"skewX(\",null,\")\")-2,x:dr(f,h)}):h&&r.push(r.pop()+\"skewX(\"+h+\")\"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+\"scale(\",null,\",\",null,\")\"),u.push({i:e-4,x:dr(g[0],p[0])},{i:e-2,x:dr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+\"scale(\"+p+\")\"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join(\"\")}}function Ir(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Yr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Zr(n){for(var t=n.source,e=n.target,r=Xr(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Vr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Xr(n,t){if(n===t)return n;for(var e=Vr(n),r=Vr(t),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function $r(n){n.fixed|=2}function Br(n){n.fixed&=-7}function Wr(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Jr(n){n.fixed&=-5}function Gr(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,a=n.nodes,o=a.length,c=-1;++c<o;)i=a[c],null!=i&&(Gr(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Kr(n,t){return ta.rebind(n,t,\"sort\",\"children\",\"value\"),n.nodes=n,n.links=uu,n}function Qr(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function nu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++a<u;)e.push(i[a]);for(;null!=(n=r.pop());)t(n)}function tu(n){return n.children}function eu(n){return n.value}function ru(n,t){return t.value-n.value}function uu(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function iu(n){return n.x}function au(n){return n.y}function ou(n,t,e){n.y0=t,n.y=e}function cu(n){return ta.range(n.length)}function lu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function su(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function fu(n){return n.reduce(hu,0)}function hu(n,t){return n+t[1]}function gu(n,t){return pu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function pu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function vu(n){return[ta.min(n),ta.max(n)]}function du(n,t){return n.value-t.value}function mu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function yu(n,t){n._pack_next=t,t._pack_prev=n}function Mu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function xu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(bu),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],Su(r,u,i),t(i),mu(r,i),r._pack_prev=i,mu(i,u),u=r._pack_next,a=3;l>a;a++){Su(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(Mu(o,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!Mu(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?yu(r,u=o):yu(r=c,u),a--):(mu(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(_u)}}function bu(n){n._pack_next=n._pack_prev=n}function _u(n){delete n._pack_next,delete n._pack_prev}function wu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i<a;)wu(u[i],t,e,r)}function Su(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var a=t.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function ku(n,t){return n.parent==t.parent?1:2}function Nu(n){var t=n.children;return t.length?t[0]:n.t}function Eu(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Au(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Cu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function zu(n,t,e){return n.a.parent===t.parent?n.a:e}function qu(n){return 1+ta.max(n,function(n){return n.y})}function Lu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Tu(n){var t=n.children;return t&&t.length?Tu(t[0]):n}function Ru(n){var t,e=n.children;return e&&(t=e.length)?Ru(e[t-1]):n}function Du(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Pu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Uu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function ju(n){return n.rangeExtent?n.rangeExtent():Uu(n.range())}function Fu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Hu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function Ou(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:yc}function Iu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)u.push(e(n[a-1],n[a])),i.push(r(t[a-1],t[a]));return function(t){var e=ta.bisect(n,t,1,o)-1;return i[e](u[e](t))}}function Yu(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Iu:Fu,c=r?Yr:Ir;return a=u(n,t,c,e),o=u(t,n,c,yr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Pr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return $u(n,t)},i.tickFormat=function(t,e){return Bu(n,t,e)},i.nice=function(t){return Vu(n,t),u()},i.copy=function(){return Yu(n,t,e,r)},u()}function Zu(n,t){return ta.rebind(n,t,\"range\",\"rangeRound\",\"interpolate\",\"clamp\")}function Vu(n,t){return Hu(n,Ou(Xu(n,t)[2]))}function Xu(n,t){null==t&&(t=10);var e=Uu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function $u(n,t){return ta.range.apply(ta,Xu(n,t))}function Bu(n,t,e){var r=Xu(n,t);if(e){var u=io.exec(e);if(u.shift(),\"s\"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]=\".\"+Wu(i.scale(r[2]))),u[8]=\"f\",e=ta.format(u.join(\"\")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]=\".\"+Ju(u[8],r)),e=u.join(\"\")}else e=\",.\"+Wu(r[2])+\"f\";return ta.format(e)}function Wu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Ju(n,t){var e=Wu(t[2]);return n in Mc?Math.abs(e-Wu(Math.max(ga(t[0]),ga(t[1]))))+ +(\"e\"!==n):e-2*(\"%\"===n)}function Gu(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Hu(r.map(u),e?Math:bc);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Uu(r),a=[],o=n[0],c=n[1],l=Math.floor(u(o)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)a.push(i(l)*h);a.push(i(l))}else for(a.push(i(l));l++<s;)for(var h=f-1;h>0;h--)a.push(i(l)*h);for(l=0;a[l]<o;l++);for(s=a.length;a[s-1]>c;s--);a=a.slice(l,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return xc;arguments.length<2?t=xc:\"function\"!=typeof t&&(t=ta.format(t));var r,o=Math.max(.1,n/a.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=o?t(n):\"\"}},a.copy=function(){return Gu(n.copy(),t,e,r)},Zu(a,n)}function Ku(n,t,e){function r(t){return n(u(t))}var u=Qu(t),i=Qu(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return $u(e,n)},r.tickFormat=function(n,t){return Bu(e,n,t)},r.nice=function(n){return r.domain(Vu(e,n))},r.exponent=function(a){return arguments.length?(u=Qu(t=a),i=Qu(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Ku(n.copy(),t,e)},Zu(r,n)}function Qu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ni(n,t){function e(e){return i[((u.get(e)||(\"range\"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,a=-1,o=r.length;++a<o;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:\"range\",a:arguments},e):i},e.rangePoints=function(u,o){arguments.length<2&&(o=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+o);return i=r(c+s*o/2,s),a=0,t={t:\"rangePoints\",a:arguments},e},e.rangeRoundPoints=function(u,o){arguments.length<2&&(o=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+o)|0;return i=r(c+Math.round(s*o/2+(l-c-(n.length-1+o)*s)/2),s),a=0,t={t:\"rangeRoundPoints\",a:arguments},e},e.rangeBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-o+2*c);return i=r(s+h*c,h),l&&i.reverse(),a=h*(1-o),t={t:\"rangeBands\",a:arguments},e},e.rangeRoundBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-o+2*c));return i=r(s+Math.round((f-s-(n.length-o)*h)/2),h),l&&i.reverse(),a=Math.round(h*(1-o)),t={t:\"rangeRoundBands\",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Uu(t.a[0])},e.copy=function(){return ni(n,t)},e.domain(n)}function ti(n,t){function i(){var e=0,r=t.length;for(o=[];++e<r;)o[e-1]=ta.quantile(n,e/r);return a}function a(n){return isNaN(n=+n)?void 0:t[ta.bisect(o,n)]}var o;return a.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},a.range=function(n){return arguments.length?(t=n,i()):t},a.quantiles=function(){return o},a.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?o[e-1]:n[0],e<o.length?o[e]:n[n.length-1]]},a.copy=function(){return ti(n,t)},i()}function ei(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return ei(n,t,e)},u()}function ri(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ri(n,t)},e}function ui(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return $u(n,t)},t.tickFormat=function(t,e){return Bu(n,t,e)},t.copy=function(){return ui(n)},t}function ii(){return 0}function ai(n){return n.innerRadius}function oi(n){return n.outerRadius}function ci(n){return n.startAngle}function li(n){return n.endAngle}function si(n){return n&&n.padAngle}function fi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function hi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),c=o*a,l=-o*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function gi(n){function t(t){function a(){l.push(\"M\",i(n(s),o))}for(var c,l=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(a(),s=[]);return s.length&&a(),l.length?l.join(\"\"):null}var e=Ae,r=Ce,u=Ct,i=pi,a=i.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(a=\"function\"==typeof n?i=n:(i=Ec.get(n)||pi).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function pi(n){return n.join(\"L\")}function vi(n){return pi(n)+\"Z\"}function di(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"H\",(r[0]+(r=n[t])[0])/2,\"V\",r[1]);return e>1&&u.push(\"H\",r[0]),u.join(\"\")}function mi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"V\",(r=n[t])[1],\"H\",r[0]);return u.join(\"\")}function yi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],\",\",r[1]];++t<e;)u.push(\"H\",(r=n[t])[0],\"V\",r[1]);return u.join(\"\")}function Mi(n,t){return n.length<4?pi(n):n[1]+_i(n.slice(1,-1),wi(n,t))}function xi(n,t){return n.length<3?pi(n):n[0]+_i((n.push(n[0]),n),wi([n[n.length-2]].concat(n,[n[1]]),t))}function bi(n,t){return n.length<3?pi(n):n[0]+_i(n,wi(n,t))}function _i(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return pi(n);var e=n.length!=t.length,r=\"\",u=n[0],i=n[1],a=t[0],o=a,c=1;if(e&&(r+=\"Q\"+(i[0]-2*a[0]/3)+\",\"+(i[1]-2*a[1]/3)+\",\"+i[0]+\",\"+i[1],u=n[1],c=2),t.length>1){o=t[1],i=n[c],c++,r+=\"C\"+(u[0]+a[0])+\",\"+(u[1]+a[1])+\",\"+(i[0]-o[0])+\",\"+(i[1]-o[1])+\",\"+i[0]+\",\"+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],o=t[l],r+=\"S\"+(i[0]-o[0])+\",\"+(i[1]-o[1])+\",\"+i[0]+\",\"+i[1]}if(e){var s=n[c];r+=\"Q\"+(i[0]+2*o[0]/3)+\",\"+(i[1]+2*o[1]/3)+\",\"+s[0]+\",\"+s[1]}return r}function wi(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],a=n[1],o=1,c=n.length;++o<c;)e=i,i=a,a=n[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function Si(n){if(n.length<3)return pi(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],a=[u,u,u,(r=n[1])[0]],o=[i,i,i,r[1]],c=[u,\",\",i,\"L\",Ai(zc,a),\",\",Ai(zc,o)];for(n.push(n[e-1]);++t<=e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ci(c,a,o);return n.pop(),c.push(\"L\",r),c.join(\"\")}function ki(n){if(n.length<4)return pi(n);for(var t,e=[],r=-1,u=n.length,i=[0],a=[0];++r<3;)t=n[r],i.push(t[0]),a.push(t[1]);for(e.push(Ai(zc,i)+\",\"+Ai(zc,a)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),a.shift(),a.push(t[1]),Ci(e,i,a);return e.join(\"\")}function Ni(n){for(var t,e,r=-1,u=n.length,i=u+4,a=[],o=[];++r<4;)e=n[r%u],a.push(e[0]),o.push(e[1]);for(t=[Ai(zc,a),\",\",Ai(zc,o)],--r;++r<i;)e=n[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ci(t,a,o);return t.join(\"\")}function Ei(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],a=n[0][1],o=n[e][0]-i,c=n[e][1]-a,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*o),r[1]=t*r[1]+(1-t)*(a+u*c);return Si(n)}function Ai(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Ci(n,t,e){n.push(\"C\",Ai(Ac,t),\",\",Ai(Ac,e),\",\",Ai(Cc,t),\",\",Ai(Cc,e),\",\",Ai(zc,t),\",\",Ai(zc,e))}function zi(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qi(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],a=r[0]=zi(u,i);++t<e;)r[t]=(a+(a=zi(u=i,i=n[t+1])))/2;return r[t]=a,r}function Li(n){for(var t,e,r,u,i=[],a=qi(n),o=-1,c=n.length-1;++o<c;)t=zi(n[o],n[o+1]),ga(t)<Ca?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=c;)u=(n[Math.min(c,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Ti(n){return n.length<3?pi(n):n[0]+_i(n,Li(n))}function Ri(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Di(n){function t(t){function c(){v.push(\"M\",o(n(m),f),s,l(n(d.reverse()),f),\"Z\")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=En(e),b=En(u),_=e===r?function(){return g}:En(r),w=u===i?function(){return p}:En(i);++y<M;)a.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(\"\"):null}var e=Ae,r=Ae,u=0,i=Ce,a=Ct,o=pi,c=o.key,l=o,s=\"L\",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,\nt):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(c=\"function\"==typeof n?o=n:(o=Ec.get(n)||pi).key,l=o.reverse||o,s=o.closed?\"M\":\"L\",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Pi(n){return n.radius}function Ui(n){return[n.x,n.y]}function ji(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fi(){return 64}function Hi(){return\"circle\"}function Oi(n){var t=Math.sqrt(n/qa);return\"M0,\"+t+\"A\"+t+\",\"+t+\" 0 1,1 0,\"+-t+\"A\"+t+\",\"+t+\" 0 1,1 0,\"+t+\"Z\"}function Ii(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yi(n,t,e){return ya(n,Uc),n.namespace=t,n.id=e,n}function Zi(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,\"function\"==typeof e?function(n,a,o){n[i][u].tween.set(t,r(e.call(n,n.__data__,a,o)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vi(n){return null==n&&(n=\"\"),function(){this.textContent=n}}function Xi(n){return null==n?\"__transition__\":\"__transition_\"+n+\"__\"}function $i(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),a=i[r];if(!a){var o=u.time;a=i[r]={tween:new l,time:o,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,a.event&&a.event.start.call(n,n.__data__,t),a.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=a.ease,f=a.duration,ta.timer(function(){return p.c=l(e||1)?Ct:l,1},0,o)}function l(e){if(i.active!==r)return 1;for(var u=e/f,o=h(u),c=v.length;c>0;)v[--c].call(n,o);return u>=1?(a.event&&a.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=a.delay,p=eo,v=[];return p.t=g+o,u>=g?c(u-g):void(p.c=c)},0,o)}}function Bi(n,t,e){n.attr(\"transform\",function(n){var r=t(n);return\"translate(\"+(isFinite(r)?r:e(n))+\",0)\"})}function Wi(n,t,e){n.attr(\"transform\",function(n){var r=t(n);return\"translate(0,\"+(isFinite(r)?r:e(n))+\")\"})}function Ji(n){return n.toISOString()}function Gi(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Xc,u);return i==Xc.length?[t.year,Xu(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Xc[i-1]<Xc[i]/u?i-1:i]:[Wc,Xu(n,e)[2]]}return r.invert=function(t){return Ki(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ki)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ki(+e+1),t).length}var i=r.domain(),a=Uu(i),o=null==n?u(a,10):\"number\"==typeof n&&u(a,n);return o&&(n=o[0],t=o[1]),r.domain(Hu(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ki(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ki(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Uu(r.domain()),i=null==n?u(e,10):\"number\"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ki(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Gi(n.copy(),t,e)},Zu(r,n)}function Ki(n){return new Date(n)}function Qi(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:\"3.5.5\"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement(\"DIV\").style.setProperty(\"opacity\",0,\"\")}catch(aa){var oa=this.Element.prototype,ca=oa.setAttribute,la=oa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;oa.setAttribute=function(n,t){ca.call(this,n,t+\"\")},oa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+\"\")},sa.setProperty=function(n,t,e){fa.call(this,n,t+\"\",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i<a;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<a;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a<i;)u(e=+n[a])&&(r+=e);else for(;++a<i;)u(e=+t.call(n,n[a],a))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,a=n.length,o=-1,c=a;if(1===arguments.length)for(;++o<a;)u(e=r(n[o]))?i+=e:--c;else for(;++o<a;)u(e=r(t.call(n,n[o],o)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,a=[],o=n.length,c=-1;if(1===arguments.length)for(;++c<o;)u(i=r(n[c]))&&a.push(i);else for(;++c<o;)u(i=r(t.call(n,n[c],c)))&&a.push(i);return a.length?ta.quantile(a.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,a=n.length,o=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<a;)u(e=r(n[l]))&&(i=e-o,o+=i/++s,c+=i*(e-o));else for(;++l<a;)u(e=r(t.call(n,n[l],l)))&&(i=e-o,o+=i/++s,c+=i*(e-o));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,a),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,a=0;++i<u;)a+=n[i].length;for(e=new Array(a);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error(\"infinite range\");var r,u=[],i=o(ga(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var a in n)e.set(a,n[a]);return e};var pa=\"__proto__\",va=\"\\x00\";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,a,o){if(o>=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var c,s,f,h,g=-1,p=a.length,v=i[o++],d=new l;++g<p;)(h=d.get(c=v(s=a[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,o))}):(s={},f=function(e,r){s[e]=n(t,r,o)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+=\"\")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=[\"webkit\",\"ms\",\"moz\",\"Moz\",\"o\",\"O\"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf(\".\"),r=\"\";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,\"\\\\$&\")};var ma=/[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,\"matchesSelector\")];return(ba=function(n,t){return e.call(n,t)})(n,t)};\"function\"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a<o;){i.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,a)),e&&\"__data__\"in u&&(e.__data__=u.__data__)):t.push(null)}return E(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var a=this[u],o=-1,c=a.length;++o<c;)(e=a[o])&&(r.push(t=ra(n.call(e,e.__data__,o,u))),t.parentNode=e);return E(r)};var wa={svg:\"http://www.w3.org/2000/svg\",xhtml:\"http://www.w3.org/1999/xhtml\",xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\",xmlns:\"http://www.w3.org/2000/xmlns/\"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(\":\"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if(\"string\"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if(\"string\"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute(\"class\");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if(\"string\"!=typeof n){2>u&&(e=\"\");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=\"\"}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if(\"string\"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each(\"function\"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?\"\":t}:null==n?function(){this.textContent=\"\"}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each(\"function\"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?\"\":t}:null==n?function(){this.innerHTML=\"\"}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new l,y=new Array(a);for(r=-1;++r<a;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<a;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),c.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i<a;)(u=r[i])&&(n[i]=u.__data__);return n}var o=Z([]),c=E([]),s=E([]);if(\"function\"==typeof n)for(;++i<a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<a;)e(r=this[i],n);return c.enter=function(){return o},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property(\"__data__\",n):this.property(\"__data__\")},_a.filter=function(n){var t,e,r,u=[];\"function\"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,a=[],o=-1,c=this.length;++o<c;){r=(u=this[o]).update,a.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,o)),e.__data__=i.__data__):t.push(null)}return E(a)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return\"string\"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),E([e])},ta.selectAll=function(n){var t;return\"string\"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),E([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if(\"string\"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()[\"__on\"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:\"mouseover\",mouseleave:\"mouseout\"});ua&&ka.forEach(function(n){\"on\"+n in ua&&ka.remove(n)});var Na,Ea=0;ta.mouse=function(n){return J(n,k())};var Aa=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on(\"mousedown.drag\",i).on(\"touchstart.drag\",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:\"drag\",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p&&ta.event.target===f),g({type:\"dragend\"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=\".drag\"+(null==v?\"\":\"-\"+v),m=ta.select(e(f)).on(i+d,o).on(a+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:\"dragstart\"})}}var r=N(n,\"drag\",\"dragstart\",\"dragend\"),u=null,i=e(b,ta.mouse,t,\"mousemove\",\"mouseup\"),a=e(G,ta.touch,y,\"touchmove\",\"touchend\");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,\"on\")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rn(v),a=i/(ja*h)*(e*un(Ua*t+v)-en(v));return[r+a*l,u+a*s,i*e/rn(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],a=t[0],o=t[1],c=t[2],l=a-r,s=o-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+\".zoom\",g).on(\"dblclick.zoom\",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:\"zoomstart\"})}function l(n){o(),n({type:\"zoom\",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||n({type:\"zoomend\"}),d=null}function f(){function n(){f=1,i(ta.mouse(u),g),l(o)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===a),s(o)}var u=this,a=ta.event.target,o=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Pc.call(u),c(o)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,o),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=ta.touches(p);Pc.call(p);for(var o=0,c=a.length;c>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function o(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=\".zoom-\"+ta.event.changedTouches[0].identifier,x=\"touchmove\"+y,b=\"touchend\"+y,_=[],w=ta.select(p),N=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(v=e(d=m||ta.mouse(this)),Pc.call(this),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ia,C=250,z=0,q=\"mousedown.zoom\",L=\"mousemove.zoom\",T=\"mouseup.zoom\",R=\"touchstart.zoom\",D=N(n,\"zoomstart\",\"zoom\",\"zoomend\");return Oa||(Oa=\"onwheel\"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},\"wheel\"):\"onmousewheel\"in ua?(Ha=function(){return ta.event.wheelDelta},\"mousewheel\"):(Ha=function(){return-ta.event.detail},\"MozMousePixelScroll\")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Rc?ta.select(this).transition().each(\"start.zoom\",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween(\"zoom:zoom\",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},l(n)}}).each(\"interrupt.zoom\",function(){s(n)}).each(\"end.zoom\",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ia:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,\"on\")};var Ha,Oa,Ia=[0,1/0];ta.color=on,on.prototype.toString=function(){return this.rgb()+\"\"},ta.hsl=cn;var Ya=cn.prototype=new on;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new cn(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new cn(this.h,this.s,n*this.l)},Ya.rgb=function(){return ln(this.h,this.s,this.l)},ta.hcl=sn;var Za=sn.prototype=new on;Za.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return fn(this.h,this.c,this.l).rgb()},ta.lab=hn;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=hn.prototype=new on;Wa.brighter=function(n){return new hn(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new hn(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return gn(this.l,this.a,this.b)},ta.rgb=yn;var Ja=yn.prototype=new on;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return wn(this.r,this.g,this.b)},Ja.toString=function(){return\"#\"+bn(this.r)+bn(this.g)+bn(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,Mn(t))}),ta.functor=En,ta.xhr=An(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'\"'+n.replace(/\\\"/g,'\"\"')+'\"':n}var o=new RegExp('[\"'+n+\"\\n]\"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(\"d\",\"return {\"+n.map(function(n,t){return JSON.stringify(n)+\": d[\"+t+\"]\"}).join(\",\")+\"}\");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/\"\"/g,'\"')}for(;l>s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==c)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],l=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join(\"\\n\")},e.formatRows=function(n){return n.map(i).join(\"\\n\")},e},ta.csv=ta.dsv(\",\",\"text/csv\"),ta.tsv=ta.dsv(\"\t\",\"text/tab-separated-values\");var Ka,Qa,no,to,eo,ro=this[x(this,\"requestAnimationFrame\")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,no||(to=clearTimeout(to),no=1,ro(Ln))},ta.timer.flush=function(){Tn(),Rn()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uo=[\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"].map(Pn);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Dn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uo[8+e/3]};var io=/(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i,ao=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Dn(n,t))).toFixed(Math.max(0,Math.min(20,Dn(n*(1+1e-15),t))))}}),oo=ta.time={},co=Date;Fn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lo.setUTCDate.apply(this._,arguments)},setDay:function(){lo.setUTCDay.apply(this._,arguments)},setFullYear:function(){lo.setUTCFullYear.apply(this._,arguments)},setHours:function(){lo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lo.setUTCSeconds.apply(this._,arguments)},setTime:function(){lo.setTime.apply(this._,arguments)}};var lo=Date.prototype;oo.year=Hn(function(n){return n=oo.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),oo.years=oo.year.range,oo.years.utc=oo.year.utc.range,oo.day=Hn(function(n){var t=new co(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),oo.days=oo.day.range,oo.days.utc=oo.day.utc.range,oo.dayOfYear=function(n){var t=oo.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},[\"sunday\",\"monday\",\"tuesday\",\"wednesday\",\"thursday\",\"friday\",\"saturday\"].forEach(function(n,t){t=7-t;var e=oo[n]=Hn(function(n){return(n=oo.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=oo.year(n).getDay();return Math.floor((oo.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});oo[n+\"s\"]=e.range,oo[n+\"s\"].utc=e.utc.range,oo[n+\"OfYear\"]=function(n){var e=oo.year(n).getDay();return Math.floor((oo.dayOfYear(n)+(e+t)%7)/7)}}),oo.week=oo.sunday,oo.weeks=oo.sunday.range,oo.weeks.utc=oo.sunday.utc.range,oo.weekOfYear=oo.sundayOfYear;var so={\"-\":\"\",_:\" \",0:\"0\"},fo=/^\\s*\\d+/,ho=/^%/;ta.locale=function(n){return{numberFormat:Un(n),timeFormat:In(n)}};var go=ta.locale({decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],dateTime:\"%a %b %e %X %Y\",date:\"%m/%d/%Y\",time:\"%H:%M:%S\",periods:[\"AM\",\"PM\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]});ta.format=go.numberFormat,ta.geo={},lt.prototype={s:0,t:0,add:function(n){st(n,this.t,po),\nst(po.s,this.s,this),this.s?this.t+=po.t:this.s=po.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var po=new lt;ta.geo.stream=function(n,t){n&&vo.hasOwnProperty(n.type)?vo[n.type](n,t):ft(n,t)};var vo={Feature:function(n,t){ft(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ft(e[r].geometry,t)}},mo={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){ht(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)ht(e[r],t,0)},Polygon:function(n,t){gt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)gt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ft(e[r],t)}};ta.geo.area=function(n){return yo=0,ta.geo.stream(n,xo),yo};var yo,Mo=new lt,xo={sphere:function(){yo+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){Mo.reset(),xo.lineStart=pt},polygonEnd:function(){var n=2*Mo;yo+=0>n?4*qa+n:n,xo.lineStart=xo.lineEnd=xo.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=vt([t*Da,e*Da]);if(m){var u=mt(m,r),i=[u[1],-u[0],0],a=mt(i,u);xt(a),a=bt(a);var c=t-p,l=c>0?1:-1,v=a[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=a[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-a[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;xo.point(n,e),t(n,e)}function i(){xo.lineStart()}function a(){u(v,d),xo.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=a,y=0,xo.polygonStart()},polygonEnd:function(){xo.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>Mo?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){bo=_o=wo=So=ko=No=Eo=Ao=Co=zo=qo=0,ta.geo.stream(n,Lo);var t=Co,e=zo,r=qo,u=t*t+e*e+r*r;return za>u&&(t=No,e=Eo,r=Ao,Ca>_o&&(t=wo,e=So,r=ko),u=t*t+e*e+r*r,za>u)?[NaN,NaN]:[Math.atan2(e,t)*Pa,tn(r/Math.sqrt(u))*Pa]};var bo,_o,wo,So,ko,No,Eo,Ao,Co,zo,qo,Lo={sphere:b,point:wt,lineStart:kt,lineEnd:Nt,polygonStart:function(){Lo.lineStart=Et},polygonEnd:function(){Lo.lineStart=kt}},To=Tt(Ct,Ut,Ft,[-qa,-qa/2]),Ro=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Yt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Zt(Vt)}).raw=Vt,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=ta.geo.albers(),a=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=a.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=o.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Do,Po,Uo,jo,Fo,Ho,Oo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Po=0,Oo.lineStart=Xt},polygonEnd:function(){Oo.lineStart=Oo.lineEnd=Oo.point=b,Do+=ga(Po/2)}},Io={point:$t,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Yo={point:Jt,lineStart:Gt,lineEnd:Kt,polygonStart:function(){Yo.lineStart=Qt},polygonEnd:function(){Yo.point=Jt,Yo.lineStart=Gt,Yo.lineEnd=Kt}};ta.geo.path=function(){function n(n){return n&&(\"function\"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),ta.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Do=0,ta.geo.stream(n,u(Oo)),Do},n.centroid=function(n){return wo=So=ko=No=Eo=Ao=Co=zo=qo=0,ta.geo.stream(n,u(Yo)),qo?[Co/qo,zo/qo]:Ao?[No/Ao,Eo/Ao]:ko?[wo/ko,So/ko]:[NaN,NaN]},n.bounds=function(n){return Fo=Ho=-(Uo=jo=1/0),ta.geo.stream(n,u(Io)),[[Uo,jo],[Fo,Ho]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||ee(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Bt:new ne(n),\"function\"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o=\"function\"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new re(t);for(var r in n)e[r]=n[r];return e}}},re.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ie,ta.geo.projectionMutator=ae,(ta.geo.equirectangular=function(){return ie(ce)}).raw=ce.invert=ce,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=se(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},le.invert=ce,ta.geo.circle=function(){function n(){var n=\"function\"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:\"Polygon\",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=pe((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=pe(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,a=Math.sin(r),o=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=l*s-c*f*o)*e),c*s+l*f*o)},ta.geo.graticule=function(){function n(){return{type:\"MultiLineString\",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(o/v)*v,a,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,a,o,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:\"LineString\",coordinates:n}})},n.outline=function(){return{type:\"Polygon\",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=de(o,a,90),f=me(r,e,y),h=de(l,c,90),g=me(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:\"LineString\",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=ye,u=Me;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=\"function\"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=\"function\"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return xe(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Zo=0,ta.geo.stream(n,Vo),Zo};var Zo,Vo={sphere:b,point:b,lineStart:be,lineEnd:b,polygonStart:b,polygonEnd:b},Xo=_e(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ie(Xo)}).raw=Xo;var $o=_e(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ie($o)}).raw=$o,(ta.geo.conicConformal=function(){return Zt(we)}).raw=we,(ta.geo.conicEquidistant=function(){return Zt(Se)}).raw=Se;var Bo=_e(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ie(Bo)}).raw=Bo,ke.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return Ne(ke)}).raw=ke;var Wo=_e(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ie(Wo)}).raw=Wo;var Jo=_e(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ie(Jo)}).raw=Jo,Ee.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=Ne(Ee),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ee,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],c=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)c.push([o[t][0],-o[t][1]]);var l=ze(o),s=ze(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[o[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[o[s[t]][2]]);return g}var e=Ae,r=Ce;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Go),n};var Go=ta.geom.polygon.prototype=[];Go.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Go.centroid=function(n){var t,e,r=-1,u=this.length,i=0,a=0,o=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=o,o=this[r],e=t[0]*o[1]-o[0]*t[1],i+=(t[0]+o[0])*e,a+=(t[1]+o[1])*e;return[i*n,a*n]},Go.clip=function(n){for(var t,e,r,u,i,a,o=Re(n),c=-1,l=this.length-Re(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-o)-1],e=-1;++e<r;)a=t[e],Le(a,s,u)?(Le(i,s,u)||n.push(Te(i,a,s,u)),n.push(a)):Le(i,s,u)&&n.push(Te(i,a,s,u)),i=a;o&&n.push(n[0]),s=u}return n};var Ko,Qo,nc,tc,ec,rc=[],uc=[];Ie.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ze),t.length},nr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},tr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=ir(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(rr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ur(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ur(this,e),n=e,e=n.U),e.C=!1,r.C=!0,rr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,a=n.R;if(e=i?a?ir(a):i:a,u?u.L===n?u.L=e:u.R=e:this._=e,i&&a?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==a?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=a,a.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,rr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ur(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,rr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ur(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,rr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ur(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=o[0][0],u=o[0][1],i=o[1][0],a=o[1][1];return ar(e(n),o).cells.forEach(function(e,o){var c=e.edges,l=e.site,s=t[o]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(a(n,t)/Ca)*Ca,i:t}})}var r=Ae,u=Ce,i=r,a=u,o=ic;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ze),c=-1,l=o.length,s=o[l-1].edge,f=s.l===a?s.r:s.l;++c<l;)u=s,i=f,s=o[c].edge,f=s.l===a?s.r:s.l,r<i.i&&r<f.i&&cr(a,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=En(r=n),t):r},t.y=function(n){return arguments.length?(a=En(u=n),t):u},t.clipExtent=function(n){return arguments.length?(o=null==n?ic:n,t):o===ic?null:o},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):o===ic?null:o&&o[1]},t)};var ic=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,a,o);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,a,o),l(n,t,e,r,u,i,a,o)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,a,o)}function l(n,t,e,r,u,a,o,c){var l=.5*(u+o),s=.5*(a+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=fr()),f?u=l:o=l,h?a=s:c=s,i(n,t,e,r,u,a,o,c)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=fr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){hr(n,k,v,d,m,y)},k.find=function(n){return gr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var a,o=Ae,c=Ce;return(a=arguments.length)?(o=lr,c=sr,3===a&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(o=n,i):o},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=pr,ta.interpolateObject=vr,ta.interpolateNumber=dr,ta.interpolateString=mr;var ac=/[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,oc=new RegExp(ac.source,\"g\");ta.interpolate=yr,ta.interpolators=[function(n,t){var e=typeof t;return(\"string\"===e?Ga.has(t)||/^(#|rgb\\(|hsl\\()/.test(t)?pr:mr:t instanceof on?pr:Array.isArray(t)?Mr:\"object\"===e&&isNaN(t)?vr:dr)(n,t)}],ta.interpolateArray=Mr;var cc=function(){return y},lc=ta.map({linear:cc,poly:Nr,quad:function(){return wr},cubic:function(){return Sr},sin:function(){return Er},exp:function(){return Ar},circle:function(){return Cr},elastic:zr,back:qr,bounce:function(){return Lr}}),sc=ta.map({\"in\":y,out:br,\"in-out\":_r,\"out-in\":function(n){return _r(br(n))}});ta.ease=function(n){var t=n.indexOf(\"-\"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):\"in\";return e=lc.get(e)||cc,r=sc.get(r)||y,xr(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Tr,ta.interpolateHsl=Rr,ta.interpolateLab=Dr,ta.interpolateRound=Pr,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,\"g\");return(ta.transform=function(n){if(null!=n){t.setAttribute(\"transform\",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:fc)})(n)},Ur.prototype.toString=function(){return\"translate(\"+this.translate+\")rotate(\"+this.rotate+\")skewX(\"+this.skew+\")scale(\"+this.scale+\")\"};var fc={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Or,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Zr(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(a&&d.sort(function(n,t){return a(v[n],v[t])}),o&&m.forEach(function(n,t){n.sort(function(n,e){return o(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+\"-\"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+\"-\"+g],S=p[g+\"-\"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,a,o,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(a=n,e=r=null,l):a},l.sortSubgroups=function(n){return arguments.length?(o=n,e=null,l):o},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,a=t.cy-n.y,o=u-e,c=i*i+a*a;if(c>o*o/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=a*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=a*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,o.resume()}var e,r,u,i,a,o={},c=ta.dispatch(\"start\",\"tick\",\"end\"),l=[1,1],s=.9,f=hc,h=gc,g=-30,p=pc,v=.1,d=.64,m=[],M=[];return o.tick=function(){if((r*=.99)<.005)return c.end({type:\"end\",alpha:r=0}),!0;var t,e,o,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)o=M[e],f=o.source,h=o.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)o=m[e],o.x+=(y-o.x)*d,o.y+=(x-o.y)*d;if(g)for(Gr(t=ta.geom.quadtree(m),r,a),e=-1;++e<b;)(o=m[e]).fixed||t.visit(n(o));for(e=-1;++e<b;)o=m[e],o.fixed?(o.x=o.px,o.y=o.py):(o.x-=(o.px-(o.px=o.x))*s,o.y-=(o.py-(o.py=o.y))*s);c.tick({type:\"tick\",alpha:r})},o.nodes=function(n){return arguments.length?(m=n,o):m},o.links=function(n){return arguments.length?(M=n,o):M},o.size=function(n){return arguments.length?(l=n,o):l},o.linkDistance=function(n){return arguments.length?(f=\"function\"==typeof n?n:+n,o):f},o.distance=o.linkDistance,o.linkStrength=function(n){return arguments.length?(h=\"function\"==typeof n?n:+n,o):h},o.friction=function(n){return arguments.length?(s=+n,o):s},o.charge=function(n){return arguments.length?(g=\"function\"==typeof n?n:+n,o):g},o.chargeDistance=function(n){return arguments.length?(p=n*n,o):Math.sqrt(p)},o.gravity=function(n){return arguments.length?(v=+n,o):v},o.theta=function(n){return arguments.length?(d=n*n,o):Math.sqrt(d)},o.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:\"start\",alpha:r=n}),ta.timer(o.tick)),o):r},o.start=function(){function n(n,r){if(!e){for(e=new Array(c),o=0;c>o;++o)e[o]=[];for(o=0;s>o;++o){var u=M[o];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,a=e[t],o=-1,l=a.length;++o<l;)if(!isNaN(i=a[o][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],\"number\"==typeof r.source&&(r.source=m[r.source]),\"number\"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n(\"x\",p)),isNaN(r.y)&&(r.y=n(\"y\",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],\"function\"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],\"function\"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(a=[],\"function\"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)a[t]=g;return o.resume()},o.resume=function(){return o.alpha(.1)},o.stop=function(){return o.alpha(0)},o.drag=function(){return e||(e=ta.behavior.drag().origin(y).on(\"dragstart.force\",$r).on(\"drag.force\",t).on(\"dragend.force\",Br)),arguments.length?void this.on(\"mouseover.force\",Wr).on(\"mouseout.force\",Jr).call(e):e},ta.rebind(o,c,\"on\")};var hc=20,gc=1,pc=1/0;ta.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)a.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return nu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=ru,e=tu,r=eu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Qr(t,function(n){n.children&&(n.value=0)}),nu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=t.value?r/t.value:0;++l<a;)n(o=i[l],e,c=o.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return n(a[0],0,u[0],u[1]/t(a[0])),a}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Kr(e,r)},ta.layout.pie=function(){function n(a){var o,c=a.length,l=a.map(function(e,r){return+t.call(n,e,r)}),s=+(\"function\"==typeof r?r.apply(this,arguments):r),f=(\"function\"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+(\"function\"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===vc?function(n,t){return l[t]-l[n]}:function(n,t){return e(a[n],a[t])}),v.forEach(function(n){d[n]={data:a[n],value:o=l[n],startAngle:s,endAngle:s+=o*p+g,padAngle:h}}),d}var t=Number,e=vc,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var vc={};ta.layout.stack=function(){function n(o,c){if(!(h=o.length))return o;var l=o.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=cu,r=lu,u=ou,i=iu,a=au;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=\"function\"==typeof t?t:dc.get(t)||cu,n):e},n.offset=function(t){return arguments.length?(r=\"function\"==typeof t?t:mc.get(t)||lu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var dc=ta.map({\"inside-out\":function(n){var t,e,r=n.length,u=n.map(su),i=n.map(fu),a=ta.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=a[t],c>o?(o+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},\"default\":cu}),mc=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(n){var t,e,r,u,i,a,o,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:lu});ta.layout.histogram=function(){function n(n,i){for(var a,o,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)a=c[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(g>0)for(i=-1;++i<h;)o=l[i],o>=s[0]&&o<=s[1]&&(a=c[ta.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return c}var t=!0,e=Number,r=vu,u=gu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u=\"number\"==typeof t?function(n){return pu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],c=u[0],l=u[1],s=null==t?Math.sqrt:\"function\"==typeof t?t:function(){return t};if(o.x=o.y=0,nu(o,function(n){n.r=+s(n.value)}),nu(o,xu),r){var f=r*(t?1:Math.max(2*o.r/c,2*o.r/l))/2;nu(o,function(n){n.r+=f}),nu(o,xu),nu(o,function(n){n.r-=f})}return wu(o,c/2,l/2,t?1:1/Math.max(2*o.r/c,2*o.r/l)),a}var t,e=ta.layout.hierarchy().sort(du),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||\"function\"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Kr(n,e)},ta.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(nu(h,e),h.parent.m=-h.z,Qr(h,r),l)Qr(f,i);else{var g=f,p=f,v=f;Qr(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=c[0]/(p.x+o(p,g)/2+d),y=c[1]/(v.depth||1);Qr(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Cu(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,c=u.parent.children[0],l=u.m,s=i.m,f=a.m,h=c.m;a=Eu(a),u=Nu(u),a&&u;)c=Nu(c),i=Eu(i),i.a=n,r=a.z+f-u.z-l+o(a._,u._),r>0&&(Au(zu(a,n,e),n,r),l+=r,s+=r),f+=a.m,l+=u.m,h+=c.m,s+=i.m;a&&!Eu(i)&&(i.t=a,i.m+=f-s),u&&!Nu(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var a=ta.layout.hierarchy().sort(null).value(null),o=ku,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Kr(n,a)},ta.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),c=o[0],l=0;nu(c,function(n){var t=n.children;t&&t.length?(n.x=Lu(t),n.y=qu(t)):(n.x=a?l+=e(n,a):0,n.y=0,a=n)});var s=Tu(c),f=Ru(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return nu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),o}var t=ta.layout.hierarchy().sort(null).value(null),e=ku,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Kr(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,c,l=f(e),s=[],h=i.slice(),p=1/0,v=\"slice\"===g?l.dx:\"dice\"===g?l.dy:\"slice-dice\"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,\"squarify\"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),c=[];for(n(o,a.dx*a.dy/t.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<a;)u=n[i],u.x=o,u.y=l,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<a;)u=n[i],u.x=o,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),n([i],i.dx*i.dy/i.value),\n(a?e:t)(i),h&&(a=u),u}var a,o=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Du,h=!1,g=\"squarify\",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Du(t):Pu(t,\"number\"==typeof e?[e,e,e,e]:e)}function e(t){return Pu(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Du:\"function\"==(r=typeof n)?t:\"number\"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,a=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+\"\",i):g},Kr(i,o)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var yc={floor:y,ceil:y};ta.scale.linear=function(){return Yu([0,1],[0,1],yr,!1)};var Mc={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Gu(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var xc=ta.format(\".0e\"),bc={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Ku(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return ni([],{t:\"range\",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(_c)},ta.scale.category20=function(){return ta.scale.ordinal().range(wc)},ta.scale.category20b=function(){return ta.scale.ordinal().range(Sc)},ta.scale.category20c=function(){return ta.scale.ordinal().range(kc)};var _c=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),wc=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Sc=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),kc=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ta.scale.quantile=function(){return ti([],[])},ta.scale.quantize=function(){return ei(0,1,[0,1])},ta.scale.threshold=function(){return ri([.5],[0,1])},ta.scale.identity=function(){return ui([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ra,f=o.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):\"\")+\"Z\";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===Nc?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(E*=-1),l&&(E=tn(d/l*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),l){y=l*Math.cos(s+E),M=l*Math.sin(s+E),x=l*Math.cos(f-E),b=l*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=qa?0:1;if(E&&fi(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var q=Math.abs(s-f+2*N)<=qa?0:1;if(N&&fi(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Te([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=hi(null==S?[_,w]:[S,k],[y,M],l,H,g),I=hi([x,b],[_,w],l,H,g);p===H?A.push(\"M\",O[0],\"A\",H,\",\",H,\" 0 0,\",v,\" \",O[1],\"A\",l,\",\",l,\" 0 \",1-g^fi(O[1][0],O[1][1],I[1][0],I[1][1]),\",\",g,\" \",I[1],\"A\",H,\",\",H,\" 0 0,\",v,\" \",I[0]):A.push(\"M\",O[0],\"A\",H,\",\",H,\" 0 1,\",v,\" \",I[0])}else A.push(\"M\",y,\",\",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=hi([y,M],[S,k],n,-Y,g),V=hi([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?A.push(\"L\",V[0],\"A\",Y,\",\",Y,\" 0 0,\",v,\" \",V[1],\"A\",n,\",\",n,\" 0 \",g^fi(V[1][0],V[1][1],Z[1][0],Z[1][1]),\",\",1-g,\" \",Z[1],\"A\",Y,\",\",Y,\" 0 0,\",v,\" \",Z[0]):A.push(\"L\",V[0],\"A\",Y,\",\",Y,\" 0 0,\",v,\" \",Z[0])}else A.push(\"L\",_,\",\",w)}else A.push(\"M\",y,\",\",M),null!=x&&A.push(\"A\",l,\",\",l,\" 0 \",C,\",\",g,\" \",x,\",\",b),A.push(\"L\",_,\",\",w),null!=S&&A.push(\"A\",n,\",\",n,\" 0 \",q,\",\",1-g,\" \",S,\",\",k);return A.push(\"Z\"),A.join(\"\")}function t(n,t){return\"M0,\"+n+\"A\"+n+\",\"+n+\" 0 1,\"+t+\" 0,\"+-n+\"A\"+n+\",\"+n+\" 0 1,\"+t+\" 0,\"+n}var e=ai,r=oi,u=ii,i=Nc,a=ci,o=li,c=si;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Nc?Nc:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(c=En(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Nc=\"auto\";ta.svg.line=function(){return gi(y)};var Ec=ta.map({linear:pi,\"linear-closed\":vi,step:di,\"step-before\":mi,\"step-after\":yi,basis:Si,\"basis-open\":ki,\"basis-closed\":Ni,bundle:Ei,cardinal:bi,\"cardinal-open\":Mi,\"cardinal-closed\":xi,monotone:Ti});Ec.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ac=[0,2/3,1/3,0],Cc=[0,1/3,2/3,0],zc=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=gi(Ri);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mi.reverse=yi,yi.reverse=mi,ta.svg.area=function(){return Di(y)},ta.svg.area.radial=function(){var n=Di(Ri);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,o){var c=t(this,i,n,o),l=t(this,a,n,o);return\"M\"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+\"Z\"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return\"A\"+n+\",\"+n+\" 0 \"+ +(e>qa)+\",1 \"+t}function u(n,t,e,r){return\"Q 0,0 \"+r}var i=ye,a=Me,o=Pi,c=ci,l=li;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(c=En(t),n):c},n.endAngle=function(t){return arguments.length?(l=En(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,c=[i,{x:i.x,y:o},{x:a.x,y:o},a];return c=c.map(r),\"M\"+c[0]+\"C\"+c[1]+\" \"+c[2]+\" \"+c[3]}var t=ye,e=Me,r=Ui;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Ui,e=n.projection;return n.projection=function(n){return arguments.length?e(ji(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(qc.get(t.call(this,n,r))||Oi)(e.call(this,n,r))}var t=Hi,e=Fi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var qc=ta.map({circle:Oi,cross:function(n){var t=Math.sqrt(n/5)/2;return\"M\"+-3*t+\",\"+-t+\"H\"+-t+\"V\"+-3*t+\"H\"+t+\"V\"+-t+\"H\"+3*t+\"V\"+t+\"H\"+t+\"V\"+3*t+\"H\"+-t+\"V\"+t+\"H\"+-3*t+\"Z\"},diamond:function(n){var t=Math.sqrt(n/(2*Tc)),e=t*Tc;return\"M0,\"+-t+\"L\"+e+\",0 0,\"+t+\" \"+-e+\",0Z\"},square:function(n){var t=Math.sqrt(n)/2;return\"M\"+-t+\",\"+-t+\"L\"+t+\",\"+-t+\" \"+t+\",\"+t+\" \"+-t+\",\"+t+\"Z\"},\"triangle-down\":function(n){var t=Math.sqrt(n/Lc),e=t*Lc/2;return\"M0,\"+e+\"L\"+t+\",\"+-e+\" \"+-t+\",\"+-e+\"Z\"},\"triangle-up\":function(n){var t=Math.sqrt(n/Lc),e=t*Lc/2;return\"M0,\"+-e+\"L\"+t+\",\"+e+\" \"+-t+\",\"+e+\"Z\"}});ta.svg.symbolTypes=qc.keys();var Lc=Math.sqrt(3),Tc=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Rc||++jc,u=Xi(n),i=[],a=Dc||{time:Date.now(),ease:kr,delay:0,duration:250},o=-1,c=this.length;++o<c;){i.push(t=[]);for(var l=this[o],s=-1,f=l.length;++s<f;)(e=l[s])&&$i(e,s,u,r,a),t.push(e)}return Yi(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Pc:Ii(Xi(n)))};var Rc,Dc,Pc=Ii(Xi()),Uc=[],jc=0;Uc.call=_a.call,Uc.empty=_a.empty,Uc.node=_a.node,Uc.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Rc?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Uc,Uc.select=function(n){var t,e,r,u=this.id,i=this.namespace,a=[];n=A(n);for(var o=-1,c=this.length;++o<c;){a.push(t=[]);for(var l=this[o],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,o))?(\"__data__\"in r&&(e.__data__=r.__data__),$i(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yi(a,i,u)},Uc.selectAll=function(n){var t,e,r,u,i,a=this.id,o=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[o][a],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$i(u,p,o,a,i),t.push(u)}return Yi(c,o,a)},Uc.filter=function(n){var t,e,r,u=[];\"function\"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Yi(u,this.namespace,this.id)},Uc.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Uc.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+=\"\",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+=\"\",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a=\"transform\"==n?Or:yr,o=ta.ns.qualify(n);return Zi(this,\"attr.\"+n,t,o.local?i:u)},Uc.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween(\"attr.\"+n,u.local?r:e)},Uc.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+=\"\",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=yr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if(\"string\"!=typeof n){2>a&&(e=\"\");for(r in n)this.style(r,n[r],e);return this}r=\"\"}return Zi(this,\"style.\"+n,e,i)},Uc.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=\"\"),this.tween(\"style.\"+n,u)},Uc.text=function(n){return Zi(this,\"text\",n,Vi)},Uc.remove=function(){var n=this.namespace;return this.each(\"end.transition\",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Uc.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:(\"function\"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Uc.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,\"function\"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Uc.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,\"function\"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Uc.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Dc,i=Rc;try{Rc=e,Y(this,function(t,u,i){Dc=t[r][e],n.call(t,t.__data__,u,i)})}finally{Dc=u,Rc=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch(\"start\",\"end\",\"interrupt\"))).on(n,t)});return this},Uc.transition=function(){for(var n,t,e,r,u=this.id,i=++jc,a=this.namespace,o=[],c=0,l=this.length;l>c;c++){o.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],$i(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yi(o,a,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,o):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=l.selectAll(\".tick\").data(h,f),v=p.enter().insert(\"g\",\".domain\").attr(\"class\",\"tick\").style(\"opacity\",Ca),d=ta.transition(p.exit()).style(\"opacity\",Ca).remove(),m=ta.transition(p.order()).style(\"opacity\",1),M=Math.max(u,0)+a,x=ju(f),b=l.selectAll(\".domain\").data([0]),_=(b.enter().append(\"path\").attr(\"class\",\"domain\"),ta.transition(b));v.append(\"line\"),v.append(\"text\");var w,S,k,N,E=v.select(\"line\"),A=m.select(\"line\"),C=p.select(\"text\").text(g),z=v.select(\"text\"),q=m.select(\"text\"),L=\"top\"===r||\"left\"===r?-1:1;if(\"bottom\"===r||\"top\"===r?(n=Bi,w=\"x\",k=\"y\",S=\"x2\",N=\"y2\",C.attr(\"dy\",0>L?\"0em\":\".71em\").style(\"text-anchor\",\"middle\"),_.attr(\"d\",\"M\"+x[0]+\",\"+L*i+\"V0H\"+x[1]+\"V\"+L*i)):(n=Wi,w=\"y\",k=\"x\",S=\"y2\",N=\"x2\",C.attr(\"dy\",\".32em\").style(\"text-anchor\",0>L?\"end\":\"start\"),_.attr(\"d\",\"M\"+L*i+\",\"+x[0]+\"H0V\"+x[1]+\"H\"+L*i)),E.attr(N,L*u),z.attr(k,L*M),A.attr(S,0).attr(N,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=Fc,u=6,i=6,a=3,o=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Hc?t+\"\":Fc,n):r},n.ticks=function(){return arguments.length?(o=arguments,n):o},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Fc=\"bottom\",Hc={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style(\"pointer-events\",\"all\").style(\"-webkit-tap-highlight-color\",\"rgba(0,0,0,0)\").on(\"mousedown.brush\",i).on(\"touchstart.brush\",i),a=t.selectAll(\".background\").data([0]);a.enter().append(\"rect\").attr(\"class\",\"background\").style(\"visibility\",\"hidden\").style(\"cursor\",\"crosshair\"),t.selectAll(\".extent\").data([0]).enter().append(\"rect\").attr(\"class\",\"extent\").style(\"cursor\",\"move\");var o=t.selectAll(\".resize\").data(v,y);o.exit().remove(),o.enter().append(\"g\").attr(\"class\",function(n){return\"resize \"+n}).style(\"cursor\",function(n){return Oc[n]}).append(\"rect\").attr(\"x\",function(n){return/[ew]$/.test(n)?-3:null}).attr(\"y\",function(n){return/^[ns]/.test(n)?-3:null}).attr(\"width\",6).attr(\"height\",6).style(\"visibility\",\"hidden\"),o.style(\"display\",n.empty()?\"none\":null);var c,f=ta.transition(t),h=ta.transition(a);l&&(c=ju(l),h.attr(\"x\",c[0]).attr(\"width\",c[1]-c[0]),r(f)),s&&(c=ju(s),h.attr(\"y\",c[0]).attr(\"height\",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(\".resize\").attr(\"transform\",function(n){return\"translate(\"+f[+/e$/.test(n)]+\",\"+h[+/^s/.test(n)]+\")\"})}function r(n){n.select(\".extent\").attr(\"x\",f[0]),n.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\",f[1]-f[0])}function u(n){n.select(\".extent\").attr(\"y\",h[0]),n.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),E&&m(n,l,0)&&(r(k),t=!0),A&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:\"brush\",mode:C?\"move\":\"resize\"}))}function m(n,t,e){var r,u,i=ju(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style(\"pointer-events\",\"all\").selectAll(\".resize\").style(\"display\",n.empty()?\"none\":null),ta.select(\"body\").style(\"cursor\",null),L.on(\"mousemove.brush\",null).on(\"mouseup.brush\",null).on(\"touchmove.brush\",null).on(\"touchend.brush\",null).on(\"keydown.brush\",null).on(\"keyup.brush\",null),z(),w({type:\"brushend\"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&l,A=!/^(e|w)$/.test(N)&&s,C=_.classed(\"extent\"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on(\"keydown.brush\",i).on(\"keyup.brush\",v);if(ta.event.changedTouches?L.on(\"touchmove.brush\",d).on(\"touchend.brush\",y):L.on(\"mousemove.brush\",d).on(\"mouseup.brush\",y),k.interrupt().selectAll(\"*\").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style(\"pointer-events\",\"none\").selectAll(\".resize\").style(\"display\",null),ta.select(\"body\").style(\"cursor\",_.style(\"cursor\")),w({type:\"brushstart\"}),d()}var a,o,c=N(n,\"brushstart\",\"brush\",\"brushend\"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ic[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Rc?ta.select(this).transition().each(\"start.brush\",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:\"brushstart\"})}).tween(\"brush:brush\",function(){var e=Mr(f,t.x),r=Mr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:\"brush\",mode:\"resize\"})}}).each(\"end.brush\",function(){a=t.i,o=t.j,n({type:\"brush\",mode:\"resize\"}),n({type:\"brushend\"})}):(n({type:\"brushstart\"}),n({type:\"brush\",mode:\"resize\"}),n({type:\"brushend\"}))})},n.x=function(t){return arguments.length?(l=t,v=Ic[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ic[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,\"on\")};var Oc={n:\"ns-resize\",e:\"ew-resize\",s:\"ns-resize\",w:\"ew-resize\",nw:\"nwse-resize\",ne:\"nesw-resize\",se:\"nwse-resize\",sw:\"nesw-resize\"},Ic=[[\"n\",\"e\",\"s\",\"w\",\"nw\",\"ne\",\"se\",\"sw\"],[\"e\",\"w\"],[\"n\",\"s\"],[]],Yc=oo.format=go.timeFormat,Zc=Yc.utc,Vc=Zc(\"%Y-%m-%dT%H:%M:%S.%LZ\");Yc.iso=Date.prototype.toISOString&&+new Date(\"2000-01-01T00:00:00.000Z\")?Ji:Vc,Ji.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Ji.toString=Vc.toString,oo.second=Hn(function(n){return new co(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),oo.seconds=oo.second.range,oo.seconds.utc=oo.second.utc.range,oo.minute=Hn(function(n){return new co(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),oo.minutes=oo.minute.range,oo.minutes.utc=oo.minute.utc.range,oo.hour=Hn(function(n){var t=n.getTimezoneOffset()/60;return new co(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),oo.hours=oo.hour.range,oo.hours.utc=oo.hour.utc.range,oo.month=Hn(function(n){return n=oo.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),oo.months=oo.month.range,oo.months.utc=oo.month.utc.range;var Xc=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],$c=[[oo.second,1],[oo.second,5],[oo.second,15],[oo.second,30],[oo.minute,1],[oo.minute,5],[oo.minute,15],[oo.minute,30],[oo.hour,1],[oo.hour,3],[oo.hour,6],[oo.hour,12],[oo.day,1],[oo.day,2],[oo.week,1],[oo.month,1],[oo.month,3],[oo.year,1]],Bc=Yc.multi([[\".%L\",function(n){return n.getMilliseconds()}],[\":%S\",function(n){return n.getSeconds()}],[\"%I:%M\",function(n){return n.getMinutes()}],[\"%I %p\",function(n){return n.getHours()}],[\"%a %d\",function(n){return n.getDay()&&1!=n.getDate()}],[\"%b %d\",function(n){return 1!=n.getDate()}],[\"%B\",function(n){return n.getMonth()}],[\"%Y\",Ct]]),Wc={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ki)},floor:y,ceil:y};$c.year=oo.year,oo.scale=function(){return Gi(ta.scale.linear(),$c,Bc)};var Jc=$c.map(function(n){return[n[0].utc,n[1]]}),Gc=Zc.multi([[\".%L\",function(n){return n.getUTCMilliseconds()}],[\":%S\",function(n){return n.getUTCSeconds()}],[\"%I:%M\",function(n){return n.getUTCMinutes()}],[\"%I %p\",function(n){return n.getUTCHours()}],[\"%a %d\",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[\"%b %d\",function(n){return 1!=n.getUTCDate()}],[\"%B\",function(n){return n.getUTCMonth()}],[\"%Y\",Ct]]);Jc.year=oo.year.utc,oo.scale.utc=function(){return Gi(ta.scale.linear(),Jc,Gc)},ta.text=An(function(n){return n.responseText}),ta.json=function(n,t){return Cn(n,\"application/json\",Qi,t)},ta.html=function(n,t){return Cn(n,\"text/html\",na,t)},ta.xml=An(function(n){return n.responseXML}),\"function\"==typeof define&&define.amd?define(ta):\"object\"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}();`)\n\nfunc appVendorD3D3MinJsBytes() ([]byte, error) {\n\treturn _appVendorD3D3MinJs, nil\n}\n\nfunc appVendorD3D3MinJs() (*asset, error) {\n\tbytes, err := appVendorD3D3MinJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/vendor/d3/d3.min.js\", size: 151123, mode: os.FileMode(416), modTime: time.Unix(1454116417, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appViewsPartials404Html = []byte(`<span>The page you're looking for could not be found.</span>`)\n\nfunc appViewsPartials404HtmlBytes() ([]byte, error) {\n\treturn _appViewsPartials404Html, nil\n}\n\nfunc appViewsPartials404Html() (*asset, error) {\n\tbytes, err := appViewsPartials404HtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/views/partials/404.html\", size: 60, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appViewsPartialsKubernetesUiMenuTmplHtml = []byte(`<ul class=\"kubernetes-ui-menu\">\n    <li ng-repeat=\"section in menu.sections\" class=\"parent-list-item\" ng-class=\"{'parentActive' : isSectionSelected(section)}\">\n        <h2 class=\"menu-heading\" ng-if=\"section.type === 'heading'\" id=\"heading_{{ section.name | nospace }}\">\n            {{section.name}}\n        </h2>\n        <menu-link section=\"section\" ng-if=\"section.type === 'link'\"></menu-link>\n        <menu-toggle section=\"section\" ng-if=\"section.type === 'toggle'\"></menu-toggle>\n        <ul ng-if=\"section.children\" class=\"menu-nested-list\">\n            <li ng-repeat=\"child in section.children\" ng-class=\"{'childActive' : isSectionSelected(child)}\">\n                <menu-toggle section=\"child\"></menu-toggle>\n            </li>\n        </ul>\n    </li>\n</ul>\n`)\n\nfunc appViewsPartialsKubernetesUiMenuTmplHtmlBytes() ([]byte, error) {\n\treturn _appViewsPartialsKubernetesUiMenuTmplHtml, nil\n}\n\nfunc appViewsPartialsKubernetesUiMenuTmplHtml() (*asset, error) {\n\tbytes, err := appViewsPartialsKubernetesUiMenuTmplHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/views/partials/kubernetes-ui-menu.tmpl.html\", size: 764, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appViewsPartialsMdTableTmplHtml = []byte(`<table class=\"md-table\">\n    <thead>\n        <tr class=\"md-table-headers-row\">\n            <th class=\"md-table-header\" ng-repeat=\"h in headers\">\n                <a href ng-if=\"handleSort(h.field)\" ng-click=\"reverse=!reverse;order(h.field,reverse)\">{{h.name}} <span class=\"md-table-caret\" ng-show=\"reverse && h.field == predicate\"><img src=\"assets/img/ic_arrow_drop_up_24px.svg\"></span><span  class=\"md-table-caret\" ng-show=\"!reverse && h.field == predicate\"><img src=\"assets/img/ic_arrow_drop_down_24px.svg\"></span></a>\n                <span ng-if=\"!handleSort(h.field)\">{{h.name}}</span>\n            </th>\n            <th class=\"md-table-header\" ng-show=\"showMore()\"></th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr class=\"md-table-content-row\" ng-repeat=\"c in content | filter:filters | startFrom:currentPage*count | limitTo: count\">\n            <td ng-repeat=\"h in headers\" ng-if=\"h.field == thumbs\" class=\"md-table-thumbs\">\n                <div ng-if=\"h.field == thumbs\" style=\"background-image:url({{c.thumb}})\"></div>\n            </td>\n            <td class=\"md-table-content\" ng-click=\"doSelect({data:c})\" ng-repeat=\"h in headers\" ng-class=\"customClass[h.field]\" ng-if=\"h.field != thumbs\">\n                {{c[h.field]}}\n            </td>\n            <td class=\"md-table-td-more\" ng-show=\"showMore()\">\n                <md-button aria-label=\"More\" ng-click=\"moreClick(c, $event)\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                        <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n                    </svg>\n                </md-button>\n            </td>\n        </tr>\n    </tbody>\n</table>\n<div class=\"md-table-footer\" layout=\"row\">\n    <span class=\"md-table-count-info\">Rows count per page : <a href ng-click=\"goToPage(0); count=1\">1</a>, <a href ng-click=\"goToPage(0); count=10\">10</a>, <a href ng-click=\"goToPage(0); count=25\">25</a>, <a href ng-click=\"goToPage(0); count=50\">50</a>, <a href ng-click=\"goToPage(0); count=100\">100</a> (current\n        is\n        <strong>{{count}}</strong>)</span>\n    <span flex></span>\n    <span ng-show=\"nbOfPages() > 1\">\n        <md-button aria-label=\"Back\" class=\"md-table-footer-item\" ng-disabled=\"currentPage==0\" ng-click=\"currentPage=currentPage-1\">\n            <img src=\"assets/img/ic_keyboard_arrow_left_24px.svg\">\n        </md-button>\n        <a href ng-repeat=\"i in getNumber(nbOfPages()) track by $index\">\n            <md-button aria-label=\"Next\" class=\"md-primary md-table-footer-item\" ng-click=\"goToPage($index)\">\n                <span ng-class=\"{ 'md-table-active-page': currentPage==$index}\">{{$index+1}}</span>\n            </md-button>\n        </a>\n        <md-button aria-label=\"Jump\" class=\"md-table-footer-item\" ng-disabled=\"currentPage==nbOfPages()-1\" ng-click=\"currentPage=currentPage+1\">\n            <img src=\"assets/img/ic_keyboard_arrow_right_24px.svg\">\n        </md-button>\n    </span>\n</div>\n`)\n\nfunc appViewsPartialsMdTableTmplHtmlBytes() ([]byte, error) {\n\treturn _appViewsPartialsMdTableTmplHtml, nil\n}\n\nfunc appViewsPartialsMdTableTmplHtml() (*asset, error) {\n\tbytes, err := appViewsPartialsMdTableTmplHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/views/partials/md-table.tmpl.html\", size: 3057, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\nvar _appViewsPartialsMenuToggleTmplHtml = []byte(`<md-button class=\"md-button-toggle\" ng-click=\"toggle()\" aria-controls=\"kubernetes-ui-menu-{{section.name | nospace}}\" flex layout=\"row\" aria-expanded=\"{{isOpen()}}\">\n    {{section.name}}\n    <span aria-hidden=\"true\" class=\"md-toggle-icon\" ng-class=\"{'toggled' : isOpen()}\"></span>\n    <span class=\"visually-hidden\">Toggle {{isOpen()? 'expanded' : 'collapsed'}}</span>\n</md-button>\n<ul ng-show=\"isOpen()\" id=\"kubernetes-ui-menu-{{section.name | nospace}}\" class=\"menu-toggle-list\">\n    <li ng-repeat=\"page in section.pages\">\n        <menu-link section=\"page\"></menu-link>\n    </li>\n</ul>\n`)\n\nfunc appViewsPartialsMenuToggleTmplHtmlBytes() ([]byte, error) {\n\treturn _appViewsPartialsMenuToggleTmplHtml, nil\n}\n\nfunc appViewsPartialsMenuToggleTmplHtml() (*asset, error) {\n\tbytes, err := appViewsPartialsMenuToggleTmplHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"app/views/partials/menu-toggle.tmpl.html\", size: 587, mode: os.FileMode(416), modTime: time.Unix(1454116395, 0)}\n\ta := &asset{bytes: bytes, info: info}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[cannonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"app/assets/css/app.css\":                                         appAssetsCssAppCss,\n\t\"app/assets/img/docArrow.png\":                                    appAssetsImgDocarrowPng,\n\t\"app/assets/img/ic_arrow_drop_down_24px.svg\":                     appAssetsImgIc_arrow_drop_down_24pxSvg,\n\t\"app/assets/img/ic_arrow_drop_up_24px.svg\":                       appAssetsImgIc_arrow_drop_up_24pxSvg,\n\t\"app/assets/img/ic_keyboard_arrow_left_24px.svg\":                 appAssetsImgIc_keyboard_arrow_left_24pxSvg,\n\t\"app/assets/img/ic_keyboard_arrow_right_24px.svg\":                appAssetsImgIc_keyboard_arrow_right_24pxSvg,\n\t\"app/assets/img/icons/arrow-back.png\":                            appAssetsImgIconsArrowBackPng,\n\t\"app/assets/img/icons/favicon.png\":                               appAssetsImgIconsFaviconPng,\n\t\"app/assets/img/icons/ic_arrow_forward_24px.svg\":                 appAssetsImgIconsIc_arrow_forward_24pxSvg,\n\t\"app/assets/img/icons/ic_cancel_24px.svg\":                        appAssetsImgIconsIc_cancel_24pxSvg,\n\t\"app/assets/img/icons/ic_close_24px.svg\":                         appAssetsImgIconsIc_close_24pxSvg,\n\t\"app/assets/img/icons/ic_menu.svg\":                               appAssetsImgIconsIc_menuSvg,\n\t\"app/assets/img/icons/ic_menu_24px.svg\":                          appAssetsImgIconsIc_menu_24pxSvg,\n\t\"app/assets/img/icons/list_control_down.png\":                     appAssetsImgIconsList_control_downPng,\n\t\"app/assets/img/kubernetes.svg\":                                  appAssetsImgKubernetesSvg,\n\t\"app/assets/js/app.js\":                                           appAssetsJsAppJs,\n\t\"app/assets/js/base.js\":                                          appAssetsJsBaseJs,\n\t\"app/components/dashboard/img/icons/ic_arrow_drop_down_18px.svg\": appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvg,\n\t\"app/components/dashboard/img/icons/ic_arrow_drop_down_24px.svg\": appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvg,\n\t\"app/components/dashboard/img/icons/ic_close_18px.svg\":           appComponentsDashboardImgIconsIc_close_18pxSvg,\n\t\"app/components/dashboard/img/icons/ic_close_24px.svg\":           appComponentsDashboardImgIconsIc_close_24pxSvg,\n\t\"app/components/dashboard/manifest.json\":                         appComponentsDashboardManifestJson,\n\t\"app/components/dashboard/pages/footer.html\":                     appComponentsDashboardPagesFooterHtml,\n\t\"app/components/dashboard/pages/header.html\":                     appComponentsDashboardPagesHeaderHtml,\n\t\"app/components/dashboard/pages/home.html\":                       appComponentsDashboardPagesHomeHtml,\n\t\"app/components/dashboard/views/groups.html\":                     appComponentsDashboardViewsGroupsHtml,\n\t\"app/components/dashboard/views/listEvents.html\":                 appComponentsDashboardViewsListeventsHtml,\n\t\"app/components/dashboard/views/listMinions.html\":                appComponentsDashboardViewsListminionsHtml,\n\t\"app/components/dashboard/views/listPods.html\":                   appComponentsDashboardViewsListpodsHtml,\n\t\"app/components/dashboard/views/listPodsCards.html\":              appComponentsDashboardViewsListpodscardsHtml,\n\t\"app/components/dashboard/views/listPodsVisualizer.html\":         appComponentsDashboardViewsListpodsvisualizerHtml,\n\t\"app/components/dashboard/views/listReplicationControllers.html\": appComponentsDashboardViewsListreplicationcontrollersHtml,\n\t\"app/components/dashboard/views/listServices.html\":               appComponentsDashboardViewsListservicesHtml,\n\t\"app/components/dashboard/views/node.html\":                       appComponentsDashboardViewsNodeHtml,\n\t\"app/components/dashboard/views/partials/cadvisor.html\":          appComponentsDashboardViewsPartialsCadvisorHtml,\n\t\"app/components/dashboard/views/partials/groupBox.html\":          appComponentsDashboardViewsPartialsGroupboxHtml,\n\t\"app/components/dashboard/views/partials/groupItem.html\":         appComponentsDashboardViewsPartialsGroupitemHtml,\n\t\"app/components/dashboard/views/partials/podTilesByName.html\":    appComponentsDashboardViewsPartialsPodtilesbynameHtml,\n\t\"app/components/dashboard/views/partials/podTilesByServer.html\":  appComponentsDashboardViewsPartialsPodtilesbyserverHtml,\n\t\"app/components/dashboard/views/pod.html\":                        appComponentsDashboardViewsPodHtml,\n\t\"app/components/dashboard/views/replication.html\":                appComponentsDashboardViewsReplicationHtml,\n\t\"app/components/dashboard/views/service.html\":                    appComponentsDashboardViewsServiceHtml,\n\t\"app/index.html\":                                                 appIndexHtml,\n\t\"app/vendor/angular-json-human/dist/angular-json-human.css\":      appVendorAngularJsonHumanDistAngularJsonHumanCss,\n\t\"app/vendor/angular-material/angular-material.css\":               appVendorAngularMaterialAngularMaterialCss,\n\t\"app/vendor/d3/d3.min.js\":                                        appVendorD3D3MinJs,\n\t\"app/views/partials/404.html\":                                    appViewsPartials404Html,\n\t\"app/views/partials/kubernetes-ui-menu.tmpl.html\":                appViewsPartialsKubernetesUiMenuTmplHtml,\n\t\"app/views/partials/md-table.tmpl.html\":                          appViewsPartialsMdTableTmplHtml,\n\t\"app/views/partials/menu-toggle.tmpl.html\":                       appViewsPartialsMenuToggleTmplHtml,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(cannonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"app\": {nil, map[string]*bintree{\n\t\t\"assets\": {nil, map[string]*bintree{\n\t\t\t\"css\": {nil, map[string]*bintree{\n\t\t\t\t\"app.css\": {appAssetsCssAppCss, map[string]*bintree{}},\n\t\t\t}},\n\t\t\t\"img\": {nil, map[string]*bintree{\n\t\t\t\t\"docArrow.png\":                     {appAssetsImgDocarrowPng, map[string]*bintree{}},\n\t\t\t\t\"ic_arrow_drop_down_24px.svg\":      {appAssetsImgIc_arrow_drop_down_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\"ic_arrow_drop_up_24px.svg\":        {appAssetsImgIc_arrow_drop_up_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\"ic_keyboard_arrow_left_24px.svg\":  {appAssetsImgIc_keyboard_arrow_left_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\"ic_keyboard_arrow_right_24px.svg\": {appAssetsImgIc_keyboard_arrow_right_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\"icons\": {nil, map[string]*bintree{\n\t\t\t\t\t\"arrow-back.png\":            {appAssetsImgIconsArrowBackPng, map[string]*bintree{}},\n\t\t\t\t\t\"favicon.png\":               {appAssetsImgIconsFaviconPng, map[string]*bintree{}},\n\t\t\t\t\t\"ic_arrow_forward_24px.svg\": {appAssetsImgIconsIc_arrow_forward_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\"ic_cancel_24px.svg\":        {appAssetsImgIconsIc_cancel_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\"ic_close_24px.svg\":         {appAssetsImgIconsIc_close_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\"ic_menu.svg\":               {appAssetsImgIconsIc_menuSvg, map[string]*bintree{}},\n\t\t\t\t\t\"ic_menu_24px.svg\":          {appAssetsImgIconsIc_menu_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\"list_control_down.png\":     {appAssetsImgIconsList_control_downPng, map[string]*bintree{}},\n\t\t\t\t}},\n\t\t\t\t\"kubernetes.svg\": {appAssetsImgKubernetesSvg, map[string]*bintree{}},\n\t\t\t}},\n\t\t\t\"js\": {nil, map[string]*bintree{\n\t\t\t\t\"app.js\":  {appAssetsJsAppJs, map[string]*bintree{}},\n\t\t\t\t\"base.js\": {appAssetsJsBaseJs, map[string]*bintree{}},\n\t\t\t}},\n\t\t}},\n\t\t\"components\": {nil, map[string]*bintree{\n\t\t\t\"dashboard\": {nil, map[string]*bintree{\n\t\t\t\t\"img\": {nil, map[string]*bintree{\n\t\t\t\t\t\"icons\": {nil, map[string]*bintree{\n\t\t\t\t\t\t\"ic_arrow_drop_down_18px.svg\": {appComponentsDashboardImgIconsIc_arrow_drop_down_18pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\t\"ic_arrow_drop_down_24px.svg\": {appComponentsDashboardImgIconsIc_arrow_drop_down_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\t\"ic_close_18px.svg\":           {appComponentsDashboardImgIconsIc_close_18pxSvg, map[string]*bintree{}},\n\t\t\t\t\t\t\"ic_close_24px.svg\":           {appComponentsDashboardImgIconsIc_close_24pxSvg, map[string]*bintree{}},\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t\t\"manifest.json\": {appComponentsDashboardManifestJson, map[string]*bintree{}},\n\t\t\t\t\"pages\": {nil, map[string]*bintree{\n\t\t\t\t\t\"footer.html\": {appComponentsDashboardPagesFooterHtml, map[string]*bintree{}},\n\t\t\t\t\t\"header.html\": {appComponentsDashboardPagesHeaderHtml, map[string]*bintree{}},\n\t\t\t\t\t\"home.html\":   {appComponentsDashboardPagesHomeHtml, map[string]*bintree{}},\n\t\t\t\t}},\n\t\t\t\t\"views\": {nil, map[string]*bintree{\n\t\t\t\t\t\"groups.html\":                     {appComponentsDashboardViewsGroupsHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listEvents.html\":                 {appComponentsDashboardViewsListeventsHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listMinions.html\":                {appComponentsDashboardViewsListminionsHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listPods.html\":                   {appComponentsDashboardViewsListpodsHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listPodsCards.html\":              {appComponentsDashboardViewsListpodscardsHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listPodsVisualizer.html\":         {appComponentsDashboardViewsListpodsvisualizerHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listReplicationControllers.html\": {appComponentsDashboardViewsListreplicationcontrollersHtml, map[string]*bintree{}},\n\t\t\t\t\t\"listServices.html\":               {appComponentsDashboardViewsListservicesHtml, map[string]*bintree{}},\n\t\t\t\t\t\"node.html\":                       {appComponentsDashboardViewsNodeHtml, map[string]*bintree{}},\n\t\t\t\t\t\"partials\": {nil, map[string]*bintree{\n\t\t\t\t\t\t\"cadvisor.html\":         {appComponentsDashboardViewsPartialsCadvisorHtml, map[string]*bintree{}},\n\t\t\t\t\t\t\"groupBox.html\":         {appComponentsDashboardViewsPartialsGroupboxHtml, map[string]*bintree{}},\n\t\t\t\t\t\t\"groupItem.html\":        {appComponentsDashboardViewsPartialsGroupitemHtml, map[string]*bintree{}},\n\t\t\t\t\t\t\"podTilesByName.html\":   {appComponentsDashboardViewsPartialsPodtilesbynameHtml, map[string]*bintree{}},\n\t\t\t\t\t\t\"podTilesByServer.html\": {appComponentsDashboardViewsPartialsPodtilesbyserverHtml, map[string]*bintree{}},\n\t\t\t\t\t}},\n\t\t\t\t\t\"pod.html\":         {appComponentsDashboardViewsPodHtml, map[string]*bintree{}},\n\t\t\t\t\t\"replication.html\": {appComponentsDashboardViewsReplicationHtml, map[string]*bintree{}},\n\t\t\t\t\t\"service.html\":     {appComponentsDashboardViewsServiceHtml, map[string]*bintree{}},\n\t\t\t\t}},\n\t\t\t}},\n\t\t}},\n\t\t\"index.html\": {appIndexHtml, map[string]*bintree{}},\n\t\t\"vendor\": {nil, map[string]*bintree{\n\t\t\t\"angular-json-human\": {nil, map[string]*bintree{\n\t\t\t\t\"dist\": {nil, map[string]*bintree{\n\t\t\t\t\t\"angular-json-human.css\": {appVendorAngularJsonHumanDistAngularJsonHumanCss, map[string]*bintree{}},\n\t\t\t\t}},\n\t\t\t}},\n\t\t\t\"angular-material\": {nil, map[string]*bintree{\n\t\t\t\t\"angular-material.css\": {appVendorAngularMaterialAngularMaterialCss, map[string]*bintree{}},\n\t\t\t}},\n\t\t\t\"d3\": {nil, map[string]*bintree{\n\t\t\t\t\"d3.min.js\": {appVendorD3D3MinJs, map[string]*bintree{}},\n\t\t\t}},\n\t\t}},\n\t\t\"views\": {nil, map[string]*bintree{\n\t\t\t\"partials\": {nil, map[string]*bintree{\n\t\t\t\t\"404.html\":                     {appViewsPartials404Html, map[string]*bintree{}},\n\t\t\t\t\"kubernetes-ui-menu.tmpl.html\": {appViewsPartialsKubernetesUiMenuTmplHtml, map[string]*bintree{}},\n\t\t\t\t\"md-table.tmpl.html\":           {appViewsPartialsMdTableTmplHtml, map[string]*bintree{}},\n\t\t\t\t\"menu-toggle.tmpl.html\":        {appViewsPartialsMenuToggleTmplHtml, map[string]*bintree{}},\n\t\t\t}},\n\t\t}},\n\t}},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "docs/ui.md",
    "content": "# Kubernetes UI Instructions\n\n## Kubernetes User Interface\nKubernetes has an extensible user interface with default functionality that describes the current cluster. See the [README](../README.md) for more information.\n\n### Running locally\nAssuming that you have a cluster running locally at `localhost:8080`, as described [here](https://github.com/kubernetes/kubernetes/blob/master/docs/getting-started-guides/locally.md), you can run the UI against it with kubectl:\n\n```sh\nkubectl proxy --www=<kube-ui home>/app --www-prefix=/\n```\n\nYou should now be able to access it by visiting [localhost:8001](http://localhost:8001/).\n\nYou can also use other web servers to serve the contents of the www/app directory, as described [here](../README.md#serving-the-app-during-development). \n\n### Running remotely\nWhen Kubernetes is deployed remotely, the api server deploys the UI. To access it, visit `/static/app/` or `/ui`, which redirects to `/static/app/`, on your master server.\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/ui.md?pixel)]()\n"
  },
  {
    "path": "hooks/boilerplate.go.txt",
    "content": "/*\nCopyright YEAR The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n"
  },
  {
    "path": "master/.bowerrc",
    "content": "{\n  \"directory\": \"../third_party/ui/bower_components\"\n}\n"
  },
  {
    "path": "master/README.md",
    "content": "### Application source and project files\n\nThis directory contains the source and project files for the application, including:\n\n* `bower.json`, which declares the framework dependencies downloaded by bower, \n* `gulpfile.js`, which defines the build tasks run by `npm start` and `npm run build`, \n* `karma.conf.js`, the default configuration file for top level karma tests.\n* `package.json`, which declares the tool dependences downloaded by `npm install`.\n* `vendor.json` and `vendor.base.json`, which declare dependencies compiled into `app.js` and `base.js`, respectively.\n\nYou will find the following directories inside:\n\n* `components/` This directory contains components that appear as tabs in the application. See [master/components/README.md](master/components/README.md).\n* `less/` This directory contains the LESS files for the core styles and material styles.\n* `js/` Here you will find JavaScript files compiled into `app.js`.\n* `protractor/` This directory contains the default  configuration file `conf.js` and the `*.spec.js` files for  the top level protractor tests.\n* `shared/` This directory contains assets shared by two or more components.\n* `test/` This directory contains the `*.spec.js` files for  the top level karma tests. The default configuration file is `master/karma.conf.js`.\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/www/master/README.md?pixel)]()\n"
  },
  {
    "path": "master/bower.json",
    "content": "{\n  \"name\": \"kube-ui\",\n  \"description\": \"UI for Kubernetes\",\n  \"version\": \"0.0.0\",\n  \"homepage\": \"https://github.com/kubernetes/kube-ui\",\n  \"license\": \"Apache\",\n  \"private\": true,\n  \"dependencies\": {\n    \"jquery\": \"~2.1.3\",\n    \"angular\": \"1.3.x\",\n    \"angular-route\": \"1.3.x\",\n    \"angular-css\": \"1.0.x\",\n    \"angular-mocks\": \"1.3.x\",\n    \"angular-animate\": \"1.3.x\",\n    \"angular-aria\": \"1.3.x\",\n    \"angular-material\": \"0.8.1\",\n    \"angularjs-jasmine-matchers\": \"0.2\",\n    \"hammerjs\": \"~2.0.2\",\n    \"angular-cookies\": \"1.3.x\",\n    \"modernizr\": \"2.8.3\",\n    \"ng-lodash\": \"~0.2.0\",\n    \"string-format-js\": \"~0.1.2\",\n    \"sprintf\": \"~1.0.2\",\n    \"jsonpath\": \"#3f6e79e\",\n    \"d3\": \"~3.5.5\",\n    \"d3-context-menu\": \"\",\n    \"angular-json-human\": \"~1.2.1\",\n    \"angular-filter\": \"~0.5.1\"\n  }\n}\n"
  },
  {
    "path": "master/components/README.md",
    "content": "Components\n==========\n\nA tab in the Kubernetes UI with its set of visualizations is referred to as a *component*. Components are separated from the chrome and services to simplify the development of new visualizations. This document describes how to create and modify components.\n\nEach component has its own directory in `www/master/components`. The component directory contains a manifest file and the files comprising the component, such as HTML  pages and views, Angular providers, CSS and Less files, and other assets. Here is the recommended structure for a component directory:\n\n```\nfoo_component\n├── config\n├── css\n├── img\n├── js\n│   └── modules\n│       ├── controllers\n│       ├── directives\n│       └── services\n├── less\n├── pages\n├── protractor\n├── test\n├── views\n│   └── partials\n└── manifest.json\n```\n\n###Manifest file\n\nThe JSON-formatted manifest file, named `manifest.json`, resides at the root of the directory. Using the component directory name and the contents of the manifest, the Kubernetes UI automatically adds a tab to the chrome, a dependency on the component's AngularJS module in the main AngularJS app, and Angular routes for the component.\n\nFor example, consider the following manifest file at `master/components/foo_component/manifest.json`:\n\n```\n{\n  \"routes\": [\n    {\n      \"url\": \"/\",\n      \"templateUrl\": \"/components/foo_component/pages/home.html\"\n    },\n    {\n      \"url\": \"/kittens\",\n      \"templateUrl\": \"/components/foo_component/pages/kittens.html\",\n      \"css\": \"/components/foo_component/css/kittens.css\"\n    }\n  ]\n}\n```\n\nFrom the name of the component directory, the Kubernetes UI:\n\n* creates a tab called \"Foo Component\",\n* adds Angular module `kubernetesApp.components.fooComponent` to the dependencies of `kubernetesApp`, and\n* defines Angular routes `/foo_component/` and `/foo_component/kittens`.\n\nEvery tab links to `/` relative to its component, so it is important to always define a `/` route.\n\n###Source files\nMany of the files located in `master/components/<component>` are copied to `app/components/<component>/` on each gulp build. This includes (but is not limited to) HTML pages and views, CSS files and images.\n\nExceptions include the `config` and `less` directories, and all of the `.js` files. The following sections explain how the exceptions are built into the UI.\n\n####JavaScript\nAll JavaScript files located in the `master/components/<component>/js` are concatenated together with the rest of the UI's JavaScript and written to `app/assets/js/app.js`. In the production build, they are also uglified.\n\n####Configuration\n\nSimilar to the [application wide configuration](../../README.md#configuration), components can define environment specific configuration. The gulp task creates the constant `ENV` under the `kubernetesApp.config` module, which is an object with a property for the root UI and each component.\n\nFor example, a configuration for the `development` environment specific to `foo_component` would be located at `master/components/foo_component/config/development.json`. Such a component would access its `development.json` configuration verbatim at `ENV.foo_component`:\n\n```\nangular.module('kubernetesApp.components.fooComponent', ['kubernetesApp.config'])\n    .provider('foo', ...)\n    .config(['fooProvider', 'ENV', function(fooProvider, ENV) {\n      // Configure fooProvider using ENV['foo_component'].\n    });\n```\n\n####Less\n\nLike JavaScript, the component's Less files are built into one monolithic CSS file. All top-level Less files located at `master/components/<component>/less/*.less` are imported into the main UI's Less file. The result is then copied to `app/assets/css/app.css`. In the production build, it is also minified.\n\nSub-directories of this path are watched for changes, but not directly imported. This is useful for defining common colors, mixins and other functions or variables used by the top-level Less files.\n\n###Appendix\n\n####Manifest schema\n\n```\n{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"description\": {\n      \"type\": \"string\",\n      \"description\": \"Very brief summary of the component. Use a README.md file for detailed descriptions.\"\n    },\n    \"routes\": {\n      \"type\": \"array\",\n      \"description\": \"Angular routes for the component.\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"description\": {\n            \"type\": \"string\",\n            \"description\": \"Short description of the route.\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"Route location relative to '/<component>'.\"\n          },\n          \"templateUrl\": {\n            \"type\": \"string\",\n            \"description\": \"Absolute location of the HTML template.\"\n          },\n          \"css\": {\n            \"type\": \"string\",\n            \"description\": \"Absolute location of CSS to use with this route.\"\n          }\n        },\n        \"required\": [\"url\", \"templateUrl\"]\n      },\n      \"minItems\": 1\n    }\n  },\n  \"required\": [\"routes\"]\n}\n```\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/www/master/components/README.md?pixel)]()\n"
  },
  {
    "path": "master/components/dashboard/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/README.md",
    "content": "Dashboard Component for Kubernetes WebUI\n\n\n[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/www/master/components/dashboard/README.md?pixel)]()\n"
  },
  {
    "path": "master/components/dashboard/config/development.example.json",
    "content": "{}\n"
  },
  {
    "path": "master/components/dashboard/img/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/js/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/js/modules/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/cAdvisorController.js",
    "content": "\n\napp.controller('cAdvisorController', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  'lodash',\n  'cAdvisorService',\n  '$q',\n  '$interval',\n  function($scope, $routeParams, k8sApi, lodash, cAdvisorService, $q, $interval) {\n    $scope.k8sApi = k8sApi;\n\n    $scope.activeMinionDataById = {};\n    $scope.maxDataByById = {};\n\n    $scope.getData = function() {\n      $scope.loading = true;\n\n      k8sApi.getMinions().success(angular.bind(this, function(res) {\n\n        $scope.minions = res;\n\n        var promises = lodash.map(res.items, function(m) {\n            var readyCondition = m.status.conditions.filter(function ( obj ) {\n                return obj.type === 'Ready';\n            })[0];\n\n            return cAdvisorService.getDataForMinion(m.metadata.name, readyCondition && readyCondition.status === 'True')\n              .catch(function(errorData) {\n                // don't fail the whole promise chain just because one node failed\n                return null;\n              });\n        });\n        $q.all(promises).then(\n            function(dataArray) {\n              lodash.each(dataArray, function(data, i) {\n                if (!data) return; // ignore errornous nodes\n\n                var m = res.items[i];\n\n                var maxData = maxMemCpuInfo(m.metadata.name, data.memoryData, data.cpuData, data.filesystemData);\n\n                if(m.status.addresses)\n                  hostname = m.status.addresses[0].address;\n                else\n                  hostname = m.metadata.name;\n\n                cpu = m.status.capacity ? m.status.capacity.cpu : '-';\n                $scope.activeMinionDataById[m.metadata.name] =\n                    transformMemCpuInfo(data.memoryData, data.cpuData, data.filesystemData, maxData, hostname, cpu);\n              });\n\n            },\n            function() {\n              // console.log(\"Error: \" + errorData);\n              $scope.loading = false;\n            });\n\n        $scope.loading = false;\n      })).finally(function() {\n        $scope.loading = false;\n      });\n    };\n\n    // d3\n    function getColorForIndex(i, percentage) {\n      // var colors = ['red', 'blue', 'yellow', 'pink', 'purple', 'green', 'orange'];\n      // return colors[i];\n      var c = \"color-\" + (i + 1);\n      if (percentage && percentage >= 90)\n        c = c + ' color-critical';\n      else if (percentage && percentage >= 80)\n        c = c + ' color-warning';\n\n      return c;\n    }\n\n    function getMaxColorForIndex(i, percentage) {\n      // var colors = ['red', 'blue', 'yellow', 'pink', 'purple', 'green', 'orange'];\n      // return colors[i];\n      var c = \"color-max-\" + (i + 1);\n      if (percentage && percentage >= 90)\n        c = c + ' color-max-critical';\n      else if (percentage && percentage >= 80)\n        c = c + ' color-max-warning';\n\n      return c;\n    }\n\n    function maxMemCpuInfo(mId, mem, cpu, fsDataArray) {\n      if ($scope.maxDataByById[mId] === undefined) $scope.maxDataByById[mId] = {};\n\n      var currentMem = mem.current;\n      var currentCpu = cpu;\n\n      var items = [];\n\n      if ($scope.maxDataByById[mId]['cpu'] === undefined ||\n          $scope.maxDataByById[mId]['cpu'] < currentCpu.cpuPercentUsage) {\n        // console.log(\"New max cpu \" + mId, $scope.maxDataByById[mId].cpu, currentCpu.cpuPercentUsage);\n        $scope.maxDataByById[mId]['cpu'] = currentCpu.cpuPercentUsage;\n      }\n      items.push({\n        maxValue: $scope.maxDataByById[mId]['cpu'],\n        maxTickClassNames: getColorForIndex(0, $scope.maxDataByById[mId]['cpu']),\n        maxClassNames: getMaxColorForIndex(0, $scope.maxDataByById[mId]['cpu'])\n      });\n\n      var memPercentage = Math.floor((currentMem.memoryUsage * 100.0) / currentMem.memoryLimit);\n      if ($scope.maxDataByById[mId]['mem'] === undefined || $scope.maxDataByById[mId]['mem'] < memPercentage)\n        $scope.maxDataByById[mId]['mem'] = memPercentage;\n      items.push({\n        maxValue: $scope.maxDataByById[mId]['mem'],\n        maxTickClassNames: getColorForIndex(1, $scope.maxDataByById[mId]['mem']),\n        maxClassNames: getMaxColorForIndex(1, $scope.maxDataByById[mId]['mem'])\n      });\n\n      for (var i = 0; i < fsDataArray.length; i++) {\n        var f = fsDataArray[i];\n        var fid = 'FS #' + f.filesystemNumber;\n        if ($scope.maxDataByById[mId][fid] === undefined || $scope.maxDataByById[mId][fid] < f.totalUsage)\n          $scope.maxDataByById[mId][fid] = f.totalUsage;\n        items.push({\n          maxValue: $scope.maxDataByById[mId][fid],\n          maxTickClassNames: getColorForIndex(2 + i, $scope.maxDataByById[mId][fid]),\n          maxClassNames: getMaxColorForIndex(2 + i, $scope.maxDataByById[mId][fid])\n        });\n      }\n\n      // console.log(\"Max Data is now \" + mId, $scope.maxDataByById[mId]);\n      return items;\n    }\n\n    function transformMemCpuInfo(mem, cpu, fsDataArray, maxData, hostName, numCpus) {\n      var currentMem = mem.current;\n      var currentCpu = cpu;\n\n      var items = [];\n\n      items.push({\n        label: 'CPU',\n        stats: currentCpu.cpuPercentUsage + '% / ' + numCpus + ' CPU',\n        value: currentCpu.cpuPercentUsage,\n        classNames: getColorForIndex(0, currentCpu.cpuPercentUsage),\n        maxData: maxData[0],\n        hostName: hostName\n      });\n\n      var memPercentage = Math.floor((currentMem.memoryUsage * 100.0) / currentMem.memoryLimit);\n      items.push({\n        label: 'Memory',\n        stats: currentMem.memoryUsageDescription + ' / ' + currentMem.memoryLimitDescription,\n        value: memPercentage,\n        classNames: getColorForIndex(1, memPercentage),\n        maxData: maxData[1],\n        hostName: hostName\n      });\n\n      for (var i = 0; i < fsDataArray.length; i++) {\n        var f = fsDataArray[i];\n\n        items.push({\n          label: 'Filesystem #' + f.filesystemNumber,\n          stats: f.usageDescription + ' / ' + f.capacityDescription,\n          value: f.totalUsage,\n          classNames: getColorForIndex(2 + i, f.totalUsage),\n          maxData: maxData[2 + i],\n          hostName: hostName\n\n        });\n      }\n\n      var a = [];\n      var segments = {\n        segments: items\n      };\n      a.push(segments);\n      return a;\n    };\n\n    // end d3\n    var promise = $interval($scope.getData, 3000);\n\n    // Cancel interval on page changes\n    $scope.$on('$destroy', function() {\n      if (angular.isDefined(promise)) {\n        $interval.cancel(promise);\n        promise = undefined;\n      }\n    });\n\n    $scope.getData();\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/dashboard.js",
    "content": "/**=========================================================\n * Module: Dashboard\n * Visualizer for clusters\n =========================================================*/\n\napp.controller('DashboardCtrl', ['$scope', function($scope) {}]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/groupController.js",
    "content": "/**=========================================================\n * Module: Group\n * Visualizer for groups\n =========================================================*/\n\napp.controller('GroupCtrl', [\n  '$scope',\n  '$route',\n  '$interval',\n  '$routeParams',\n  'k8sApi',\n  '$rootScope',\n  '$location',\n  'lodash',\n  function($scope, $route, $interval, $routeParams, k8sApi, $rootScope, $location, _) {\n    'use strict';\n    $scope.doTheBack = function() { window.history.back(); };\n\n    $scope.capitalize = function(s) { return _.capitalize(s); };\n\n    $rootScope.doTheBack = $scope.doTheBack;\n\n    $scope.resetGroupLayout = function(group) { delete group.settings; };\n\n    $scope.handlePath = function(path) {\n      var parts = path.split(\"/\");\n      // split leaves an empty string at the beginning.\n      parts = parts.slice(1);\n\n      if (parts.length === 0) {\n        return;\n      }\n      this.handleGroups(parts.slice(1));\n    };\n\n    $scope.getState = function(obj) { return Object.keys(obj)[0]; };\n\n    $scope.clearSelector = function(grouping) { $location.path(\"/dashboard/groups/\" + grouping + \"/selector/\"); };\n\n    $scope.changeGroupBy = function() {\n      var grouping = $scope.selectedGroupBy;\n\n      var s = _.clone($location.search());\n      if ($scope.routeParams.grouping != grouping)\n        $location.path(\"/dashboard/groups/\" + grouping + \"/selector/\").search(s);\n    };\n\n    $scope.createBarrier = function(count, callback) {\n      var barrier = count;\n      var barrierFunction = angular.bind(this, function(data) {\n        // JavaScript is single threaded so this is safe.\n        barrier--;\n        if (barrier === 0) {\n          if (callback) {\n            callback();\n          }\n        }\n      });\n      return barrierFunction;\n    };\n\n    $scope.handleGroups = function(parts, selector) {\n      $scope.groupBy = parts;\n      $scope.loading = true;\n      $scope.selector = selector;\n      var args = [];\n      var type = \"\";\n      if (selector && selector.length > 0) {\n        $scope.selectorPieces = selector.split(\",\");\n        var labels = [];\n        var fields = [];\n        for (var i = 0; i < $scope.selectorPieces.length; i++) {\n          var piece = $scope.selectorPieces[i];\n          if (piece[0] == '$') {\n            fields.push(piece.slice(2));\n          } else {\n            if (piece.indexOf(\"type=\") === 0) {\n              var labelParts = piece.split(\"=\");\n              if (labelParts.length > 1) {\n                type = labelParts[1];\n              }\n            } else {\n              labels.push(piece);\n            }\n          }\n        }\n        if (labels.length > 0) {\n          args.push(\"labels=\" + encodeURI(labels.join(\",\")));\n        }\n        if (fields.length > 0) {\n          args.push(\"fields=\" + encodeURI(fields.join(\",\")));\n        }\n      }\n      var query = \"?\" + args.join(\"&\");\n      var list = [];\n      var count = type.length > 0 ? 1 : 3;\n      var barrier = $scope.createBarrier(count, function() {\n        $scope.groups = $scope.groupData(list, 0);\n        $scope.loading = false;\n        $scope.groupByOptions = buildGroupByOptions();\n        $scope.selectedGroupBy = $routeParams.grouping;\n      });\n\n      if (type === \"\" || type == \"pod\") {\n        k8sApi.getPods(query).success(function(data) {\n          $scope.addLabel(\"type\", \"pod\", data.items);\n          for (var i = 0; data.items && i < data.items.length; ++i) {\n            data.items[i].metadata.labels.host = data.items[i].spec.host;\n            list.push(data.items[i]);\n          }\n          barrier();\n        }).error($scope.handleError);\n      }\n      if (type === \"\" || type == \"service\") {\n        k8sApi.getServices(query).success(function(data) {\n          $scope.addLabel(\"type\", \"service\", data.items);\n          for (var i = 0; data.items && i < data.items.length; ++i) {\n            list.push(data.items[i]);\n          }\n          barrier();\n        }).error($scope.handleError);\n      }\n      if (type === \"\" || type == \"replicationController\") {\n        k8sApi.getReplicationControllers(query).success(angular.bind(this, function(data) {\n          $scope.addLabel(\"type\", \"replicationController\", data.items);\n          for (var i = 0; data.items && i < data.items.length; ++i) {\n            list.push(data.items[i]);\n          }\n          barrier();\n        })).error($scope.handleError);\n      }\n    };\n\n    $scope.addLabel = function(key, value, items) {\n      if (!items) {\n        return;\n      }\n      for (var i = 0; i < items.length; i++) {\n        if (!items[i].metadata.labels) {\n          items[i].metadata.labels = [];\n        }\n        items[i].metadata.labels[key] = value;\n      }\n    };\n\n    $scope.groupData = function(items, index) {\n      var result = {\n        \"items\": {},\n        \"kind\": \"grouping\"\n      };\n      for (var i = 0; i < items.length; i++) {\n        key = items[i].metadata.labels[$scope.groupBy[index]];\n        if (!key) {\n          key = \"\";\n        }\n        var list = result.items[key];\n        if (!list) {\n          list = [];\n          result.items[key] = list;\n        }\n        list.push(items[i]);\n      }\n\n      if (index + 1 < $scope.groupBy.length) {\n        for (var key in result.items) {\n          result.items[key] = $scope.groupData(result.items[key], index + 1);\n        }\n      }\n      return result;\n    };\n    $scope.getGroupColor = function(type) {\n      if (type === 'pod') {\n        return '#6193F0';\n      } else if (type === 'replicationController') {\n        return '#E008FE';\n      } else if (type === 'service') {\n        return '#7C43FF';\n      }\n    };\n\n    var groups = $routeParams.grouping;\n    if (!groups) {\n      groups = '';\n    }\n\n    $scope.routeParams = $routeParams;\n    $scope.route = $route;\n\n    $scope.handleGroups(groups.split('/'), $routeParams.selector);\n\n    $scope.handleError = function(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope_.loading = false;\n    };\n\n    function getDefaultGroupByOptions() { return [{name: 'Type', value: 'type'}, {name: 'Name', value: 'name'}]; }\n\n    function buildGroupByOptions() {\n      var g = $scope.groups;\n      var options = getDefaultGroupByOptions();\n      var newOptions = _.map(g.items, function(vals) { return _.map(vals, function(v) { return _.keys(v.metadata.labels); }); });\n      newOptions =\n          _.reject(_.uniq(_.flattenDeep(newOptions)), function(o) { return o == 'name' || o == 'type' || o == \"\"; });\n      newOptions = _.map(newOptions, function(o) {\n        return {\n          name: o,\n          value: o\n        };\n      });\n\n      options = options.concat(newOptions);\n      return options;\n    }\n\n    $scope.changeFilterBy = function(selector) {\n      var grouping = $scope.selectedGroupBy;\n\n      var s = _.clone($location.search());\n      if ($scope.routeParams.selector != selector)\n        $location.path(\"/dashboard/groups/\" + $scope.routeParams.grouping + \"/selector/\" + selector).search(s);\n    };\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/header.js",
    "content": "/**=========================================================\n * Module: Header\n * Visualizer for clusters\n =========================================================*/\n\nangular.module('kubernetesApp.components.dashboard', [])\n    .controller('HeaderCtrl', [\n      '$scope',\n      '$location',\n      function($scope, $location) {\n        'use strict';\n        $scope.$watch('Pages', function(newValue, oldValue) {\n          if (typeof newValue !== 'undefined') {\n            $location.path(newValue);\n          }\n        });\n\n        $scope.subPages = [\n          {category: 'dashboard', name: 'Explore', value: '/dashboard/groups/type/selector/'},\n          {category: 'dashboard', name: 'Pods', value: '/dashboard/pods'},\n          {category: 'dashboard', name: 'Nodes', value: '/dashboard/nodes'},\n          {category: 'dashboard', name: 'Replication Controllers', value: '/dashboard/replicationcontrollers'},\n          {category: 'dashboard', name: 'Services', value: '/dashboard/services'},\n          {category: 'dashboard', name: 'Events', value: '/dashboard/events'}\n        ];\n      }\n    ]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/listEventsController.js",
    "content": "/**=========================================================\n * Module: List Events\n * Visualizer list events\n =========================================================*/\n\napp.controller('ListEventsCtrl', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  '$location',\n  '$filter',\n  function($scope, $routeParams, k8sApi, $location, $filter) {\n    'use strict';\n    $scope.getData = getData;\n    $scope.loading = true;\n    $scope.k8sApi = k8sApi;\n    $scope.pods = null;\n    $scope.groupedPods = null;\n    $scope.serverView = false;\n\n    $scope.headers = [\n      {name: 'First Seen', field: 'firstSeen'},\n      {name: 'Last Seen', field: 'lastSeen'},\n      {name: 'Count', field: 'count'},\n      {name: 'Name', field: 'name'},\n      {name: 'Kind', field: 'kind'},\n      {name: 'SubObject', field: 'subObject'},\n      {name: 'Reason', field: 'reason'},\n      {name: 'Source', field: 'source'},\n      {name: 'Message', field: 'message'}\n    ];\n\n\n    $scope.sortable = ['firstSeen', 'lastSeen', 'count', 'name', 'kind', 'subObject', 'reason', 'source'];\n    $scope.count = 10;\n    function handleError(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope.loading = false;\n    }\n\n    $scope.content = [];\n\n    function getData() {\n      $scope.loading = true;\n      k8sApi.getEvents().success(function(data) {\n        $scope.loading = false;\n\n        var _fixComma = function(str) {\n          if (str.substring(0, 1) == ',') {\n            return str.substring(1);\n          } else {\n            return str;\n          }\n        };\n\n        data.items.forEach(function(event) {\n          var _sources = '';\n          if (event.source) {\n            _sources = event.source.component + ' ' + event.source.host;\n          }\n\n\n          $scope.content.push({\n            firstSeen: $filter('date')(event.firstTimestamp, 'medium'),\n            lastSeen: $filter('date')(event.lastTimestamp, 'medium'),\n            count: event.count,\n            name: event.involvedObject.name,\n            kind: event.involvedObject.kind,\n            subObject: event.involvedObject.fieldPath,\n            reason: event.reason,\n            source: _sources,\n            message: event.message\n          });\n\n\n\n        });\n\n      }).error($scope.handleError);\n    }\n\n    getData();\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/listMinionsController.js",
    "content": "/**=========================================================\n * Module: Minions\n * Visualizer for minions\n =========================================================*/\n\napp.controller('ListMinionsCtrl', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  '$location',\n  function($scope, $routeParams, k8sApi, $location) {\n    'use strict';\n    $scope.getData = getData;\n    $scope.loading = true;\n    $scope.k8sApi = k8sApi;\n    $scope.pods = null;\n    $scope.groupedPods = null;\n    $scope.serverView = false;\n\n    $scope.headers = [{name: 'Name', field: 'name'}, {name: 'Addresses', field: 'addresses'}, {name: 'Status', field: 'status'}];\n\n    $scope.custom = {\n      name: '',\n      status: 'grey',\n      ip: 'grey'\n    };\n    $scope.sortable = ['name', 'status', 'ip'];\n    $scope.thumbs = 'thumb';\n    $scope.count = 10;\n\n    $scope.go = function(d) { $location.path('/dashboard/nodes/' + d.name); };\n\n\n    function handleError(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope.loading = false;\n    }\n\n    $scope.content = [];\n\n    function getData() {\n      $scope.loading = true;\n      k8sApi.getMinions().success(function(data) {\n        $scope.loading = false;\n\n        var _fixComma = function(str) {\n          if (str.substring(0, 1) == ',') {\n            return str.substring(1);\n          } else {\n            return str;\n          }\n        };\n\n        data.items.forEach(function(minion) {\n          var _statusType = '';\n\n          if (minion.status.conditions) {\n            Object.keys(minion.status.conditions)\n                .forEach(function(key) {\n                  if (minion.status.conditions[key].status == 'True') {\n                    _statusType += minion.status.conditions[key].type;\n                  }\n                });\n          }\n\n\n          $scope.content.push({name: minion.metadata.name, addresses: _.map(minion.status.addresses, function(a) { return a.address }).join(', '), status: _statusType});\n        });\n\n      }).error($scope.handleError);\n    }\n\n    getData();\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/listPodsController.js",
    "content": "\n\napp.controller('ListPodsCtrl', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  'lodash',\n  '$location',\n  function($scope, $routeParams, k8sApi, lodash, $location) {\n    var _ = lodash;\n    $scope.getData = getData;\n    $scope.loading = true;\n    $scope.k8sApi = k8sApi;\n    $scope.pods = null;\n    $scope.groupedPods = null;\n    $scope.serverView = false;\n\n    $scope.headers = [\n      {name: 'Pod', field: 'pod'},\n      {name: 'IP', field: 'ip'},\n      {name: 'Status', field: 'status'},\n      {name: 'Containers', field: 'containers'},\n      {name: 'Images', field: 'images'},\n      {name: 'Namespace', field: 'namespace'},\n      {name: 'Host', field: 'host'},\n      {name: 'Labels', field: 'labels'}\n    ];\n\n    $scope.custom = {\n      pod: '',\n      ip: 'grey',\n      containers: 'grey',\n      images: 'grey',\n      host: 'grey',\n      labels: 'grey',\n      status: 'grey'\n    };\n    $scope.sortable = ['pod', 'ip', 'status'];\n    $scope.count = 10;\n\n    $scope.go = function(data) { $location.path('/dashboard/pods/' + data.namespace + '/' + data.pod); };\n\n    var orderedPodNames = [];\n\n    function handleError(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope.loading = false;\n    };\n\n    function getPodName(pod) { return _.has(pod.metadata.labels, 'name') ? pod.metadata.labels.name : pod.metadata.name; }\n\n    $scope.content = [];\n\n    function getData() {\n      $scope.loading = true;\n      k8sApi.getPods().success(angular.bind(this, function(data) {\n        $scope.loading = false;\n\n        var _fixComma = function(str) {\n          if (str.substring(0, 1) == ',') {\n            return str.substring(1);\n          } else {\n            return str;\n          }\n        };\n\n        data.items.forEach(function(pod) {\n          var _containers = '', _images = '', _labels = '', _uses = '';\n\n          if (pod.spec) {\n            Object.keys(pod.spec.containers)\n                .forEach(function(key) {\n                  _containers += ', ' + pod.spec.containers[key].name;\n                  _images += ', ' + pod.spec.containers[key].image;\n                });\n          }\n\n          if (pod.metadata.labels) {\n            Object.keys(pod.metadata.labels)\n                .forEach(function(key) {\n                  if (key == 'name') {\n                    _labels += ', ' + pod.metadata.labels[key];\n                  }\n                  if (key == 'uses') {\n                    _uses += ', ' + pod.metadata.labels[key];\n                  }\n                });\n            }\n\n          $scope.content.push({\n            pod: pod.metadata.name,\n            ip: pod.status.podIP,\n            containers: _fixComma(_containers),\n            images: _fixComma(_images),\n            host: pod.spec.host,\n            labels: _fixComma(_labels) + ':' + _fixComma(_uses),\n            status: pod.status.phase,\n            namespace: pod.metadata.namespace\n          });\n\n        });\n\n      })).error(angular.bind(this, handleError));\n    };\n\n    $scope.getPodRestarts = function(pod) {\n      var r = null;\n      var container = _.first(pod.spec.containers);\n      if (container) r = pod.status.containerStatuses[container.name].restartCount;\n      return r;\n    };\n\n    $scope.otherLabels = function(labels) { return _.omit(labels, 'name') };\n\n    $scope.podStatusClass = function(pod) {\n\n      var s = pod.status.phase.toLowerCase();\n\n      if (s == 'running' || s == 'succeeded')\n        return null;\n      else\n        return \"status-\" + s;\n    };\n\n    $scope.podIndexFromName = function(pod) {\n      var name = getPodName(pod);\n      return _.indexOf(orderedPodNames, name) + 1;\n    };\n\n    getData();\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/listReplicationControllersController.js",
    "content": "/**=========================================================\n * Module: Replication Controllers\n * Visualizer for replication controllers\n =========================================================*/\n\napp.controller('ListReplicationControllersCtrl', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  '$location',\n  function($scope, $routeParams, k8sApi, $location) {\n    'use strict';\n    $scope.getData = getData;\n    $scope.loading = true;\n    $scope.k8sApi = k8sApi;\n    $scope.pods = null;\n    $scope.groupedPods = null;\n    $scope.serverView = false;\n\n    $scope.headers = [\n      {name: 'Controller', field: 'controller'},\n      {name: 'Containers', field: 'containers'},\n      {name: 'Images', field: 'images'},\n      {name: 'Selector', field: 'selector'},\n      {name: 'Replicas', field: 'replicas'},\n      {name: 'Namespace', field: 'namespace'}\n    ];\n\n    $scope.custom = {\n      controller: '',\n      containers: 'grey',\n      images: 'grey',\n      selector: 'grey',\n      replicas: 'grey',\n      namespace: 'grey'\n    };\n    $scope.sortable = ['controller', 'containers', 'images', 'namespace'];\n    $scope.thumbs = 'thumb';\n    $scope.count = 10;\n\n    $scope.go = function(data) { $location.path('/dashboard/replicationcontrollers/' + data.namespace + '/' + data.controller); };\n\n    function handleError(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope.loading = false;\n    }\n\n    $scope.content = [];\n\n    function getData() {\n      $scope.loading = true;\n      k8sApi.getReplicationControllers().success(function(data) {\n        $scope.loading = false;\n\n        var _fixComma = function(str) {\n          if (str.substring(0, 1) == ',') {\n            return str.substring(1);\n          } else {\n            return str;\n          }\n        };\n\n        data.items.forEach(function(replicationController) {\n\n          var _name = '', _image = '';\n\n          if (replicationController.spec.template.spec.containers) {\n            Object.keys(replicationController.spec.template.spec.containers)\n                .forEach(function(key) {\n                  _name += replicationController.spec.template.spec.containers[key].name;\n                  _image += replicationController.spec.template.spec.containers[key].image;\n                });\n          }\n\n          var _selectors = '';\n\n          if (replicationController.spec.selector) {\n            _selectors = _.map(replicationController.spec.selector, function(v, k) { return k + '=' + v }).join(', ');\n          }\n\n          $scope.content.push({\n            controller: replicationController.metadata.name,\n            containers: _name,\n            images: _image,\n            selector: _selectors,\n            replicas: replicationController.status.replicas,\n            namespace: replicationController.metadata.namespace\n          });\n\n        });\n\n      }).error($scope.handleError);\n    }\n\n    getData();\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/listServicesController.js",
    "content": "/**=========================================================\n * Module: Services\n * Visualizer for services\n =========================================================*/\n\napp.controller('ListServicesCtrl', [\n  '$scope',\n  '$interval',\n  '$routeParams',\n  'k8sApi',\n  '$rootScope',\n  '$location',\n  function($scope, $interval, $routeParams, k8sApi, $rootScope, $location) {\n    'use strict';\n    $scope.doTheBack = function() { window.history.back(); };\n\n    $scope.headers = [\n      {name: 'Name', field: 'name'},\n      {name: 'Labels', field: 'labels'},\n      {name: 'Selector', field: 'selector'},\n      {name: 'IP', field: 'ip'},\n      {name: 'Namespace', field: 'namespace'}\n    ];\n\n    $scope.custom = {\n      name: '',\n      ip: 'grey',\n      selector: 'grey',\n      port: 'grey',\n      labels: 'grey',\n      namespace: 'grey'\n    };\n    $scope.sortable = ['name', 'ip', 'port', 'namespace'];\n    $scope.count = 10;\n\n    $scope.go = function(data) { $location.path('/dashboard/services/' + data.namespace + '/' + data.name); };\n\n    $scope.content = [];\n\n    $rootScope.doTheBack = $scope.doTheBack;\n\n    $scope.handleError = function(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope_.loading = false;\n    };\n\n    $scope.getData = function() {\n      $scope.loading = true;\n      k8sApi.getServices().success(angular.bind(this, function(data) {\n        $scope.services = data;\n        $scope.loading = false;\n\n        var _fixComma = function(str) {\n          if (str.substring(0, 1) == ',') {\n            return str.substring(1);\n          } else {\n            return str;\n          }\n        };\n\n        var addLabel = function(str, label) {\n          if (str) {\n            str = label + str;\n          }\n          return str;\n        };\n\n        if (data.items.constructor === Array) {\n          data.items.forEach(function(service) {\n\n            var _labels = '';\n\n            if (service.metadata.labels) {\n              _labels = _.map(service.metadata.labels, function(v, k) { return k + '=' + v }).join(', ');\n            }\n\n            var _selectors = '';\n\n            if (service.spec.selector) {\n              _selectors = _.map(service.spec.selector, function(v, k) { return k + '=' + v }).join(', ');\n            }\n\n            var _ports = '';\n\n            if (service.spec.ports) {\n              _ports = _.map(service.spec.ports, function(p) {\n                var n = '';\n                if(p.name)\n                  n = p.name + ': ';\n                n = n + p.port;\n                return n;\n               }).join(', ');\n            }\n\n            $scope.content.push({\n              name: service.metadata.name,\n              ip: service.spec.portalIP,\n              port: _ports,\n              selector: _selectors,\n              labels: _labels,\n              namespace: service.metadata.namespace\n            });\n          });\n        }\n      })).error($scope.handleError);\n    };\n\n    $scope.getData();\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/nodeController.js",
    "content": "/**=========================================================\n * Module: Nodes\n * Visualizer for nodes\n =========================================================*/\n\napp.controller('NodeCtrl', [\n  '$scope',\n  '$interval',\n  '$routeParams',\n  'k8sApi',\n  '$rootScope',\n  function($scope, $interval, $routeParams, k8sApi, $rootScope) {\n    'use strict';\n    $scope.doTheBack = function() { window.history.back(); };\n\n    $rootScope.doTheBack = $scope.doTheBack;\n\n    $scope.handleError = function(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope_.loading = false;\n    };\n\n    $scope.handleNode = function(nodeId) {\n      $scope.loading = true;\n      k8sApi.getNodes(nodeId).success(angular.bind(this, function(data) {\n        $scope.node = data;\n        $scope.loading = false;\n      })).error($scope.handleError);\n    };\n\n    $scope.handleNode($routeParams.nodeId);\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/podController.js",
    "content": "/**=========================================================\n * Module: Pods\n * Visualizer for pods\n =========================================================*/\n\napp.controller('PodCtrl', [\n  '$scope',\n  '$interval',\n  '$routeParams',\n  'k8sApi',\n  '$rootScope',\n  function($scope, $interval, $routeParams, k8sApi, $rootScope) {\n    'use strict';\n    $scope.doTheBack = function() { window.history.back(); };\n\n    $rootScope.doTheBack = $scope.doTheBack;\n\n    $scope.handleError = function(data, status, headers, config) {\n      console.log(\"Error (\" + status + \"): \" + data);\n      $scope_.loading = false;\n    };\n\n    $scope.handlePod = function(podId, namespaceId) {\n      $scope.loading = true;\n      k8sApi.getPods(podId, namespaceId).success(angular.bind(this, function(data) {\n        $scope.pod = data;\n        $scope.loading = false;\n      })).error($scope.handleError);\n    };\n\n    $scope.handlePod($routeParams.podId, $routeParams.namespaceId);\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/replicationController.js",
    "content": "/**=========================================================\n * Module: Replication\n * Visualizer for replication controllers\n =========================================================*/\n\tfunction ReplicationController() {\n\t}\n\n\tReplicationController.prototype.getData = function(dataid, namespaceId) {\n\t\tthis.scope.loading = true;\n\t\tthis.k8sApi.getReplicationControllers(dataid, namespaceId).success(angular.bind(this, function(data) {\n\t\t\tthis.scope.replicationController = data;\n\t\t\tthis.scope.loading = false;\n\t\t})).error(angular.bind(this, this.handleError));\n\t};\n\n\tReplicationController.prototype.handleError = function(data, status, headers, config) {\n\t\tconsole.log(\"error (\" + status + \"): \" + data);\n\t\tthis.scope.loading = false;\n\t};\n\n\tapp.controller('ReplicationControllerCtrl', [\n\t\t'$scope',\n\t\t'$routeParams',\n\t\t'k8sApi',\n\t\tfunction($scope, $routeParams, k8sApi) {\n\t\t\t$scope.controller = new ReplicationController();\n\t\t\t$scope.controller.k8sApi = k8sApi;\n\t\t\t$scope.controller.scope = $scope;\n\t\t\t$scope.controller.getData($routeParams.replicationControllerId, $routeParams.namespaceId);\n\n\t\t\t$scope.doTheBack = function() { window.history.back(); };\n\t\t\t$scope.getSelectorUrlFragment = function(sel){ return _.map(sel, function(v, k) { return k + '=' + v }).join(','); };\n\n\t\t}\n\t]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/controllers/serviceController.js",
    "content": "/**=========================================================\n * Module: Services\n * Visualizer for services\n =========================================================*/\n\nfunction ServiceController() {\n}\n\nServiceController.prototype.getData = function(dataId, namespaceId) {\n  this.scope.loading = true;\n\n  this.k8sApi.getServices(dataId, namespaceId).success(angular.bind(this, function(data) {\n    this.scope.service = data;\n    this.scope.loading = false;\n  })).error(angular.bind(this, this.handleError));\n};\n\nServiceController.prototype.handleError = function(data, status, headers, config) {\n  console.log(\"Error (\" + status + \"): \" + data);\n  this.scope.loading = false;\n};\n\napp.controller('ServiceCtrl', [\n  '$scope',\n  '$routeParams',\n  'k8sApi',\n  '$location',\n  function($scope, $routeParams, k8sApi, $location) {\n\n\n    $scope.controller = new ServiceController();\n    $scope.controller.k8sApi = k8sApi;\n    $scope.controller.scope = $scope;\n    $scope.controller.getData($routeParams.serviceId, $routeParams.namespaceId);\n\n    $scope.doTheBack = function() { window.history.back(); };\n    $scope.go = function(d) { $location.path('/dashboard/services/' + d.metadata.name); }\n    $scope.getSelectorUrlFragment = function(sel){ return _.map(sel, function(v, k) { return k + '=' + v }).join(','); };\n\n  }\n]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/directives/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/js/modules/directives/d3MinionBarGauge.js",
    "content": "(function() {\n  'use strict';\n\n  angular.module('kubernetesApp.components.dashboard')\n      .directive('d3MinionBarGauge', [\n        'd3DashboardService',\n        function(d3DashboardService) {\n\n          return {\n            restrict: 'E',\n            scope: {\n              data: '=',\n              thickness: '@',\n              graphWidth: '@',\n              graphHeight: '@'\n\n            },\n            link: function(scope, element, attrs) {\n\n              var draw = function(d3) {\n                var svg = d3.select(\"svg.chart\");\n                var legendSvg = d3.select(\"svg.legend\");\n                window.onresize = function() { return scope.$apply(); };\n\n                scope.$watch(function() { return angular.element(window)[0].innerWidth; },\n                             function() { return scope.render(scope.data); });\n\n                scope.$watch('data', function(newVals, oldVals) {\n                  return initOrUpdate(newVals, oldVals);\n\n                }, true);\n\n                function initOrUpdate(newVals, oldVals) {\n                  if (oldVals === null || oldVals === undefined) {\n                    return scope.render(newVals);\n                  } else {\n                    return update(oldVals, newVals);\n                  }\n                }\n\n                var textOffset = 10;\n                var el = null;\n                var radius = 100;\n                var oldData = [];\n\n                function init(options) {\n                  var clone = options.data;\n                  var preparedData = setData(clone);\n                  setup(preparedData, options.width, options.height);\n                }\n\n                function setup(data, w, h) {\n                  svg = d3.select(element[0]).append(\"svg\").attr(\"width\", \"100%\");\n\n                  legendSvg = d3.select(element[0]).append(\"svg\").attr(\"width\", \"100%\");\n\n                  var chart = svg.attr(\"class\", \"chart\")\n                                  .attr(\"width\", w)\n                                  .attr(\"height\", h - 25)\n                                  .append(\"svg:g\")\n                                  .attr(\"class\", \"concentricchart\")\n                                  .attr(\"transform\", \"translate(\" + ((w / 2)) + \",\" + h / 4 + \")\");\n\n                  var legend = legendSvg.attr(\"class\", \"legend\").attr(\"width\", w);\n\n                  radius = Math.min(w, h) / 2;\n\n                  var hostName = legendSvg.append(\"text\")\n                                     .attr(\"class\", \"hostName\")\n                                     .attr(\"transform\", \"translate(\" + ((w - 120) / 2) + \",\" + 15 + \")\");\n\n                  var label_legend_area = legendSvg.append(\"svg:g\")\n                                              .attr(\"class\", \"label_legend_area\")\n                                              .attr(\"transform\", \"translate(\" + ((w - 215) / 2) + \",\" + 35 + \")\");\n\n                  var legend_group = label_legend_area.append(\"svg:g\").attr(\"class\", \"legend_group\");\n\n                  var label_group = label_legend_area.append(\"svg:g\")\n                                        .attr(\"class\", \"label_group\")\n                                        .attr(\"transform\", \"translate(\" + 25 + \",\" + 11 + \")\");\n\n                  var stats_group = label_legend_area.append(\"svg:g\")\n                                        .attr(\"class\", \"stats_group\")\n                                        .attr(\"transform\", \"translate(\" + 115 + \",\" + 11 + \")\");\n\n                  var path_group = chart.append(\"svg:g\")\n                                       .attr(\"class\", \"path_group\")\n                                       .attr(\"transform\", \"translate(0,\" + (h / 4) + \")\");\n                  var value_group = chart.append(\"svg:g\")\n                                        .attr(\"class\", \"value_group\")\n                                        .attr(\"transform\", \"translate(\" + -(w * 0.205) + \",\" + -(h * 0.10) + \")\");\n                  generateArcs(chart, data);\n                }\n\n                function update(_oldData, _newData) {\n                  if (_newData === undefined || _newData === null) {\n                    return;\n                  }\n\n                  var clone = jQuery.extend(true, {}, _newData);\n                  var cloneOld = jQuery.extend(true, {}, _oldData);\n                  var preparedData = setData(clone);\n                  oldData = setData(cloneOld);\n                  animate(preparedData);\n                }\n\n                function animate(data) { generateArcs(null, data); }\n\n                function setData(data) {\n                  var diameter = 2 * Math.PI * radius;\n                  var localData = [];\n\n                  $.each(data[0].segments, function(ri, value) {\n\n                    function calcAngles(v) {\n                      var segmentValueSum = 200;\n                      if (v > segmentValueSum) {\n                        v = segmentValueSum;\n                      }\n\n                      var segmentValue = v;\n                      var fraction = segmentValue / segmentValueSum;\n                      var arcBatchLength = fraction * 4 * Math.PI;\n                      var arcPartition = arcBatchLength;\n                      var startAngle = Math.PI * 2;\n                      var endAngle = startAngle + arcPartition;\n\n                      return {\n                        startAngle: startAngle,\n                        endAngle: endAngle\n                      };\n                    }\n\n                    var valueData = calcAngles(value.value);\n                    data[0].segments[ri].startAngle = valueData.startAngle;\n                    data[0].segments[ri].endAngle = valueData.endAngle;\n\n                    var maxData = value.maxData;\n                    var maxTickData = calcAngles(maxData.maxValue + 0.2);\n                    data[0].segments[ri].maxTickStartAngle = maxTickData.startAngle;\n                    data[0].segments[ri].maxTickEndAngle = maxTickData.endAngle;\n\n                    var maxArcData = calcAngles(maxData.maxValue);\n                    data[0].segments[ri].maxArcStartAngle = maxArcData.startAngle;\n                    data[0].segments[ri].maxArcEndAngle = maxArcData.endAngle;\n\n                    data[0].segments[ri].index = ri;\n                  });\n                  localData.push(data[0].segments);\n                  return localData[0];\n                }\n\n                function generateArcs(_svg, data) {\n                  var chart = svg;\n                  var transitionTime = 750;\n                  $.each(data, function(index, value) {\n                    if (oldData[index] !== undefined) {\n                      data[index].previousEndAngle = oldData[index].endAngle;\n                    } else {\n                      data[index].previousEndAngle = 0;\n                    }\n                  });\n                  var thickness = parseInt(scope.thickness, 10);\n                  var ir = (parseInt(scope.graphWidth, 10) / 3);\n                  var path_group = svg.select('.path_group');\n                  var arc_group = path_group.selectAll(\".arc_group\").data(data);\n                  var arcEnter = arc_group.enter().append(\"g\").attr(\"class\", \"arc_group\");\n\n                  arcEnter.append(\"path\").attr(\"class\", \"bg-circle\").attr(\"d\", getBackgroundArc(thickness, ir));\n\n                  arcEnter.append(\"path\")\n                      .attr(\"class\", function(d, i) { return 'max_tick_arc ' + d.maxData.maxTickClassNames; });\n\n                  arcEnter.append(\"path\")\n                      .attr(\"class\", function(d, i) { return 'max_bg_arc ' + d.maxData.maxClassNames; });\n\n                  arcEnter.append(\"path\").attr(\"class\", function(d, i) { return 'value_arc ' + d.classNames; });\n\n                  var max_tick_arc = arc_group.select(\".max_tick_arc\");\n\n                  max_tick_arc.transition()\n                      .attr(\"class\", function(d, i) { return 'max_tick_arc ' + d.maxData.maxTickClassNames; })\n                      .attr(\"d\", function(d) {\n                        var arc = maxArc(thickness, ir);\n                        arc.startAngle(d.maxTickStartAngle);\n                        arc.endAngle(d.maxTickEndAngle);\n                        return arc(d);\n                      });\n\n                  var max_bg_arc = arc_group.select(\".max_bg_arc\");\n\n                  max_bg_arc.transition()\n                      .attr(\"class\", function(d, i) { return 'max_bg_arc ' + d.maxData.maxClassNames; })\n                      .attr(\"d\", function(d) {\n                        var arc = maxArc(thickness, ir);\n                        arc.startAngle(d.maxArcStartAngle);\n                        arc.endAngle(d.maxArcEndAngle);\n                        return arc(d);\n                      });\n\n                  var value_arc = arc_group.select(\".value_arc\");\n\n                  value_arc.transition().ease(\"exp\").attr(\"class\", function(d, i) {\n                    return 'value_arc ' + d.classNames;\n                  }).duration(transitionTime).attrTween(\"d\", function(d) { return arcTween(d, thickness, ir); });\n\n                  arc_group.exit()\n                      .select(\".value_arc\")\n                      .transition()\n                      .ease(\"exp\")\n                      .duration(transitionTime)\n                      .attrTween(\"d\", function(d) { return arcTween(d, thickness, ir); })\n                      .remove();\n\n                  drawLabels(chart, data, ir, thickness);\n                  buildLegend(chart, data);\n                }\n\n                function arcTween(b, thickness, ir) {\n                  var prev = JSON.parse(JSON.stringify(b));\n                  prev.endAngle = b.previousEndAngle;\n                  var i = d3.interpolate(prev, b);\n                  return function(t) { return getArc(thickness, ir)(i(t)); };\n                }\n\n                function maxArc(thickness, ir) {\n                  var arc = d3.svg.arc().innerRadius(function(d) {\n                    return getRadiusRing(ir, d.index);\n                  }).outerRadius(function(d) { return getRadiusRing(ir + thickness, d.index); });\n                  return arc;\n                }\n\n                function drawLabels(chart, data, ir, thickness) {\n                  svg.select('.value_group').selectAll(\"*\").remove();\n                  var counts = data.length;\n                  var value_group = chart.select('.value_group');\n                  var valueLabels = value_group.selectAll(\"text.value\").data(data);\n                  valueLabels.enter()\n                      .append(\"svg:text\")\n                      .attr(\"class\", \"value\")\n                      .attr(\"dx\", function(d, i) { return 68; })\n                      .attr(\"dy\", function(d, i) { return (thickness + 3) * i; })\n                      .attr(\"text-anchor\", function(d) { return \"start\"; })\n                      .text(function(d) { return d.value; });\n                  valueLabels.transition().duration(300).attrTween(\n                      \"d\", function(d) { return arcTween(d, thickness, ir); });\n                  valueLabels.exit().remove();\n                }\n\n                function buildLegend(chart, data) {\n                  var svg = legendSvg;\n                  svg.select('.label_group').selectAll(\"*\").remove();\n                  svg.select('.legend_group').selectAll(\"*\").remove();\n                  svg.select('.stats_group').selectAll(\"*\").remove();\n\n                  var host_name = svg.select('.hostName');\n                  var label_group = svg.select('.label_group');\n                  var stats_group = svg.select('.stats_group');\n\n                  host_name.text(data[0].hostName);\n\n                  host_name = svg.selectAll(\"text.hostName\").data(data);\n\n                  host_name.attr(\"text-anchor\", function(d) { return \"start\"; })\n                      .text(function(d) { return d.hostName; });\n                  host_name.exit().remove();\n\n                  var labels = label_group.selectAll(\"text.labels\").data(data);\n                  labels.enter()\n                      .append(\"svg:text\")\n                      .attr(\"class\", \"labels\")\n                      .attr(\"dy\", function(d, i) { return 19 * i; })\n                      .attr(\"text-anchor\", function(d) { return \"start\"; })\n                      .text(function(d) { return d.label; });\n                  labels.exit().remove();\n\n                  var stats = stats_group.selectAll(\"text.stats\").data(data);\n                  stats.enter()\n                      .append(\"svg:text\")\n                      .attr(\"class\", \"stats\")\n                      .attr(\"dy\", function(d, i) { return 19 * i; })\n                      .attr(\"text-anchor\", function(d) { return \"start\"; })\n                      .text(function(d) { return d.stats; });\n                  stats.exit().remove();\n\n                  var legend_group = svg.select('.legend_group');\n                  var legend = legend_group.selectAll(\"rect\").data(data);\n                  legend.enter()\n                      .append(\"svg:rect\")\n                      .attr(\"x\", 2)\n                      .attr(\"y\", function(d, i) { return 19 * i; })\n                      .attr(\"width\", 13)\n                      .attr(\"height\", 13)\n                      .attr(\"class\", function(d, i) { return \"rect \" + d.classNames; });\n\n                  legend.exit().remove();\n                }\n\n                function getRadiusRing(ir, i) { return ir - (i * 20); }\n\n                function getArc(thickness, ir) {\n                  var arc = d3.svg.arc()\n                                .innerRadius(function(d) { return getRadiusRing(ir, d.index); })\n                                .outerRadius(function(d) { return getRadiusRing(ir + thickness, d.index); })\n                                .startAngle(function(d, i) { return d.startAngle; })\n                                .endAngle(function(d, i) { return d.endAngle; });\n                  return arc;\n                }\n\n                function getBackgroundArc(thickness, ir) {\n                  var arc = d3.svg.arc()\n                                .innerRadius(function(d) { return getRadiusRing(ir, d.index); })\n                                .outerRadius(function(d) { return getRadiusRing(ir + thickness, d.index); })\n                                .startAngle(0)\n                                .endAngle(function() { return 2 * Math.PI; });\n                  return arc;\n                }\n\n                scope.render = function(data) {\n                  if (data === undefined || data === null) {\n                    return;\n                  }\n\n                  d3.select(element[0]).select(\"svg.chart\").remove();\n                  d3.select(element[0]).select(\"svg.legend\").remove();\n\n                  var graph = $(element[0]);\n                  var w = scope.graphWidth;\n                  var h = scope.graphHeight;\n\n                  var options = {\n                    data: data,\n                    width: w,\n                    height: h\n                  };\n\n                  init(options);\n                };\n              };\n              d3DashboardService.d3().then(draw);\n            }\n          };\n        }\n      ]);\n}());\n"
  },
  {
    "path": "master/components/dashboard/js/modules/directives/dashboard.js",
    "content": "(function() {\n  'use strict';\n\n  angular.module('kubernetesApp.components.dashboard')\n      .directive(\n           'dashboardHeader',\n           function() {\n             'use strict';\n             return {\n               restrict: 'A',\n               replace: true,\n               scope: {user: '='},\n               templateUrl: \"components/dashboard/pages/header.html\",\n               controller: [\n                 '$scope',\n                 '$filter',\n                 '$location',\n                 'menu',\n                 '$rootScope',\n                 function($scope, $filter, $location, menu, $rootScope) {\n                  $scope.menu = menu;\n                   $scope.$watch('page', function(newValue, oldValue) {\n                     if (typeof newValue !== 'undefined') {\n                       $location.path(newValue);\n                     }\n                   });\n\n                   $scope.subpages = [\n                     {\n                       category: 'dashboard',\n                       name: 'Explore',\n                       value: '/dashboard/groups/type/selector/',\n                       id: 'groupsView'\n                     },\n                     {category: 'dashboard', name: 'Pods', value: '/dashboard/pods', id: 'podsView'},\n                     {category: 'dashboard', name: 'Nodes', value: '/dashboard/nodes', id: 'minionsView'},\n                     {\n                       category: 'dashboard',\n                       name: 'Replication Controllers',\n                       value: '/dashboard/replicationcontrollers',\n                       id: 'rcView'\n                     },\n                     {category: 'dashboard', name: 'Services', value: '/dashboard/services', id: 'servicesView'},\n                     {category: 'dashboard', name: 'Events', value: '/dashboard/events', id: 'eventsView'},\n                   ];\n                 }\n               ]\n             };\n           })\n      .directive('dashboardFooter',\n                 function() {\n                   'use strict';\n                   return {\n                     restrict: 'A',\n                     replace: true,\n                     templateUrl: \"components/dashboard/pages/footer.html\",\n                     controller: ['$scope', '$filter', function($scope, $filter) {}]\n                   };\n                 })\n      .directive('mdTable', function() {\n        'use strict';\n        return {\n          restrict: 'E',\n          scope: {\n            headers: '=',\n            content: '=',\n            sortable: '=',\n            filters: '=',\n            customClass: '=customClass',\n            thumbs: '=',\n            count: '=',\n            doSelect: '&onSelect'\n          },\n          transclude: true,\n          controller: function($scope, $filter, $window, $location) {\n            var orderBy = $filter('orderBy');\n            $scope.currentPage = 0;\n            $scope.nbOfPages = function() { return Math.ceil($scope.content.length / $scope.count); };\n            $scope.handleSort = function(field) {\n              if ($scope.sortable.indexOf(field) > -1) {\n                return true;\n              } else {\n                return false;\n              }\n            };\n            $scope.order = function(predicate, reverse) {\n              $scope.content = orderBy($scope.content, predicate, reverse);\n              $scope.predicate = predicate;\n            };\n            $scope.order($scope.sortable[0], false);\n            $scope.getNumber = function(num) { return new Array(num); };\n            $scope.goToPage = function(page) { $scope.currentPage = page; };\n            $scope.showMore = function() { return angular.isDefined($scope.moreClick);}\n          },\n          templateUrl: 'views/partials/md-table.tmpl.html'\n        };\n      });\n\n}());\n"
  },
  {
    "path": "master/components/dashboard/js/modules/services/d3.js",
    "content": "angular.module('kubernetesApp.components.dashboard')\n    .factory('d3DashboardService', [\n      '$document',\n      '$q',\n      '$rootScope',\n      function($document, $q, $rootScope) {\n        var d = $q.defer();\n        function onScriptLoad() {\n          // Load client in the browser\n          $rootScope.$apply(function() { d.resolve(window.d3); });\n        }\n        // Create a script tag with d3 as the source\n        // and call our onScriptLoad callback when it\n        // has been loaded\n        var scriptTag = $document[0].createElement('script');\n        scriptTag.type = 'text/javascript';\n        scriptTag.async = true;\n        scriptTag.src = 'vendor/d3/d3.min.js';\n        scriptTag.onreadystatechange = function() {\n          if (this.readyState == 'complete') onScriptLoad();\n        };\n        scriptTag.onload = onScriptLoad;\n\n        var s = $document[0].getElementsByTagName('body')[0];\n        s.appendChild(scriptTag);\n\n        return {\n          d3: function() { return d.promise; }\n        };\n      }\n    ]);\n"
  },
  {
    "path": "master/components/dashboard/js/modules/services/podsMock.js",
    "content": "(function() {\n  'use strict';\n\n  angular.module('pods', []).service('podService', ['$q', PodDataService]);\n\n  /**\n   * Pod DataService\n   * Mock async data service.\n   *\n   * @returns {{loadAll: Function}}\n   * @constructor\n   */\n  function PodDataService($q) {\n    var pods = {\n    \"kind\": \"Pod\",\n    \"apiVersion\": \"v1\",\n    \"metadata\": {\n        \"name\": \"redis-master-c0r1n\",\n        \"generateName\": \"redis-master-\",\n        \"namespace\": \"default\",\n        \"selfLink\": \"/api/v1/namespaces/default/pods/redis-master-c0r1n\",\n        \"uid\": \"f12ddfaf-ff77-11e4-8f2d-080027213276\",\n        \"resourceVersion\": \"39\",\n        \"creationTimestamp\": \"2015-05-21T05:12:14Z\",\n        \"labels\": {\n            \"name\": \"redis-master\"\n        },\n        \"annotations\": {\n            \"kubernetes.io/created-by\": \"{\\\"kind\\\":\\\"SerializedReference\\\",\\\"apiVersion\\\":\\\"v1\\\",\\\"reference\\\":{\\\"kind\\\":\\\"ReplicationController\\\",\\\"namespace\\\":\\\"default\\\",\\\"name\\\":\\\"redis-master\\\",\\\"uid\\\":\\\"f12969e0-ff77-11e4-8f2d-080027213276\\\",\\\"apiVersion\\\":\\\"v1\\\",\\\"resourceVersion\\\":\\\"26\\\"}}\"\n        }\n    },\n    \"spec\": {\n        \"volumes\": [\n            {\n                \"name\": \"default-token-zb4rq\",\n                \"secret\": {\n                    \"secretName\": \"default-token-zb4rq\"\n                }\n            }\n        ],\n        \"containers\": [\n            {\n                \"name\": \"master\",\n                \"image\": \"redis\",\n                \"ports\": [\n                    {\n                        \"containerPort\": 6379,\n                        \"protocol\": \"TCP\"\n                    }\n                ],\n                \"resources\": {},\n                \"volumeMounts\": [\n                    {\n                        \"name\": \"default-token-zb4rq\",\n                        \"readOnly\": true,\n                        \"mountPath\": \"/var/run/secrets/kubernetes.io/serviceaccount\"\n                    }\n                ],\n                \"terminationMessagePath\": \"/dev/termination-log\",\n                \"imagePullPolicy\": \"IfNotPresent\",\n                \"capabilities\": {},\n                \"securityContext\": {\n                    \"capabilities\": {},\n                    \"privileged\": false\n                }\n            }\n        ],\n        \"restartPolicy\": \"Always\",\n        \"dnsPolicy\": \"ClusterFirst\",\n        \"serviceAccount\": \"default\",\n        \"host\": \"127.0.0.1\"\n    },\n    \"status\": {\n        \"phase\": \"Running\",\n        \"Condition\": [\n            {\n                \"type\": \"Ready\",\n                \"status\": \"True\"\n            }\n        ],\n        \"hostIP\": \"127.0.0.1\",\n        \"podIP\": \"172.17.0.1\",\n        \"startTime\": \"2015-05-21T05:12:14Z\",\n        \"containerStatuses\": [\n            {\n                \"name\": \"master\",\n                \"state\": {\n                    \"running\": {\n                        \"startedAt\": \"2015-05-21T05:12:14Z\"\n                    }\n                },\n                \"lastState\": {},\n                \"ready\": true,\n                \"restartCount\": 0,\n                \"image\": \"redis\",\n                \"imageID\": \"docker://95af5842ddb9b03f7c6ec7601e65924cec516fcedd7e590ae31660057085cf67\",\n                \"containerID\": \"docker://ae2a1e0a91a8b1015191a0b8e2ce8c55a86fb1a9a2b1e8e3b29430c9d93c8c09\"\n            }\n        ]\n    }\n};\n\n    // Uses promises\n    return {\n      loadAll: function() {\n        // Simulate async call\n        return $q.when(pods);\n      }\n    };\n  }\n\n})();\n"
  },
  {
    "path": "master/components/dashboard/js/modules/services/replicationControllersMock.js",
    "content": "(function() {\n  'use strict';\n\n  angular.module('replicationControllers', [])\n      .service('replicationControllerService', ['$q', ReplicationControllerDataService]);\n\n  /**\n   * Replication Controller DataService\n   * Mock async data service.\n   *\n   * @returns {{loadAll: Function}}\n   * @constructor\n   */\n  function ReplicationControllerDataService($q) {\n    var replicationControllers = {\n    \"kind\": \"List\",\n    \"apiVersion\": \"v1\",\n    \"metadata\": {},\n    \"items\": [\n        {\n            \"kind\": \"ReplicationController\",\n            \"apiVersion\": \"v1\",\n            \"metadata\": {\n                \"name\": \"redis-master\",\n                \"namespace\": \"default\",\n                \"selfLink\": \"/api/v1/namespaces/default/replicationcontrollers/redis-master\",\n                \"uid\": \"f12969e0-ff77-11e4-8f2d-080027213276\",\n                \"resourceVersion\": \"28\",\n                \"creationTimestamp\": \"2015-05-21T05:12:14Z\",\n                \"labels\": {\n                    \"name\": \"redis-master\"\n                }\n            },\n            \"spec\": {\n                \"replicas\": 1,\n                \"selector\": {\n                    \"name\": \"redis-master\"\n                },\n                \"template\": {\n                    \"metadata\": {\n                        \"creationTimestamp\": null,\n                        \"labels\": {\n                            \"name\": \"redis-master\"\n                        }\n                    },\n                    \"spec\": {\n                        \"containers\": [\n                            {\n                                \"name\": \"master\",\n                                \"image\": \"redis\",\n                                \"ports\": [\n                                    {\n                                        \"containerPort\": 6379,\n                                        \"protocol\": \"TCP\"\n                                    }\n                                ],\n                                \"resources\": {},\n                                \"terminationMessagePath\": \"/dev/termination-log\",\n                                \"imagePullPolicy\": \"IfNotPresent\",\n                                \"capabilities\": {},\n                                \"securityContext\": {\n                                    \"capabilities\": {},\n                                    \"privileged\": false\n                                }\n                            }\n                        ],\n                        \"restartPolicy\": \"Always\",\n                        \"dnsPolicy\": \"ClusterFirst\",\n                        \"serviceAccount\": \"\"\n                    }\n                }\n            },\n            \"status\": {\n                \"replicas\": 1\n            }\n        }\n    ]};\n\n    // Uses promises\n    return {\n      loadAll: function() {\n        // Simulate async call\n        return $q.when(replicationControllers);\n      }\n    };\n  }\n\n})();\n"
  },
  {
    "path": "master/components/dashboard/js/modules/services/servicesMock.js",
    "content": "(function() {\n  'use strict';\n\n  angular.module('services', []).service('serviceService', ['$q', ServiceDataService]);\n\n  /**\n   * Service DataService\n   * Mock async data service.\n   *\n   * @returns {{loadAll: Function}}\n   * @constructor\n   */\n  function ServiceDataService($q) {\n    var services = {\n    \"kind\": \"List\",\n    \"apiVersion\": \"v1\",\n    \"metadata\": {},\n    \"items\": [\n        {\n            \"kind\": \"Service\",\n            \"apiVersion\": \"v1\",\n            \"metadata\": {\n                \"name\": \"kubernetes\",\n                \"namespace\": \"default\",\n                \"selfLink\": \"/api/v1/namespaces/default/services/kubernetes\",\n                \"resourceVersion\": \"6\",\n                \"creationTimestamp\": null,\n                \"labels\": {\n                    \"component\": \"apiserver\",\n                    \"provider\": \"kubernetes\"\n                }\n            },\n            \"spec\": {\n                \"ports\": [\n                    {\n                        \"protocol\": \"TCP\",\n                        \"port\": 443,\n                        \"targetPort\": 443\n                    }\n                ],\n                \"portalIP\": \"10.0.0.2\",\n                \"sessionAffinity\": \"None\"\n            },\n            \"status\": {}\n        },\n        {\n            \"kind\": \"Service\",\n            \"apiVersion\": \"v1\",\n            \"metadata\": {\n                \"name\": \"kubernetes-ro\",\n                \"namespace\": \"default\",\n                \"selfLink\": \"/api/v1/namespaces/default/services/kubernetes-ro\",\n                \"resourceVersion\": \"8\",\n                \"creationTimestamp\": null,\n                \"labels\": {\n                    \"component\": \"apiserver\",\n                    \"provider\": \"kubernetes\"\n                }\n            },\n            \"spec\": {\n                \"ports\": [\n                    {\n                        \"protocol\": \"TCP\",\n                        \"port\": 80,\n                        \"targetPort\": 80\n                    }\n                ],\n                \"portalIP\": \"10.0.0.1\",\n                \"sessionAffinity\": \"None\"\n            },\n            \"status\": {}\n        },\n        {\n            \"kind\": \"Service\",\n            \"apiVersion\": \"v1\",\n            \"metadata\": {\n                \"name\": \"redis-master\",\n                \"namespace\": \"default\",\n                \"selfLink\": \"/api/v1/namespaces/default/services/redis-master\",\n                \"uid\": \"a6fde246-ff78-11e4-8f2d-080027213276\",\n                \"resourceVersion\": \"72\",\n                \"creationTimestamp\": \"2015-05-21T05:17:19Z\",\n                \"labels\": {\n                    \"name\": \"redis-master\"\n                }\n            },\n            \"spec\": {\n                \"ports\": [\n                    {\n                        \"protocol\": \"TCP\",\n                        \"port\": 6379,\n                        \"targetPort\": 6379\n                    }\n                ],\n                \"selector\": {\n                    \"name\": \"redis-master\"\n                },\n                \"portalIP\": \"10.0.0.124\",\n                \"sessionAffinity\": \"None\"\n            },\n            \"status\": {}\n        }\n    ]\n};\n\n    // Uses promises\n    return {\n      loadAll: function() {\n        // Simulate async call\n        return $q.when(services);\n      }\n    };\n  }\n\n})();\n"
  },
  {
    "path": "master/components/dashboard/less/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/less/dashboard/colors.less",
    "content": "\n@color-codes:\n  \"#2962FF\",\n  \"#AA00FF\",\n  \"#00C853\",\n  \"#304FFE\",\n  \"#0091EA\",\n  \"#FF6D00\",\n  \"#00BFA5\",\n  \"#C51162\",\n  \"#64DD17\",\n  \"#6200EA\",\n  \"#FFD600\",\n  \"#00B8D4\",\n  \"#FFAB00\",\n  \"#DD2C00\",\n  \"#2979FF\",\n  \"#D500F9\",\n  \"#00E676\",\n  \"#3D5AFE\",\n  \"#00B0FF\",\n  \"#FF9100\",\n  \"#1DE9B6\",\n  \"#F50057\",\n  \"#76FF03\",\n  \"#651FFF\",\n  \"#FFEA00\",\n  \"#00E5FF\",\n  \"#FFC400\",\n  \"#FF3D00\",\n  \"#448AFF\",\n  \"#E040FB\",\n  \"#69F0AE\",\n  \"#536DFE\",\n  \"#40C4FF\",\n  \"#FFAB40\",\n  \"#64FFDA\",\n  \"#FF4081\",\n  \"#B2FF59\",\n  \"#7C4DFF\",\n  \"#FFFF00\",\n  \"#18FFFF\",\n  \"#FFD740\",\n  \"#FF6E40\";\n\n.dark-overlay {\n  background-color: #292935;\n  opacity: 0.5;\n}\n\n.light-overlay {\n  background-color: #FFFFFF;\n  opacity: 0.2;\n}\n\n\n// #D50000, //red-deep\n// #FF1744, //red-med\n// #FF5252, //red-light\n\n@warningColor: #FF9800;\n@criticalColor: #F44336;\n\n@freeColor: #2E2E3B;\n@errorColor: #FF1744;\n@waitingColor: #DAD462;\n\n.getColorIndex(@i){\n  @index: @i; //mod(@i - 1, 3) * 7 + round((@i - 1) / 3 - .3);\n}\n.creatcolorclasses(@i:1) when(@i <= length(@color-codes)) {\n  @colorCodeString: extract(@color-codes, @i);\n  @colorCode: color(@colorCodeString);\n\n  .getColorIndex(@i);\n  .color-@{index} {\n    background-color: @colorCode;\n    fill: @colorCode;\n    stroke: @colorCode;\n  }\n\n\n  .color-max-@{index} {\n    background-color: lighten(@colorCode, 35%);\n    border-color: lighten(@colorCode, 35%);\n    fill: lighten(@colorCode, 35%);\n  }\n\n  md-grid-list.list-color-@{i} md-grid-tile.colored {\n    background-color: @colorCode;\n  }\n  .creatcolorclasses((@i + 1));\n}\n.creatcolorclasses();\n\n.color-warning {\n  background-color: @warningColor !important;\n  border-color: @warningColor !important;\n  fill: @warningColor !important;\n  stroke: @warningColor !important;\n}\n\n.color-critical {\n  background-color: @criticalColor !important;\n  border-color: @criticalColor !important;\n  fill: @criticalColor !important;\n  stroke: @criticalColor !important;\n}\n\n.status-waiting {\n  background-color: @freeColor !important;\n  border-color: @waitingColor !important;\n  border-width: 2px !important;\n  border-style: solid !important;\n}\n\n.status-succeeded {}\n\n.status-terminated, .status-unknown {\n  background-color: @errorColor !important;\n  border-color: darken(@errorColor, 10%) !important;\n  border-width: 1px !important;\n  border-style: solid !important;\n}\n"
  },
  {
    "path": "master/components/dashboard/less/dashboard/groups.less",
    "content": ".groups {\n  font-size: 13px;\n\n  .header {\n    line-height: 21px;\n    a {\n      padding-left: 5px;\n      padding-right: 5px;\n    }\n\n    .selector-area {\n\n      .filter-area {\n        // font-size: 15px;\n        // padding-left: 20px;\n      }\n\n      .filter-label {\n\n      }\n\n      .filter-text {\n        font-size: 13px;\n        margin-left: 10px;\n      }\n\n      .cancel-button {\n        width: 18px;\n        height: 18px;\n        padding: 0;\n\n        &:focus, &:hover {\n          background-color: none !important;\n        }\n      }\n\n      .cancel-icon {\n        width: 15px;\n        height: 15px;\n        fill: #777777;\n      }\n\n    }\n  }\n\n  .group-heading {\n\n    .label {\n      // font-size: 18px;\n    }\n  }\n\n  .select-group-by {\n    min-width: 110px;\n    margin-left: 10px;\n    margin-right: 40px;\n\n    .md-select-label {\n      padding-top: 6px;\n      font-size: 13px;\n    }\n  }\n\n  .group-item {\n    padding-top: 20px;\n\n    .filter-button {\n      height: 18px;\n      width: 18px;\n\n      .filter-icon {\n        width: 18px;\n        height: 18px;\n        // fill: #777777;\n      }\n\n    }\n  }\n\n  .icon-area {\n    // padding-right: 10px;\n    min-width: 34px;\n    .group-icon {\n      border-radius: 21px;\n      width: 21px;\n      height: 21px;\n    }\n  }\n\n  .group-main-area {\n    // padding-bottom: 10px;\n\n    .subtype {\n      line-height: 21px;\n    }\n  }\n\n  md-divider {\n    margin-top: 40px;\n    margin-bottom: 30px;\n  }\n\n  .group-name {\n    padding-top: 10px;\n  }\n  .selectFilter {\n    padding-top: 10px;\n    margin-right: 30px;\n\n    .md-select-label {\n      border-bottom: none !important;\n      width: 17px;\n      min-width: 17px;\n      padding-right: 0;\n    }\n  }\n\n  md-select-menu {\n    min-height: 40px;\n    max-height: 40px;\n  }\n\n\n  .group-link-area {\n    padding-left: 15px;\n    padding-bottom: 15px;\n\n    button {\n      line-height: 12px;\n      // line-height: 12px;\n    }\n  }\n\n  .group-type-circle {\n    width: 21px;\n    height: 21px;\n  }\n  .group-type-circle span {\n\n  }\n  // .group-type-area .pod-color\n  // {\n    //   background-color: rgb(57,73,171);\n  // }\n  // .group-type-area .replicationController-color\n  // {\n    //   background-color: rgb(57,73,171);\n  // }\n\n  // .group-type-area .service-color\n  // {\n    //   background-color: rgb(57,73,171);\n  // }\n\n  md-select {\n    margin-top: 0px;\n  }\n}\n"
  },
  {
    "path": "master/components/dashboard/less/dashboard/pods.less",
    "content": ".clear-bg {\n  background-color: transparent;\n}\n.list-pods {\n  .pod-group {\n    margin: 25px;\n\n    md-grid-list {\n      margin-top: 50px;\n      color: white;\n\n      // Header and footer\n      figcaption {\n        width:100%;\n      }\n\n      md-grid-tile-header {\n        padding-left: 10px;\n        .labels {\n          width: 100%;\n        }\n      }\n\n      md-grid-tile {\n        transition: all 700ms ease-in 50ms;\n      }\n\n\n      // inner body\n      .inner-box {\n        padding-left: 10px;\n        padding-right: 10px;\n      }\n\n      // Footer\n      md-grid-tile-footer {\n\n        background: rgba(0, 0, 0, 0.50);\n        // height: 36px;\n\n        .pod-title\n        {\n          margin-left: 10px;\n        }\n\n        .pod-host {\n          text-align: right;\n          padding-right: 15px;\n        }\n\n        a {\n          color: white;\n        }\n      }\n\n      // Restart button\n      .restarts {\n        width: 100%;\n        text-align: right;\n        padding-right: 10px;\n\n        .restart-button {\n          &, &:not([disabled]):hover, &:not([disabled]):focus, &:hover, &:focus {\n            background-color: @errorColor;\n            width:30px;\n            height:30px;\n          }\n        }\n\n      }\n    }\n  }\n\n  .gray {\n    background: #f5f5f5;\n  }\n\n  @import (multiple) \"colors\";\n}\n"
  },
  {
    "path": "master/components/dashboard/less/dashboard/servers.less",
    "content": ".server-overview {\n  @import (multiple) \"colors\";\n\n  .color-1 {\n    background-color: #512DA8;\n    border-color: #512DA8;\n    fill: #512DA8;\n    stroke: #512DA8;\n  }\n\n  .color-2 {\n    background-color: #9C27B0;\n    border-color: #9C27B0;\n    fill: #9C27B0;\n    stroke: #9C27B0;\n  }\n\n  .color-3 {\n    background-color: #00BCD4;\n    border-color: #00BCD4;\n    fill: #00BCD4;\n    stroke: #00BCD4;\n  }\n\n  .color-max-1 {\n    background-color: lighten(#512DA8, 35%);\n    border-color: lighten(#512DA8, 35%);\n    fill: lighten(#512DA8, 35%);\n    // stroke: lighten(#512DA8, 35%);\n  }\n\n  .color-max-2 {\n    background-color: lighten(#9C27B0, 35%);\n    border-color: lighten(#9C27B0, 35%);\n    fill: lighten(#9C27B0, 35%);\n    // stroke: lighten(#9C27B0, 35%);\n  }\n\n  .color-max-3 {\n    background-color: lighten(#00BCD4, 35%);\n    border-color: lighten(#00BCD4, 35%);\n    fill: lighten(#00BCD4, 35%);\n    // stroke: lighten(#00BCD4, 35%);\n  }\n\n  .color-max-warning {\n    background-color: lighten(@warningColor, 30%) !important;\n    border-color: lighten(@warningColor, 30%) !important;\n    fill: lighten(@warningColor, 30%) !important;\n    // stroke: lighten(@warningColor, 30%) !important;\n  }\n\n  .color-max-critical {\n    background-color: lighten(@criticalColor, 30%) !important;\n    border-color: lighten(@criticalColor, 30%) !important;\n    fill: lighten(@criticalColor, 30%) !important;\n    // stroke: lighten(@criticalColor, 30%) !important;\n  }\n\n  .max_tick_arc {\n    stroke: #FFF !important;\n  }\n\n  .concentric {\n    // float:left;\n    // border: 0px; /* solid black; */\n  }\n  // Chart\n  .concentricchart {\n\n    .bg-circle {\n      background: #F9F9F9;\n      fill: #F9F9F9;\n      stroke: #FFFFFF;\n      stroke-width: 1px;\n    }\n    path {\n      // stroke: #FFFFFF;\n      // stroke-width: 1px;\n      // opacity:0.8;\n    }\n    text {\n      font-size:12px;\n      font-family: 'Roboto', sans-serif;\n    }\n\n    .value_group {\n      fill: white;\n    }\n\n    .legend_group rect {\n      // stroke: #cccccc;\n      // stroke-width: 1px;\n      opacity:0.8;\n    }\n  }\n\n  svg.legend {\n    height: auto;\n\n    text {\n      font-size:12px;\n      font-family: 'Roboto', sans-serif;\n    }\n\n    .hostName {\n      font-size:16px;\n    }\n\n    .rect {\n\n    }\n\n  }\n\n  .minion-name {\n    text-align: center;\n    vertical-align: bottom;\n    width: 100%;\n  }\n  .chart_area {\n    width: 325px;\n    // height: 425px;\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "master/components/dashboard/less/dashboard/tables.less",
    "content": ".dash-table {\n  min-width: 100%;\n  border-collapse: collapse;\n}\n\n.dash-table tbody tr:hover, .dash-table tbody tr:focus {\n  &:not(.no-link){\n    cursor:pointer;\n    background-color:rgba(63,81,181,0.2);\n  }\n}\n\n.dash-table {\n\n  .dash-table-header {\n    border-bottom: 1px solid rgb(230,230,230);\n    color: rgb(130,130,130);\n    text-align: left;\n    font-size: 0.75em;\n    font-weight: 700;\n    padding: 16px 16px 16px 0;\n  }\n\n  .dash-table-header a {\n    text-decoration: none;\n    color: inherit;\n  }\n\n  .dash-table-caret {\n    display: inline-block;\n    vertical-align: middle;\n  }\n\n  .dash-table-content {\n    font-size: 0.8em;\n    padding: 16px 16px 16px 0;\n    height: 72px;\n  }\n\n  .dash-table-td-more {\n    max-width:72px;\n    width:72px;\n    padding:16px;\n  }\n\n  .dash-table-thumbs {\n    max-width: 104px;\n    width: 104px;\n    padding: 16px 32px;\n  }\n\n  .dash-table-thumbs div {\n    overflow:hidden;\n    width: 40px;\n    height:40px;\n    border-radius:20px;\n    border: 1px solid rgba(0,0,0,0.2);\n    background-size:cover;\n    box-shadow: 0 8px 10px rgba(0,0,0,.3);\n    -webkit-box-shadow: 0 8px 10px rgba(0,0,0,.1);\n  }\n\n  .dash-table-footer {\n    height:40px;\n  }\n\n  .dash-table-count-info {\n    line-height:40px;\n    font-size:.75em;\n  }\n\n  .dash-table-footer-item {\n    width: 40px;\n    height: 40px;\n    vertical-align:middle;\n  }\n\n  .dash-table-active-page {\n    font-weight: 700;\n  }\n\n  .bold {\n    font-weight: 700;\n  }\n\n  .grey {\n    color: grey;\n  }\n\n  md-input-container.md-default-theme .md-input {\n    color: white;\n    border-color: white;\n    margin-top: 24px;\n  }\n}\n"
  },
  {
    "path": "master/components/dashboard/less/dashboard.less",
    "content": ".dashboard {\n  .body-wrapper {\n    padding: 25px;\n  }\n  // analagous to float:right when used with row layout\n  [flex-align-self=\"end\"] {\n    -webkit-align-self: flex-end;\n    -ms-flex-align-self: end;\n    align-self: flex-end;\n  }\n\n  .back {\n    font-size: 18px;\n    line-height: 27px;\n    margin-bottom: 30px;\n  }\n\n  .heading {\n    font-size: 18px;\n    line-height: 21px;\n    color: #222222;\n    margin-bottom: 25px;\n\n    .label {\n      color: #777777;\n    }\n  }\n\n  @import \"dashboard/pods\";\n  @import \"dashboard/tables\";\n  @import \"dashboard/servers\";\n  @import \"dashboard/groups\";\n\n  .detail {\n    color: #222222;\n\n    .back {\n      font-size: 18px;\n      line-height: 27px;\n      margin-bottom: 30px;\n    }\n\n    .heading {\n      font-size: 18px;\n      line-height: 21px;\n      color: #222222;\n      margin-bottom: 25px;\n\n      .label {\n        color: #777777;\n      }\n    }\n\n    td.name {\n      font-size: 14px;\n      color: #222222;\n      line-height: 24px;\n    }\n\n    td.value {\n      margin-left: 50px;\n      font-size: 14px;\n      color: #888888;\n      line-height: 24px;\n    }\n\n    .containerTable {\n      td {\n        padding-right: 20px;\n      }\n    }\n  }\n\n  .align-top tbody {\n    vertical-align: top;\n  }\n}\n"
  },
  {
    "path": "master/components/dashboard/manifest.json",
    "content": "{\n  \"description\": \"The basic Kubernetes UI dashboard... \",\n  \"routes\": [\n    {\n      \"description\": \"Dashboard visualization.\",\n      \"url\": \"/\",\n      \"templateUrl\": \"components/dashboard/pages/home.html\"\n    },\n    {\n      \"description\": \"Pods\",\n      \"url\": \"/pods\",\n      \"templateUrl\": \"components/dashboard/views/listPods.html\"\n    },\n    {\n      \"description\": \"Services\",\n      \"url\": \"/services\",\n      \"templateUrl\": \"components/dashboard/views/listServices.html\"\n    },\n    {\n      \"description\": \"Replication Controllers\",\n      \"url\": \"/replicationcontrollers\",\n      \"templateUrl\": \"components/dashboard/views/listReplicationControllers.html\"\n    },\n    {\n      \"description\": \"Events\",\n      \"url\": \"/events\",\n      \"templateUrl\": \"components/dashboard/views/listEvents.html\"\n    },\n    {\n      \"description\": \"Nodes\",\n      \"url\": \"/nodes\",\n      \"templateUrl\": \"components/dashboard/views/listMinions.html\"\n    },\n    {\n      \"description\": \"Replication Controller\",\n      \"url\": \"/replicationcontrollers/:namespaceId/:replicationControllerId\",\n      \"templateUrl\": \"components/dashboard/views/replication.html\"\n    },\n    {\n      \"description\": \"Service\",\n      \"url\": \"/services/:namespaceId/:serviceId\",\n      \"templateUrl\": \"components/dashboard/views/service.html\"\n    },\n    {\n      \"description\": \"Node\",\n      \"url\": \"/nodes/:nodeId\",\n      \"templateUrl\": \"components/dashboard/views/node.html\"\n    },\n    {\n      \"description\": \"Explore\",\n      \"url\": \"/groups/:grouping*?/selector/:selector*?\",\n      \"templateUrl\": \"components/dashboard/views/groups.html\"\n    },\n    {\n      \"description\": \"Pod\",\n      \"url\": \"/pods/:namespaceId/:podId\",\n      \"templateUrl\": \"components/dashboard/views/pod.html\"\n    }\n  ]\n}\n"
  },
  {
    "path": "master/components/dashboard/pages/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/pages/footer.html",
    "content": "<p></p>"
  },
  {
    "path": "master/components/dashboard/pages/header.html",
    "content": "<div layout-fill>\n<md-toolbar md-scroll-shrink class=\"dashboard-subnav\">\n   <div class=\"md-toolbar-tools\">\n      <div layout=\"row\" flex class=\"fill-height\">\n         <div class=\"md-toolbar-item md-breadcrumb\"></div>\n         <span ng-if=\"menu.currentPage.name !== menu.currentSection.name\">\n         <span hide-sm hide-md><a href=\"#{{menu.currentSection.url}}\">{{menu.currentSection.name}}</a></span>\n         <span class=\"menu-separator-icon\" style=\"padding: 0 10px;\" hide-sm hide-md>\n         <img style=\"height: 12px;\" src=\"assets/img/docArrow.png\" alt=\"\" aria-hidden=\"true\">\n         </span>\n         </span>\n         <span style=\"display: inline-block;\">{{(menu.currentPage | humanizeDoc) || 'Kubernetes' }}</span>\n         <span flex></span>\n         <div class=\"md-toolbar-item md-tools\" layout=\"row\">\n            <div layout=\"column\" class=\"selectSubPages\">\n               <md-select ng-model=\"page\" placeholder=\"Views\" class=\"selectTitle\">\n                  <md-optgroup label=\"Dashboard\">\n                  <md-option id=\"{{subpage.id}}\" ng-value=\"subpage.value\" ng-repeat=\"subpage in subpages | filter: {category: 'dashboard' }\">{{subpage.name}}</md-option>\n                  </md-option-group>\n               </md-select>\n            </div>\n         </div>\n      </div>\n   </div>\n</md-toolbar>\n</div>\n"
  },
  {
    "path": "master/components/dashboard/pages/home.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\" ng-controller=\"DashboardCtrl\" layout-fill>\n  <md-content>\n    <div ng-include=\"'components/dashboard/views/partials/cadvisor.html'\">&gt;</div>\n  </md-content>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/protractor/.gitignore",
    "content": ""
  },
  {
    "path": "master/components/dashboard/protractor/smoke.spec.js",
    "content": "describe('Kubernetes UI Dashboard', function() {\n  it('should have all the expected components loaded', function() {\n    browser.get('http://localhost:8000');\n    expect(browser.getTitle()).toEqual('Kubernetes UI');\n\n    // Navigate to the graph page.\n    var dashboardTab = element(by.id('tab_001'));\n    expect(dashboardTab).toBeDefined();\n    dashboardTab.click();\n    expect(browser.getLocationAbsUrl()).toBe('/dashboard/');\n\n    // Verify if the views dropdown list has been loaded.\n    var views = element(by.model('page'));\n    expect(views).toBeDefined();\n  });\n\n  it('should have the subnav view', function() {\n    browser.get('http://localhost:8000/');\n\n    // Make sure the subnav and subpage selection is correctly loaded.\n    expect(by.css('.dashboard-subnav')).toBeDefined();\n    var selectSubPages = element(by.css('.selectSubPages'));\n    expect(selectSubPages).toBeDefined();\n    selectSubPages.click();\n\n    var select = element(by.model('page'));\n    expect(select).toBeDefined();\n\n    // Make clicks to expand the subpage selection options.\n    selectSubPages.click();\n    select.click();\n\n    expect(element(by.id('groupsView'))).toBeDefined();\n    expect(element(by.id('podsView'))).toBeDefined();\n    expect(element(by.id('minionsView'))).toBeDefined();\n    expect(element(by.id('rcView'))).toBeDefined();\n    expect(element(by.id('servicesView'))).toBeDefined();\n    expect(element(by.id('eventsView'))).toBeDefined();\n    expect(element(by.id('cAdvisorView'))).toBeDefined();\n  });\n\n  it('should have the cAdvisor view by default', function() {\n    browser.get('http://localhost:8000/');\n    expect(browser.getTitle()).toEqual('Kubernetes UI');\n\n    expect(element.all(by.css('.dashboard')).count()).toBeGreaterThan(0);\n    expect(element.all(by.css('.server-overview')).count()).toEqual(1);\n\n    // Also we should render the view based on the minions data.\n    expect(element(by.repeater(\"minion in minions.items\"))).toBeDefined();\n\n    // Make sure the svg is drawn.\n    var svg = element(by.css('svg'));\n    expect(svg).toBeDefined();\n  });\n\n  it('should have the correct subviews', function() {\n    browser.get('http://localhost:8000/');\n\n    var subviews = ['podsView', 'minionsView', 'rcView', 'servicesView', 'eventsView'];\n\n    for (var i = 0; i < subviews.length; i++) {\n      var subview = subviews[i];\n\n      // Navigate to the subview.\n      var select = element(by.model('page'));\n      select.click();\n      var podsView = element(by.id(subview));\n      expect(podsView).toBeDefined();\n      podsView.click();\n\n      // Make sure the pods view still has the right title and subnav.\n      expect(browser.getTitle()).toEqual('Kubernetes UI');\n      expect(by.css('.dashboard-subnav')).toBeDefined();\n      expect(element(by.css('.selectSubPages'))).toBeDefined();\n\n      // Verify if the views dropdown list has been loaded.\n      var views = element(by.model('page'));\n      expect(views).toBeDefined();\n\n      expect(element.all(by.css('.list-pods')).count()).toEqual(1);\n      // Make sure we are populating the pods info dynamically.\n      expect(element(by.repeater('h in headers'))).toBeDefined();\n    }\n  });\n\n  it('should have the correct groups view', function() {\n    browser.get('http://localhost:8000/');\n\n    // Navigate to the group view.\n    var select = element(by.model('page'));\n    select.click();\n    var groupsView = element(by.id('groupsView'));\n    expect(groupsView).toBeDefined();\n    groupsView.click();\n\n    // Make sure the pods view still have the right title and subnav.\n    expect(browser.getTitle()).toEqual('Kubernetes UI');\n    expect(by.css('.dashboard-subnav')).toBeDefined();\n    expect(element(by.css('.selectSubPages'))).toBeDefined();\n\n    // Verify if the views dropdown list has been loaded.\n    var views = element(by.model('page'));\n    expect(views).toBeDefined();\n\n    // Make sure necessary components are loaded correctly.\n    var select = element(by.model('selectedGroupBy'));\n    expect(select).toBeDefined();\n\n    // Open the selection options.\n    select.click();\n    expect(element(by.repeater(\"g in groupByOptions\"))).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "master/components/dashboard/test/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/test/controllers/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/test/controllers/header.spec.js",
    "content": "'use strict';\n\ndescribe('header controller', function() {\n    beforeEach(module('kubernetesApp.components.dashboard'));\n\n    beforeEach(inject(function($rootScope, $location, $controller) {\n        this.rootScope = $rootScope;\n        this.scope = $rootScope.$new();\n\n        this.location = $location;\n        spyOn(this.location, 'path');\n\n        this.controller = $controller;\n        this.ctrl = this.controller('HeaderCtrl', {\n            $scope: this.scope\n        });\n        this.scope.$apply();\n    }));\n\n    describe('subPages', function() {\n        it('is defined', function() {\n            expect(this.scope.subPages).not.toBeUndefined();\n        });\n\n        it('is an array', function() {\n            expect(Array.isArray(this.scope.subPages)).toBeTruthy();\n        });\n\n        it('is not empty', function() {\n            expect(this.scope.subPages.length).toBeGreaterThan(0);\n        });\n\n        describe('each subPage', function() {\n            it('has a category', function() {\n                this.scope.subPages.forEach(function(subPage) {\n                    expect(subPage.category).toBeTruthy();\n                });\n            });\n\n            it('has a name', function() {\n                this.scope.subPages.forEach(function(subPage) {\n                    expect(subPage.name).toBeTruthy();\n                });\n            });\n\n            it('has a value', function() {\n                this.scope.subPages.forEach(function(subPage) {\n                    expect(subPage.value).toBeTruthy();\n                });\n            });\n        });\n    });\n\n    describe('Pages', function() {\n        it('does not change location on first detected change', function() {\n            expect(this.location.path).not.toHaveBeenCalled();\n        });\n\n        it('changes location on second detected change', function() {\n            var _this = this;\n            this.scope.$apply(function() {\n                _this.scope.Pages = 'test_Pages';\n            });\n            expect(this.location.path).toHaveBeenCalledWith('test_Pages');\n        });\n    });\n});\n"
  },
  {
    "path": "master/components/dashboard/test/directives/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/test/services/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/views/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/views/groups.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"GroupCtrl\" layout=\"column\" class=\"body-wrapper groups\">\n    <md-content>\n      <!-- page header -->\n      <div class=\"header\" layout=\"row\">\n          <div class=\"\">Group by: </div>\n\n          <md-select placeholder=\"{{routeParams.grouping}}\" class=\"select-group-by\" ng-model=\"selectedGroupBy\" ng-change=\"changeGroupBy()\">\n              <md-option ng-value=\"g.value\" ng-repeat=\"g in groupByOptions\">{{g.name}}</md-option>\n          </md-select>\n\n          <div ng-if=\"selector\" layout=\"row\" class=\"selector-area\">\n            <div class=\"filter-label\">Filter:</div>\n\n            <div class=\"filter-text\">{{selector}}</div>\n            <div class=\"filter-area\" ng-if=\"selector && selector.length > 0\">\n\n              <button ng-click=\"clearSelector(routeParams.grouping)\" class=\"md-button cancel-button\">\n\n                <md-icon md-svg-src=\"components/dashboard/img/icons/ic_close_18px.svg\" class=\"cancel-icon\" alt=\"Cancel\"></md-icon>\n\n              </button>\n\n            </div>\n\n          </div>\n\n      </div>\n      <div class=\"group-item\" ng-repeat=\"(groupName,group) in groups.items\" ng-include=\"'components/dashboard/views/partials/groupBox.html'\"></div>\n    </md-content>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listEvents.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListEventsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listMinions.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListMinionsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listPods.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listPodsCards.html",
    "content": "<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n\n    <md-whiteframe layout-margin class=\"md-whiteframe-z2\">\n    <md-toolbar class=\"\">\n      <div class=\"md-toolbar-tools\">\n        Pods\n      </div>\n    </md-toolbar>\n    <md-content>\n\n\n        <div class=\"pod-group\">\n          <md-grid-list md-cols=\"6\" md-row-height=\"1:1.5\" md-gutter=\"8px\" ng-repeat=\"(podName, groupPods) in groupedPods\">\n            <md-grid-tile md-rowspan=\"1\" md-colspan=\"2\" class=\"gray\">\n              <md-grid-tile-footer>\n                <div class=\"pod-title\"><h2>{{podName}}</h2></div>\n              </md-grid-tile-footer>\n            </md-grid-tile>\n\n            <md-grid-tile class=\"purple\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n              <div>\n\n                <div>\n                  Containers:\n                  <span ng-repeat=\"container in pod.desiredState.manifest.containers\">\n                    {{container.name}}\n                  </span>\n                </div>\n                <div>\n                  Images:\n                  <span ng-repeat=\"container in pod.desiredState.manifest.containers\">\n                    {{container.image}}\n                  </span>\n                </div>\n                <div>Internal IP: {{pod.currentState.podIP}}</div>\n                <div>\n                Labels:\n                  <span ng-repeat=\"(label, value) in pod.labels\">{{label}}={{value}}<span ng-show=\"!$last\">, </span></span>\n                </div>\n                <div>Status: {{pod.currentState.status}}</div>\n              </div>\n              <md-grid-tile-footer>\n\n                <div class=\"pod-host\">{{pod.currentState.host}}</div>\n                <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n              </md-grid-tile-footer>\n            </md-grid-tile>\n\n          </md-grid-list>\n        </div>\n\n\n    </md-content>\n    </md-whiteframe>\n\n  </div>\n</div>\n"
  },
  {
    "path": "master/components/dashboard/views/listPodsVisualizer.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListPodsCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n    <md-whiteframe layout-margin class=\"md-whiteframe-z2\">\n    <md-content>\n<div>\n<md-button class=\"md-primary\" ng-click=\"serverView = false\">By Name</md-button> |\n<md-button class=\"md-primary\" ng-click=\"serverView = true\">By Server</md-button>\n  <div style=\"float:right;\"><md-button class=\"md-primary\" ng-href=\"#/dashboard/pods\">View Pod Listing</md-button></div>\n</div>\n    <div class=\"pod-group\" ng-show=\"!serverView\" ng-include=\"'components/dashboard/views/partials/podTilesByName.html'\"></div>\n    <div class=\"pod-group\" ng-show=\"serverView\" ng-include=\"'components/dashboard/views/partials/podTilesByServer.html'\"></div>\n    </md-content>\n    </md-whiteframe>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listReplicationControllers.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListReplicationControllersCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/listServices.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ListServicesCtrl\" style=\"padding:25px;\" class=\"list-pods\">\n  <md-table headers=\"headers\" content=\"content\" sortable=\"sortable\" filters=\"search\" custom-class=\"custom\" thumbs=\"thumbs\" count=\"count\" on-select=\"go(data)\"></md-table>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/node.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"NodeCtrl\" layout=\"column\" class=\"body-wrapper node\">\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n\n      <div class=\"heading\">\n        <span class=\"label\">Name:</span>\n        <span>{{node.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr ng-show=\"node.metadata.labels\">\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in node.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{node.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Addresses</td>\n            <td class=\"value\">\n              <div ng-repeat=\"a in node.status.addresses\">\n                {{a.address}}\n              </div>\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.status.capacity\">\n            <td class=\"name\">Capacity</td>\n            <td class=\"value\">\n              <table>\n                <tr ng-repeat=\"(label, value) in node.status.capacity\">\n                  <td>{{label}}:</td> <td>{{value}}</td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">System Info</td>\n            <td class=\"value\">\n              <table>\n              <tr ng-repeat=\"(label, value) in node.status.nodeInfo\">\n                <td>{{label}}:</td> <td>{{value}}</td>\n              </tr>\n              </table>\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.spec.podCIDR\">\n            <td class=\"name\">PodCIDR</td>\n            <td class=\"value\">\n              {{node.spec.podCIDR}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"node.spec.externalID\">\n            <td class=\"name\">ExternalID</td>\n            <td class=\"value\">\n              {{node.spec.externalID}}\n            </td>\n          </tr>\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/partials/.gitkeep",
    "content": ""
  },
  {
    "path": "master/components/dashboard/views/partials/cadvisor.html",
    "content": "<div class=\"dashboard\" ng-controller=\"cAdvisorController\">\n  <div class=\"server-overview\">\n    <md-content layout=\"row\" layout-wrap>\n      <div flex-sm=\"100\" flex-md=\"50\" flex-lg=\"33\" flex-gt-lg=\"25\" class=\"chart_area\" ng-repeat=\"minion in minions.items\">\n        <d3-minion-bar-gauge data=\"activeMinionDataById[minion.metadata.name]\" class=\"concentric\" graph-width=\"325\" graph-height=\"325\" thickness=18 />\n      </div>\n    </md-content>\n  </div>\n</div>\n"
  },
  {
    "path": "master/components/dashboard/views/partials/groupBox.html",
    "content": "<div>\n  <md-content>\n    <div class=\"server-overview\" layout=\"column\">\n      <!-- subheader -->\n      <div class=\"group-heading\" layout=\"row\">\n        <div class=\"label\">{{routeParams.grouping | ucfirst}}: <span class=\"bold\">{{ (groupName) || \"blank\"  }}</span></div>\n      </div>\n      <!-- render group data -->\n      <div ng-include=\"'components/dashboard/views/partials/groupItem.html'\"></div>\n      <div class=\"footer\">\n        <!-- Alternate box inside a box -->\n        <div ng-if=\"group.kind == 'grouping'\">\n          {{group.kind}}\n          <div ng-repeat=\"(groupName,group) in group.items\" ng-include=\"'components/dashboard/views/partials/groupBox.html'\"></div>\n        </div>\n        <md-divider></md-divider>\n      </div>\n    </div>\n  </md-content>\n</div>\n"
  },
  {
    "path": "master/components/dashboard/views/partials/groupItem.html",
    "content": "<div layout=\"row\" ng-if=\"group.kind != 'grouping'\">\n  <div>\n    <!-- Default box display -->\n      <div layout=\"row\" class=\"group-item\" ng-repeat=\"(groupType, data) in group | groupBy: 'metadata.labels.type'\">\n        <!-- left image -->\n        <div class=\"icon-area\">\n          <div class=\"group-icon\" style=\"background-color: {{getGroupColor(groupType)}}\"></div>\n        </div>\n        <!-- right area -->\n        <div class=\"group-main-area\" layout=\"column\">\n          <!-- type -->\n          <div class=\"subtype\">\n            {{groupType | ucfirst}}s\n          </div>\n          <!-- links -->\n          <div layout=\"row\" layout-wrap>\n            <div layout=\"row\" ng-repeat=\"item in data\">\n              <!-- title -->\n              <div ng-switch on='item.metadata.labels[\"type\"]'>\n                <div class=\"group-name\">\n                  <a ng-switch-when='pod' ng-href=\"#/dashboard/pods/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <a ng-switch-when='service' ng-href=\"#/dashboard/services/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <a ng-switch-when='replicationController' ng-href=\"#/dashboard/replicationcontrollers/{{ item.metadata.namespace }}/{{ item.metadata.name }}\">{{ item.metadata.name }}</a>\n                  <div ng-switch-default>{{item.metadata.name}}</div>\n                </div>\n              </div>\n              <md-select ng-model=\"selectedFilter\" ng-change=\"changeFilterBy(selectedFilter)\" class=\"selectFilter\">\n                <md-optgroup label=\"FILTER\">\n                  <md-option ng-value=\"'{{key}}={{value}}'\" ng-repeat=\"(key, value) in item.metadata.labels\">{{key}}: {{value}}</md-option>\n                  </md-option-group>\n                </md-optgroup>\n              </md-select>\n              <!-- This is the official button design, but requires a custom dialog. Fix up after the demo. -->\n              <!-- <md-button ng-click=\"\" class=\"filter-button\" style=\"padding:0\">\n                <md-icon md-svg-src=\"components/dashboard/img/icons/ic_arrow_drop_down_18px.svg\" class=\"filter-icon\" aria-label=\"\" alt=\"Filter\"></md-icon>\n              </md-button> -->\n            </div>\n          </div>\n        </div>\n      </div>\n  </div>\n</div>\n"
  },
  {
    "path": "master/components/dashboard/views/partials/podTilesByName.html",
    "content": "\n<md-grid-list class=\"list-color-{{$index + 1}}\" md-cols=\"6\" md-row-height=\"1:1\" md-gutter=\"8px\" ng-repeat=\"(podName, groupPods) in podsByName\">\n  <md-grid-tile md-rowspan=\"2\" md-colspan=\"2\" class=\"colored\">\n    <md-grid-tile-footer>\n      <div class=\"pod-title\"><h2>{{podName}} overview</h2></div>\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n  <md-grid-tile class=\"colored {{podStatusClass(pod)}}\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n    <md-grid-tile-header class=\"clear-bg\">\n\n      <div layout=\"row\">\n        <div class=\"labels\"><span ng-repeat=\"(label, value) in otherLabels(pod.labels)\">{{label}}: {{value}}<span ng-show=\"!$last\">, </span></span></div>\n\n        <div flex=\"20\" class=\"restarts\" ng-show=\"getPodRestarts(pod) > 0\">\n          <md-button class=\"md-fab restart-button\">\n              {{getPodRestarts(pod)}}\n          </md-button>\n        </div>\n      </div>\n\n    </md-grid-tile-header>\n    <div class=\"inner-box\">\n\n      <div ng-show=\"podStatusClass(pod)\">Status: {{pod.currentState.status}}</div>\n    </div>\n    <md-grid-tile-footer>\n\n      <div class=\"pod-host\">{{pod.currentState.host}}</div>\n      <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n    </md-grid-tile-footer>\n  </md-grid-tile>\n</md-grid-list>"
  },
  {
    "path": "master/components/dashboard/views/partials/podTilesByServer.html",
    "content": "<md-grid-list class=\"\" md-cols=\"6\" md-row-height=\"1:1\" md-gutter=\"8px\" ng-repeat=\"(serverIp, groupPods) in podsByServer\">\n  <md-grid-tile md-rowspan=\"2\" md-colspan=\"2\" class=\"gray\">\n    <md-grid-tile-footer>\n      <div class=\"pod-title\"><h2>{{serverIp}} overview</h2></div>\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n  <md-grid-tile class=\"color-{{podIndexFromName(pod)}} {{podStatusClass(pod)}}\" md-rowspan=\"1\" md-colspan=\"1\" ng-repeat=\"pod in groupPods\" >\n    <md-grid-tile-header class=\"clear-bg\">\n\n      <div layout=\"row\">\n        <div class=\"labels\"><span ng-repeat=\"(label, value) in otherLabels(pod.labels)\">{{label}}: {{value}}<span ng-show=\"!$last\">, </span></span></div>\n\n        <div flex=\"20\" class=\"restarts\" ng-show=\"getPodRestarts(pod) > 0\">\n          <md-button class=\"md-fab restart-button\">\n              {{getPodRestarts(pod)}}\n          </md-button>\n        </div>\n      </div>\n\n    </md-grid-tile-header>\n    <div class=\"inner-box\">\n\n      <div ng-show=\"podStatusClass(pod)\">Status: {{pod.currentState.status}}</div>\n    </div>\n    <md-grid-tile-footer>\n\n      <div class=\"pod-host\">{{pod.labels.name}}</div>\n      <div><a ng-href=\"#/dashboard/pods/{{ pod.id }}\"><h3>{{ pod.id }}</h3></a></div>\n\n    </md-grid-tile-footer>\n  </md-grid-tile>\n\n</md-grid-list>"
  },
  {
    "path": "master/components/dashboard/views/pod.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"PodCtrl\" layout=\"column\" class=\"body-wrapper pod\">\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Name:</span>\n        <span>{{pod.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Status</td>\n            <td class=\"value\">\n              {{pod.status.phase}} on <a ng-href=\"#/dashboard/groups/host/selector/host={{pod.spec.host}}\">{{pod.spec.host}}</a>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{pod.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Host Networking</td>\n            <td class=\"value\">\n              {{pod.spec.host}}/{{pod.status.hostIP}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Pod Networking</td>\n            <td class=\"value\">\n              {{pod.status.podIP}}\n              <span ng-repeat=\"container in pod.spec.containers\">\n                <span ng-repeat=\"port in container.ports\">\n                  <span ng-show=\"port.containerPort\">\n                    {{port.name}}: {{port.containerPort}}{{$last ? '' : ', '}}\n                  </span>\n               </span>\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in pod.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{pod.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Containers</td>\n            <td class=\"value\">\n\n              <table class=\"containerTable\">\n                <tr>\n                  <td>Name</td>\n                  <td>Image</td>\n                  <td>Ready</td>\n                  <td>Restarts</td>\n                  <td>State</td>\n                </tr>\n                <tr ng-repeat=\"container in pod.status.containerStatuses\">\n                  <td>{{container.name}}</td>\n                  <td>{{container.image}}</td>\n                  <td>{{container.ready}}</td>\n                  <td>{{container.restartCount}}</td>\n                  <td>\n                    <div ng-show=\"container.state.running\">\n                      <div class=\"run-state\">Running</div>\n                      <div class=\"run-messages\">Started: {{container.state.running.startedAt | date:'medium'}}</div>\n                    </div>\n                    <div ng-show=\"container.state.waiting\">\n                      <div class=\"run-state\">Waiting</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.waiting.reason\">Reason: {{container.state.waiting.reason}}</div>\n                    </div>\n                    <div ng-show=\"container.state.termination\">\n                      <div class=\"run-state\">Terminated</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.reason\">Reason: {{container.state.termination.reason}}</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.message\">Message: {{container.state.termination.message}}</div>\n                      <div class=\"run-messages\">Exit Code: {{container.state.termination.exitCode}}</div>\n                      <div class=\"run-messages\" ng-show=\"container.state.termination.signal\">Signal: {{container.state.termination.signal}}</div>\n                      <div class=\"run-messages\">Started: {{container.state.termination.startedAt | date:'medium'}}</div>\n                      <div class=\"run-messages\">Finished: {{container.state.termination.finishedAt | date:'medium'}}</div>\n                    </div>\n                  </td>\n                </tr>\n              </table>\n\n\n            </td>\n          </tr>\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/replication.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n<div ng-controller=\"ReplicationControllerCtrl\" layout=\"column\" class=\"body-wrapper\">\n\n  <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Replication Controller: </span>\n        <span>{{replicationController.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{replicationController.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Desired Replicas</td>\n            <td class=\"value\">\n              {{replicationController.spec.replicas}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Current Replicas</td>\n            <td class=\"value\">\n              {{replicationController.status.replicas}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"replicationController.spec.selector\">\n            <td class=\"name\">Selector</td>\n            <td class=\"value\">\n              <span ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                {{label}}={{value}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in replicationController.metadata.labels\">\n                  {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{replicationController.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Pods</td>\n            <td class=\"value\">\n              <div ng-show=\"replicationController.spec.selector && Object.keys(replicationController.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(replicationController.spec.selector)}},type=pod\">{{getSelectorUrlFragment(replicationController.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=pod\">{{label}}: {{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n\n          <tr>\n            <td class=\"name\">Related Services</td>\n            <td class=\"value\">\n              <div ng-show=\"replicationController.spec.selector && Object.keys(replicationController.spec.selector).length > 1\">\n\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(replicationController.spec.selector)}},type=pod\">{{getSelectorUrlFragment(replicationController.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in replicationController.spec.selector\">\n                  <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=service\">{{label}}={{value}}</a>\n                </div>\n            </td>\n          </tr>\n\n\n\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n\n\n\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/components/dashboard/views/service.html",
    "content": "<div dashboard-header></div>\n<div class=\"dashboard\">\n  <div ng-controller=\"ServiceCtrl\" layout=\"column\" class=\"body-wrapper service\">\n\n    <div class=\"detail\">\n\n      <div class=\"back\">\n        <md-button class=\"md-default-theme\" ng-click=\"doTheBack()\">‹ BACK</md-button>\n      </div>\n\n      <div class=\"heading\">\n        <span class=\"label\">Service: </span>\n        <span>{{service.metadata.name}}</span>\n      </div>\n\n\n      <table class=\"align-top\">\n        <tbody>\n          <tr>\n            <td class=\"name\">Created</td>\n            <td class=\"value\">\n              {{service.metadata.creationTimestamp | date:'medium'}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Ports</td>\n            <td class=\"value\">\n              <div ng-repeat=\"port in service.spec.ports\">\n                <span ng-show=\"port.name\">\n                  {{port.name}}:\n                </span>\n                {{port.port}}/{{port.protocol}}\n\n                <div ng-show=\"port.nodePort && port.nodePort != 0\">\n                  Node Port: {{port.nodePort}}/{{port.protocol}}\n                </div>\n\n             </div>\n            </td>\n          </tr>\n\n\n          <tr>\n            <td class=\"name\">IP</td>\n            <td class=\"value\">\n              {{service.spec.portalIP}}\n            </td>\n          </tr>\n\n          <tr ng-show=\"service.status.loadBalancer.ingress\">\n            <td class=\"name\">LoadBalancer Ingress</td>\n            <td class=\"value\">\n              <span ng-repeat=\"lb in service.status.loadBalancer.ingress\">\n                {{lb.ip || lb.hostname}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Session Affinity</td>\n            <td class=\"value\">\n              {{service.spec.sessionAffinity}}\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Labels</td>\n            <td class=\"value\">\n              <div ng-repeat=\"(label, value) in service.metadata.labels\">\n                {{label}}: {{value}}\n              </div>\n            </td>\n          </tr>\n\n          <tr ng-show=\"service.spec.selector\">\n            <td class=\"name\">Selector</td>\n            <td class=\"value\">\n              <span ng-repeat=\"(label, value) in service.spec.selector\">\n                {{label}}={{value}}{{$last ? '' : ', '}}\n              </span>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Namespace</td>\n            <td class=\"value\">{{service.metadata.namespace}}</td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Pods</td>\n            <td class=\"value\">\n              <div ng-show=\"service.spec.selector && Object.keys(service.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(service.spec.selector)}},type=pod\">{{getSelectorUrlFragment(service.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in service.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=pod\">{{label}}={{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n          <tr>\n            <td class=\"name\">Related Replication Controllers</td>\n            <td class=\"value\">\n              <div ng-show=\"service.spec.selector && Object.keys(service.spec.selector).length > 1\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{getSelectorUrlFragment(service.spec.selector)}},type=replicationController\">{{getSelectorUrlFragment(service.spec.selector)}}</a>\n              </div>\n\n              <div ng-repeat=\"(label, value) in service.spec.selector\">\n                <a ng-href=\"#/dashboard/groups/type/selector/{{label}}={{value}},type=replicationController\">{{label}}={{value}}</a>\n              </div>\n            </td>\n          </tr>\n\n        </tbody>\n      </table>\n\n\n\n    </div>\n\n  </div>\n</div>\n<div dashboard-footer></div>\n"
  },
  {
    "path": "master/gulpfile.js",
    "content": "var gulp = require('gulp'), concat = require('gulp-concat'), uglify = require('gulp-uglify'),\n    less = require('gulp-less'), path = require('path'),\n    livereload = require('gulp-livereload'),\n    path = require('path'), changed = require('gulp-changed'), prettify = require('gulp-html-prettify'),\n    w3cjs = require('gulp-w3cjs'), rename = require('gulp-rename'),\n    through = require('through2'), gutil = require('gulp-util'), htmlify = require('gulp-angular-htmlify'),\n    minifyCSS = require('gulp-minify-css'), gulpFilter = require('gulp-filter'), expect = require('gulp-expect-file'),\n    gulpsync = require('gulp-sync')(gulp), ngAnnotate = require('gulp-ng-annotate'),\n    sourcemaps = require('gulp-sourcemaps'), del = require('del'), jsoncombine = require('gulp-jsoncombine'),\n    ngConstant = require('gulp-ng-constant'), foreach = require('gulp-foreach'),\n    gcallback = require('gulp-callback'), changeCase = require('change-case'),\n    tag_version = require('gulp-tag-version'), PluginError = gutil.PluginError;\n\n// LiveReload port. Change it only if there's a conflict\nvar lvr_port = 35729;\n\nvar W3C_OPTIONS = {\n  // Set here your local validator if your using one. leave it empty if not\n  // uri: 'http://validator/check',\n  doctype: 'HTML5',\n  output: 'json',\n  // Remove some messages that angular will always display.\n  filter: function(message) {\n    if (/Element head is missing a required instance of child element title/.test(message)) { return false; }\n    if (/Attribute .+ not allowed on element .+ at this point/.test(message)) { return false; }\n    if (/Element .+ not allowed as child of element .+ in this context/.test(message)) { return false; }\n    if (/Comments seen before doctype./.test(message)) { return false; }\n  }\n};\n\n// production mode (see build task)\nvar isProduction = false;\nvar useSourceMaps = false;\n\n// ignore everything that begins with underscore\nvar hidden_files = '**/_*.*';\nvar ignored_files = '!' + hidden_files;\n\nvar output_folder = '../app';\n\n// VENDOR CONFIG\nvar vendor = {\n  // vendor scripts required to start the app\n  base: {\n    source: require('./vendor.base.json'), \n    dest: '../app/assets/js', \n    name: 'base.js'\n  },\n  // vendor scripts to make to app work. Usually via lazy loading\n  app: {\n    // instead of the bower downloaded versions of some files, we\n    // pull hand edited versions from the shared/vendor directory.\n    source: require('./vendor.json'),\n    dest: '../app/vendor'\n  }\n};\n\n// SOURCES CONFIG\nvar source = {\n  scripts: {\n    app: [\n      'js/app.preinit.js',\n      'js/app.init.js',\n      'js/app.config.js',\n      'js/app.directive.js',\n      'js/app.run.js',\n      'js/app.service.js',\n      'js/tabs.js',\n      'js/sections.js',\n      'shared/config/generated-config.js',\n      'shared/js/modules/*.js',\n      'shared/js/modules/controllers/*.js',\n      'shared/js/modules/directives/*.js',\n      'shared/js/modules/services/*.js',\n      'components/**/js/modules/*.js',\n      'components/**/js/modules/controllers/*.js',\n      'components/**/js/modules/directives/*.js',\n      'components/**/js/modules/services/*.js'\n    ],\n    dest: {\n      name: 'app.js', \n      dir: '../app/assets/js'\n    },\n    watch: [\n      'manifest.json', \n      'js/**/*.js', \n      'shared/**/*.js', \n      'shared/config/*.json',\n      'components/*/js/**/*.js',\n      'components/*/config/*.json'\n      ]\n  },\n\n  styles: {\n    app: {\n      source: ['less/app/base.less', 'components/*/less/*.less'],\n      paths: ['less/app', 'components'],\n      dest: '../app/assets/css',\n      watch: ['less/*.less', 'less/**/*.less', 'components/**/less/*.less', 'components/**/less/**/*.less']\n\n    }\n  },\n\n  html: {\n    app: {\n      source: ['shared/index.html'],\n      dest: '../app'\n    },\n    views: {\n      source: ['shared/views/**/*.*'],\n      dest: '../app'\n    },\n    watch: ['shared/index.html', 'shared/views/**/*.*']\n  },\n\n  components: {\n    source: [\n      'components/**/*.*',\n      '!components/**/js/**/*.*',\n      '!components/**/config/**/*.*',\n      '!components/**/protractor/**/*.*',\n      '!components/**/test/**/*.*',\n      '!components/**/less/**/*.*',\n      '!components/**/README.md'\n    ],\n    dest: '../app/components',\n    watch: [\n      'components/**/*.*',\n      '!components/**/js/**/*.*',\n      '!components/**/config/**/*.*',\n      '!components/**/protractor/**/*.*',\n      '!components/**/test/**/*.*',\n      '!components/**/less/**/*.*',\n      '!components/**/README.md'\n    ]\n  },\n\n  config: {\n    dest: 'shared/config'\n  },\n\n  assets: {\n    source: ['shared/assets/**/*.*'], \n    dest: '../app/assets', \n    watch: ['shared/assets/**/*.*']\n  }\n};\n\nfunction stringSrc(filename, string) {\n  var src = require('stream').Readable({objectMode: true});\n  src._read = function() {\n    this.push(new gutil.File({cwd: \"\", base: \"\", path: filename, contents: new Buffer(string)}));\n    this.push(null);\n  };\n  return src;\n}\n\n// Error handler\nfunction handleError(err) {\n  console.log(err.toString());\n  this.emit('end');\n  process.exit(1);\n}\n\n//---------------\n// TASKS\n//---------------\n\nvar manifestDirectory = function(manifestFile) {\n  return manifestFile.relative.slice(0, '/manifest.json'.length * -1);\n};\n\ngulp.task('bundle-manifest', function() {\n  var components = [];\n  var namespace = [];\n  gulp.src('./components/*/manifest.json')\n      .pipe(foreach (function(stream, file) {\n        var component = manifestDirectory(file);\n        components.push(component);\n        namespace.push(changeCase.camelCase(component));\n        return stream;\n      }))\n      .pipe(gcallback(function() {\n        var tabs = [];\n        components.forEach(function(component) {\n          tabs.push({component: component, title: changeCase.titleCase(component)});\n        });\n        stringSrc(\"tabs.js\", 'app.value(\"tabs\", ' + JSON.stringify(tabs) + ');').pipe(gulp.dest(\"js\"));\n        var _appNS = 'kubernetesApp.components.';\n        var _appSkeleton = require('./js/app.skeleton.json');\n        stringSrc(\"app.preinit.js\",\n                  _appSkeleton.appSkeleton.replace('%s', '\"' + _appNS + namespace.join('\", \"' + _appNS) + '\"'))\n            .pipe(gulp.dest(\"js\"));\n      }));\n});\n\ngulp.task('bundle-manifest-routes', function() {\n  var sections = [];\n  gulp.src('./components/*/manifest.json')\n      .pipe(foreach (function(stream, file) {\n        var component = manifestDirectory(file);\n        var manifestFile = require(file.path);\n        var routes = [];\n        if (manifestFile.routes) {\n          manifestFile.routes.forEach(function(r) {\n            // Hacky deep copy. Modifying manifestFile here will be repeated\n            // each time the task is called (consider watch/reload) due to\n            // cached file reads.\n            var route = JSON.parse(JSON.stringify(r));\n            if (route.url) {\n              route.url = '/' + component + route.url;\n            }\n            routes.push(route);\n          });\n        }\n        sections = sections.concat(routes);\n        return stream;\n      }))\n      .pipe(gcallback(function() {\n        var output_sections = JSON.stringify(sections);\n        var _file_contents = 'app.constant(\"manifestRoutes\", ' + output_sections + ');\\n';\n        stringSrc(\"sections.js\", _file_contents).pipe(gulp.dest(\"js\"));\n      }));\n});\n\n// JS APP\ngulp.task('scripts:app', gulpsync.sync(['bundle-manifest', 'bundle-manifest-routes', 'config', 'scripts:app:base']));\n\n// JS APP BUILD\ngulp.task('scripts:app:base', function() {\n  // Minify and copy all JavaScript (except vendor scripts)\n  return gulp.src(source.scripts.app)\n      .pipe(useSourceMaps ? sourcemaps.init() : gutil.noop())\n      .pipe(concat(source.scripts.dest.name))\n      .pipe(ngAnnotate())\n      .pipe(isProduction ? uglify({preserveComments: 'some'}) : gutil.noop())\n      .pipe(useSourceMaps ? sourcemaps.write() : gutil.noop())\n      .pipe(gulp.dest(source.scripts.dest.dir))\n      .on(\"error\", handleError);\n});\n\n// VENDOR BUILD\ngulp.task('scripts:vendor', gulpsync.sync(['scripts:vendor:base', 'scripts:vendor:app']));\n\n//  This will be included vendor files statically\ngulp.task('scripts:vendor:base', function() {\n\n  // Minify and copy all JavaScript (except vendor scripts)\n  return gulp.src(vendor.base.source)\n      .pipe(expect({ errorOnFailure: true }, vendor.base.source))\n      .pipe(isProduction ? uglify() : gutil.noop())\n      .pipe(concat(vendor.base.name))\n      .pipe(gulp.dest(vendor.base.dest))\n      .on(\"error\", handleError);\n});\n\n// copy file from bower folder into the app vendor folder\ngulp.task('scripts:vendor:app', function() {\n\n  var jsFilter = gulpFilter('**/*.js');\n  var cssFilter = gulpFilter('**/*.css');\n\n  return gulp.src(vendor.app.source)\n      .pipe(expect({ errorOnFailure: true }, vendor.app.source))\n      .pipe(jsFilter)\n      .pipe(isProduction ? uglify() : gutil.noop())\n      .pipe(jsFilter.restore())\n      .pipe(cssFilter)\n      .pipe(isProduction ? minifyCSS() : gutil.noop())\n      .pipe(cssFilter.restore())\n      .pipe(gulp.dest(vendor.app.dest))\n      .on(\"error\", handleError);\n\n});\n\n// APP LESS\ngulp.task('styles:app', function() {\n  return gulp.src(source.styles.app.source)\n      .pipe(foreach (function(stream, file) { return stringSrc('import.less', '@import \"' + file.relative + '\";\\n'); }))\n      .pipe(concat('app.less'))\n      .pipe(useSourceMaps ? sourcemaps.init() : gutil.noop())\n      .pipe(less({paths: source.styles.app.paths}))\n      .pipe(isProduction ? minifyCSS() : gutil.noop())\n      .pipe(useSourceMaps ? sourcemaps.write() : gutil.noop())\n      .pipe(gulp.dest(source.styles.app.dest))\n      .on(\"error\", handleError);\n});\n\ngulp.task('config', gulpsync.sync(['config:base', 'config:copy']));\n\ngulp.task('config:base', function() {\n  return stringSrc('generated-config.js', 'angular.module(\"kubernetesApp.config\")' +\n                                              '\\n' +\n                                              '.constant(\"ENV\", {})').pipe(gulp.dest(source.config.dest));\n});\n\ngulp.task('config:copy', function() {\n  var environment = isProduction ? 'production' : 'development';\n  return gulp.src(['shared/config/' + environment + '.json', 'components/**/config/' + environment + '.json'])\n    .pipe(expect({ errorOnFailure: true }, 'shared/config/' + environment + '.json'))\n    .on(\"error\", handleError)\n    .pipe(jsoncombine('generated-config.js',\n      function(data) {\n        var env = Object.keys(data).reduce(function(result, key) {\n          // Map the key \"environment\" to \"/\" and the keys \"component/config/environment\" to \"component\".\n          var newKey = key.replace(environment, '/').replace(/\\/config\\/\\/$/, '');\n          result[newKey] = data[key];\n          return result;\n        }, {});\n\n        return new Buffer(JSON.stringify({'ENV': env}));\n      }))\n    .pipe(ngConstant({name: 'kubernetesApp.config', deps: [], constants: {ngConstant: true}}))\n    .pipe(gulp.dest(source.config.dest));\n});\n\ngulp.task('copy:components', function() {\n\n  var jsFilter = gulpFilter('**/*.js');\n  var cssFilter = gulpFilter('**/*.css');\n\n  return gulp.src(source.components.source, {base: 'components'})\n      .pipe(expect({ errorOnFailure: true }, source.components.source))\n      .pipe(jsFilter)\n      .pipe(isProduction ? uglify() : gutil.noop())\n      .pipe(jsFilter.restore())\n      .pipe(cssFilter)\n      .pipe(isProduction ? minifyCSS() : gutil.noop())\n      .pipe(cssFilter.restore())\n      .pipe(gulp.dest(source.components.dest))\n      .on(\"error\", handleError);\n});\n\ngulp.task('copy:shared-assets', function() {\n  return gulp.src(source.assets.source, {base: 'shared/assets'})\n      .pipe(gulp.dest(source.assets.dest));\n});\n\n// Assuming there's \"version: 1.2.3\" in package.json,\n// tag the last commit as \"v1.2.3\"//\ngulp.task('tag', function() { return gulp.src(['./package.json']).pipe(tag_version()); });\n\n// VIEWS\ngulp.task('content:html', gulpsync.sync(['content:html:app', 'content:html:views']));\n\ngulp.task('content:html:app', function() {\n  return gulp.src(source.html.app.source, {base: 'shared'})\n    .pipe(prettify({\n        indent_char: ' ',\n        indent_size: 4,\n        unformatted: ['a', 'sub', 'sup', 'b', 'i', 'u']\n    }))\n    .pipe(gulp.dest(source.html.app.dest))\n    .on(\"error\", handleError);\n});\n\ngulp.task('content:html:views', function() {\n  return gulp.src(source.html.views.source, {base: 'shared'})\n    .pipe(prettify({\n        indent_char: ' ',\n        indent_size: 4,\n        unformatted: ['a', 'sub', 'sup', 'b', 'i', 'u']\n    }))\n    .pipe(gulp.dest(source.html.views.dest))\n    .on(\"error\", handleError);\n});\n\n//---------------\n// WATCH\n//---------------\n\n// Rerun the task when a file changes\ngulp.task('watch', function() {\n  livereload.listen();\n\n  gulp.watch([\n    source.assets.watch,\n    source.components.watch, \n    source.html.watch, \n    source.scripts.watch, \n    source.styles.app.watch\n    ], ['compile']);\n\n  gulp.watch(['../app/**'])\n      .on('change', function(event) {\n        livereload.changed(event.path);\n      });\n});\n\n//---------------\n// ENTRY POINTS\n//---------------\n\n// build for production (minify)\ngulp.task('build', gulpsync.sync(['prod', 'clean', 'compile']));\ngulp.task('prod', function() { isProduction = true; });\n\n// build with sourcemaps (no minify)\ngulp.task('sourcemaps', gulpsync.sync(['usesources', 'compile']));\ngulp.task('usesources', function() { useSourceMaps = true; });\n\n// build for development (no minify)\ngulp.task('default', gulpsync.sync(['clean', 'compile', 'watch']), function() {\n  gutil.log(gutil.colors.cyan('************'));\n  gutil.log('You can start editing your code. LiveReload will update your browser after any change.');\n  gutil.log(gutil.colors.cyan('************'));\n});\n\ngulp.task('clean', function() {\n  del.sync(['shared/config/generated-config.js'], {force: true});\n  del.sync([output_folder], {force: true});\n});\n\ngulp.task('compile', gulpsync.sync([\n  'copy:shared-assets',\n  'copy:components',\n  'content:html',\n  'scripts:vendor', \n  'scripts:app', \n  'styles:app'\n]));\n"
  },
  {
    "path": "master/js/app.config.js",
    "content": "angular.module('kubernetesApp.config', []);\nangular.module('kubernetesApp.services', ['kubernetesApp.config']);\n\napp.config([\n  '$routeProvider',\n  function($routeProvider) {\n    $routeProvider.when(\"/404\", {templateUrl: \"views/partials/404.html\"})\n        // else 404\n        .otherwise({redirectTo: \"/404\"});\n  }\n])\n    .config([\n      '$routeProvider',\n      'manifestRoutes',\n      function($routeProvider, manifestRoutes) {\n        angular.forEach(manifestRoutes, function(r) {\n          var route = {\n            templateUrl: r.templateUrl\n          };\n          if (r.controller) {\n            route.controller = r.controller;\n          }\n          if (r.css) {\n            route.css = r.css;\n          }\n          $routeProvider.when(r.url, route);\n        });\n      }\n    ]);\n\napp.value(\"sections\", [{\"name\":\"Dashboard\",\"url\":\"/dashboard\",\"type\":\"link\",\"templateUrl\":\"/components/dashboard/pages/home.html\"},{\"name\":\"Dashboard\",\"type\":\"heading\",\"children\":[{\"name\":\"Dashboard\",\"type\":\"toggle\",\"url\":\"/dashboard\",\"templateUrl\":\"/components/dashboard/pages/home.html\",\"pages\":[{\"name\":\"Pods\",\"url\":\"/dashboard/pods\",\"templateUrl\":\"/components/dashboard/views/listPods.html\",\"type\":\"link\"},{\"name\":\"Pod Visualizer\",\"url\":\"/dashboard/visualpods\",\"templateUrl\":\"/components/dashboard/views/listPodsVisualizer.html\",\"type\":\"link\"},{\"name\":\"Services\",\"url\":\"/dashboard/services\",\"templateUrl\":\"/components/dashboard/views/listServices.html\",\"type\":\"link\"},{\"name\":\"Replication Controllers\",\"url\":\"/dashboard/replicationcontrollers\",\"templateUrl\":\"/components/dashboard/views/listReplicationControllers.html\",\"type\":\"link\"},{\"name\":\"Events\",\"url\":\"/dashboard/events\",\"templateUrl\":\"/components/dashboard/views/listEvents.html\",\"type\":\"link\"},{\"name\":\"Nodes\",\"url\":\"/dashboard/nodes\",\"templateUrl\":\"/components/dashboard/views/listMinions.html\",\"type\":\"link\"},{\"name\":\"Replication Controller\",\"url\":\"/dashboard/replicationcontrollers/:replicationControllerId\",\"templateUrl\":\"/components/dashboard/views/replication.html\",\"type\":\"link\"},{\"name\":\"Service\",\"url\":\"/dashboard/services/:serviceId\",\"templateUrl\":\"/components/dashboard/views/service.html\",\"type\":\"link\"},{\"name\": \"Node\",\"url\": \"/dashboard/nodes/:nodeId\",\"templateUrl\": \"/components/dashboard/views/node.html\",\"type\": \"link\"},{\"name\":\"Explore\",\"url\":\"/dashboard/groups/:grouping*?/selector/:selector*?\",\"templateUrl\":\"/components/dashboard/views/groups.html\",\"type\":\"link\"},{\"name\":\"Pod\",\"url\":\"/dashboard/pods/:podId\",\"templateUrl\":\"/components/dashboard/views/pod.html\",\"type\":\"link\"}]}]},{\"name\":\"Graph\",\"url\":\"/graph\",\"type\":\"link\",\"templateUrl\":\"/components/graph/pages/home.html\"},{\"name\":\"Graph\",\"url\":\"/graph/inspect\",\"type\":\"link\",\"templateUrl\":\"/components/graph/pages/inspect.html\",\"css\":\"/components/graph/css/show-details-table.css\"},{\"name\":\"Graph\",\"type\":\"heading\",\"children\":[{\"name\":\"Graph\",\"type\":\"toggle\",\"url\":\"/graph\",\"templateUrl\":\"/components/graph/pages/home.html\",\"pages\":[{\"name\":\"Test\",\"url\":\"/graph/test\",\"type\":\"link\",\"templateUrl\":\"/components/graph/pages/home.html\"}]}]}]);\n"
  },
  {
    "path": "master/js/app.directive.js",
    "content": "app.directive('includeReplace', function() {\n    'use strict';\n    return {\n      require: 'ngInclude',\n      restrict: 'A', /* optional */\n      link: function(scope, el, attrs) {\n        el.replaceWith(el.children());\n      }\n    };\n  })\n  .directive('compile', ['$compile', function($compile) {\n   'use strict';\n   return function(scope, element, attrs) {\n     scope.$watch(function(scope) { \n      return scope.$eval(attrs.compile);\n    },function(value) {\n      element.html(value);\n      $compile(element.contents())(scope);\n    });\n   };\n  }])\n  .directive('kubernetesUiMenu', function() {\n     'use strict';\n     return {\n       templateUrl: \"views/partials/kubernetes-ui-menu.tmpl.html\"\n     };\n   })\n  .directive('menuToggle', function() {\n    'use strict';\n    return {\n      scope: {\n        section: '='\n      },\n      templateUrl: 'views/partials/menu-toggle.tmpl.html',\n      link: function($scope, $element) {\n        var controller = $element.parent().controller();\n\n        $scope.isOpen = function() { return controller.isOpen($scope.section); };\n        $scope.toggle = function() { controller.toggleOpen($scope.section); };\n\n        var parentNode = $element[0].parentNode.parentNode.parentNode;\n        if (parentNode.classList.contains('parent-list-item')) {\n          var heading = parentNode.querySelector('h2');\n          $element[0].firstChild.setAttribute('aria-describedby', heading.id);\n        }\n      }\n    };\n  });\n\napp.filter('startFrom', function() {\n  'use strict';\n  return function(input, start) { return input.slice(start); };\n})\n.filter('nospace', function() {\n  'use strict';\n  return function(value) { return (!value) ? '' : value.replace(/ /g, ''); };\n});\n"
  },
  {
    "path": "master/js/app.init.js",
    "content": "// APP START\n// ****************************\n// /www/app/assets/app.js is autogenerated. Do not modify.\n// Changes should be made in /master/modules/js or /master/components/<component-name>/js\n// ****************************\n// -----------------------------------\n\nvar app = angular.module('kubernetesApp', [\n  'ngRoute',\n  'ngMaterial',\n  'ngLodash',\n  'door3.css',\n  'kubernetesApp.config',\n  'kubernetesApp.services',\n  'angular.filter'\n].concat(componentNamespaces));\n\napp.factory('menu', [\n  '$location',\n  '$rootScope',\n  'sections',\n  '$route',\n  function($location, $rootScope, sections, $route) {\n\n    var self;\n\n    $rootScope.$on('$locationChangeSuccess', onLocationChange);\n\n    return self = {\n\n      sections: sections,\n\n      setSections: function(_sections) { this.sections = _sections; },\n      selectSection: function(section) { self.openedSection = section; },\n      toggleSelectSection: function(section) {\n        self.openedSection = (self.openedSection === section ? null : section);\n      },\n      isSectionSelected: function(section) { return self.openedSection === section; },\n      selectPage: function(section, page) {\n        self.currentSection = section;\n        self.currentPage = page;\n      },\n      isPageSelected: function(page) { return self.currentPage === page; }\n    };\n\n    function onLocationChange() {\n      var path = $route.current.originalPath;\n\n      var matchPage = function(section, page) {\n        if (path === page.url || path === (page.url + '/')) {\n          self.selectSection(section);\n          self.selectPage(section, page);\n        }\n      };\n\n      sections.forEach(function(section) {\n        if (section.children) {\n          section.children.forEach(function(childSection) {\n            if (childSection.pages) {\n              childSection.pages.forEach(function(page) { matchPage(childSection, page); });\n            }\n          });\n        } else if (section.pages) {\n          section.pages.forEach(function(page) { matchPage(section, page); });\n        } else if (section.type === 'link') {\n          matchPage(section, section);\n        }\n      });\n    }\n  }\n]);\n"
  },
  {
    "path": "master/js/app.preinit.js",
    "content": "var componentNamespaces = [\"kubernetesApp.components.dashboard\"];"
  },
  {
    "path": "master/js/app.run.js",
    "content": "app.run(['$route', angular.noop])\n    .run(['lodash', function(lodash) {\n      // Alias lodash\n      window['_'] = lodash;\n    }]);\n"
  },
  {
    "path": "master/js/app.service.js",
    "content": "app.service('SidebarService', [\n  '$rootScope',\n  function($rootScope) {\n    var service = this;\n    service.sidebarItems = [];\n\n    service.clearSidebarItems = function() { service.sidebarItems = []; };\n\n    service.renderSidebar = function() {\n      var _entries = '';\n      service.sidebarItems.forEach(function(entry) { _entries += entry.Html; });\n\n      if (_entries) {\n        $rootScope.sidenavLeft = '<div layout=\"column\">' + _entries + '</div>';\n      }\n    };\n\n    service.addSidebarItem = function(item) {\n\n      service.sidebarItems.push(item);\n\n      service.sidebarItems.sort(function(a, b) { return (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0); });\n    };\n  }\n]);\n"
  },
  {
    "path": "master/js/app.skeleton.json",
    "content": "{\n  \"appSkeleton\": \"var componentNamespaces = [%s];\"\n}\n"
  },
  {
    "path": "master/js/sections.js",
    "content": "app.constant(\"manifestRoutes\", [{\"description\":\"Dashboard visualization.\",\"url\":\"/dashboard/\",\"templateUrl\":\"components/dashboard/pages/home.html\"},{\"description\":\"Pods\",\"url\":\"/dashboard/pods\",\"templateUrl\":\"components/dashboard/views/listPods.html\"},{\"description\":\"Services\",\"url\":\"/dashboard/services\",\"templateUrl\":\"components/dashboard/views/listServices.html\"},{\"description\":\"Replication Controllers\",\"url\":\"/dashboard/replicationcontrollers\",\"templateUrl\":\"components/dashboard/views/listReplicationControllers.html\"},{\"description\":\"Events\",\"url\":\"/dashboard/events\",\"templateUrl\":\"components/dashboard/views/listEvents.html\"},{\"description\":\"Nodes\",\"url\":\"/dashboard/nodes\",\"templateUrl\":\"components/dashboard/views/listMinions.html\"},{\"description\":\"Replication Controller\",\"url\":\"/dashboard/replicationcontrollers/:namespaceId/:replicationControllerId\",\"templateUrl\":\"components/dashboard/views/replication.html\"},{\"description\":\"Service\",\"url\":\"/dashboard/services/:namespaceId/:serviceId\",\"templateUrl\":\"components/dashboard/views/service.html\"},{\"description\":\"Node\",\"url\":\"/dashboard/nodes/:nodeId\",\"templateUrl\":\"components/dashboard/views/node.html\"},{\"description\":\"Explore\",\"url\":\"/dashboard/groups/:grouping*?/selector/:selector*?\",\"templateUrl\":\"components/dashboard/views/groups.html\"},{\"description\":\"Pod\",\"url\":\"/dashboard/pods/:namespaceId/:podId\",\"templateUrl\":\"components/dashboard/views/pod.html\"}]);\n"
  },
  {
    "path": "master/js/tabs.js",
    "content": "app.value(\"tabs\", [{\"component\":\"dashboard\",\"title\":\"Dashboard\"}]);"
  },
  {
    "path": "master/karma.conf.js",
    "content": "module.exports = function(config) {\n  var configuration = {\n\n    basePath: '../',\n\n    files: [\n      'third_party/ui/bower_components/angular/angular.js',\n      'third_party/ui/bower_components/angular-aria/angular-aria.js',\n      'third_party/ui/bower_components/angular-material/angular-material.js',\n      'third_party/ui/bower_components/angular-mocks/angular-mocks.js',\n      'third_party/ui/bower_components/angular-route/angular-route.js',\n      'third_party/ui/bower_components/angularjs-jasmine-matchers/dist/matchers.js',\n      'third_party/ui/bower_components/hammerjs/hammer.js',\n      'third_party/ui/bower_components/lodash/dist/lodash.js',\n      'app/assets/js/app.js',\n      'app/assets/js/base.js',\n      'app/vendor/**/*.js',\n      'master/test/**/*.js',\n      'master/components/**/test/**/*.js'\n    ],\n\n    autoWatch: true,\n\n    frameworks: ['jasmine'],\n\n    browsers: ['Chrome'],\n\n    reporters: ['progress', 'junit'],\n\n    customLaunchers: {\n      Chrome_travis: {\n        base: 'Chrome',\n        flags: ['--no-sandbox']\n      }\n    },\n\n    plugins: [\n      'karma-chrome-launcher',\n      'karma-jasmine',\n      'karma-junit-reporter',\n      'karma-story-reporter',\n    ],\n\n    junitReporter: {outputFile: 'test_out/unit.xml', suite: 'unit'}\n\n  };\n\n  if (process.env.TRAVIS) {\n    configuration.browsers = ['Chrome_travis'];\n  }\n\n  config.set(configuration);\n};\n"
  },
  {
    "path": "master/less/app/base.less",
    "content": ".nav-back {\n  width: 80px;\n  font-size: 14px;\n  padding-left: 14px;\n  line-height: 15px;\n}\n\n.nav-back {\n  /* :before */\n  /* content: \"\"; */\n  // background: url('../img/arrow-back.png');\n  background-size: 14px 14px;\n  background-repeat: no-repeat;\n  display: block;\n}\n\na {\n  text-decoration: none;\n}\n\n.main-fab {\n  position:absolute;\n  z-index:20;\n  font-size:30px;\n  top:100px;\n  left:24px;\n  transform:scale(.88,.88);\n}\n\n.md-breadcrumb {\n  padding-left:16px;\n}\n\n.md-table {\n  min-width: 100%;\n  border-collapse: collapse;\n}\n\n.md-table tbody tr:hover, .md-table tbody tr:focus {\n  cursor:pointer;\n  background-color:rgba(63,81,181,0.2);\n}\n\n.md-table-header {\n  border-bottom: 1px solid rgb(230,230,230);\n  color: rgb(130,130,130);\n  text-align: left;\n  font-size: 0.75em;\n  font-weight: 700;\n  padding: 16px 16px 16px 0;\n}\n\n.md-table-header a {\n  text-decoration: none;\n  color: inherit;\n}\n\n.md-table-caret {\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.md-table-content {\n  font-size: 0.8em;\n  padding: 16px 16px 16px 0;\n  height: 72px;\n}\n\n.md-table-td-more {\n  max-width:72px;\n  width:72px;\n  padding:16px;\n}\n\n.md-table-thumbs {\n  max-width: 104px;\n  width: 104px;\n  padding: 16px 32px;\n}\n\n.md-table-thumbs div {\n  overflow:hidden;\n  width: 40px;\n  height:40px;\n  border-radius:20px;\n  border: 1px solid rgba(0,0,0,0.2);\n  background-size:cover;\n  box-shadow: 0 8px 10px rgba(0,0,0,.3);\n  -webkit-box-shadow: 0 8px 10px rgba(0,0,0,.1);\n}\n\n.md-table-footer {\n  height:40px;\n}\n\n.md-table-count-info {\n  line-height:40px;\n  font-size:.75em;\n}\n\n.md-table-footer-item {\n  width: 40px;\n  height: 40px;\n  vertical-align:middle;\n}\n\n.md-table-active-page {\n  font-weight: 700;\n}\n\n.bold {\n  font-weight: 700;\n}\n\n.grey, .gray {\n  color: #888888;\n}\n\nmd-input-container.md-default-theme .md-input {\n  color: white;\n  border-color: white;\n  margin-top: 24px;\n}\n\n.dashboard-subnav {\n  font-size: 0.9em;\n  min-height: 38px;\n  max-height: 38px;\n  background-color: #09c1d1 !important;\n\n\n  // Right Views select list\n  md-select.md-default-theme:focus .md-select-label {\n    border-bottom: none;\n    color: white;\n  }\n}\n\n.selectSubPages p {\n  text-align: center;\n  color: #fff;\n}\n\n.selectSubPages .md-default-theme .md-select-label.md-placeholder {\n  color: #fff;\n}\n\n.selectSubPages .md-select-label {\n  padding-top: 0px;\n  font-size: 1em;\n  line-height: 1em;\n  border-bottom: none;\n  padding-bottom: 0px;\n}\n\n.selectSubPages md-select {\n  margin-top: 10px;\n  margin-right: 80px;\n  padding: 0px;\n}\n\nmd-select-menu {\n  // min-height: 400px;\n  max-height: none;\n}\n\n.md-toolbar-tools {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n\n.md-toolbar-small {\n  height: 38px;\n  min-height: 38px;\n}\n\n.md-toolbar-tools-small {\n  background-color: #09c1d1;\n}\n\n/* Begin kubernetes-ui Menu */\n.kubernetes-ui-menu,\n.kubernetes-ui-menu ul {\n  list-style: none;\n  padding: 0;\n}\n.kubernetes-ui-menu li {\n  margin: 0;\n}\n.kubernetes-ui-menu > li {\n  border-top: 1px solid rgba(0, 0, 0, 0.12);\n}\n.kubernetes-ui-menu .md-button {\n  border-radius: 0;\n  color: inherit;\n  cursor: pointer;\n  font-weight: 400;\n  line-height: 40px;\n  margin: 0;\n  max-height: 40px;\n  overflow: hidden;\n  padding: 0px 16px;\n  text-align: left;\n  text-decoration: none;\n  white-space: normal;\n  width: 100%;\n}\n.kubernetes-ui-menu a.md-button {\n  display: block;\n}\n.kubernetes-ui-menu button.md-button::-moz-focus-inner {\n  padding: 0;\n}\n.kubernetes-ui-menu .md-button.active {\n  color: #03a9f4;\n}\n.menu-heading {\n  color: #888;\n  display: block;\n  font-size: inherit;\n  font-weight: 500;\n  line-height: 40px;\n  margin: 0;\n  padding: 0px 16px;\n  text-align: left;\n  width: 100%;\n}\n.kubernetes-ui-menu li.parentActive,\n.kubernetes-ui-menu li.parentActive .menu-toggle-list {\n  background-color: #f6f6f6;\n}\n.menu-toggle-list {\n  background: #fff;\n  max-height: 999px;\n  overflow: hidden;\n  position: relative;\n  z-index: 1;\n  -webkit-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1);\n  -webkit-transition-property: max-height;\n  -moz-transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1);\n  -moz-transition-property: max-height;\n  transition: 0.75s cubic-bezier(0.35, 0, 0.25, 1);\n  transition-property: max-height;\n}\n.menu-toggle-list.ng-hide {\n  max-height: 0;\n}\n.kubernetes-ui-menu .menu-toggle-list a.md-button {\n  display: block;\n  padding: 0 16px 0 32px;\n  text-transform: none;\n}\n.md-button-toggle .md-toggle-icon {\n  background: transparent url(../img/icons/list_control_down.png) no-repeat center center;\n  background-size: 100% auto;\n  display: inline-block;\n  height: 24px;\n  margin: auto 0 auto auto;\n  speak: none;\n  width: 24px;\n  transition: transform 0.3s ease-in-out;\n  -webkit-transition: -webkit-transform 0.3s ease-in-out;\n}\n.md-button-toggle .md-toggle-icon.toggled {\n  transform: rotate(180deg);\n  -webkit-transform: rotate(180deg);\n}\n/* End kubernetes-ui Menu */\n\n\n\n.menu-icon {\n  background: none;\n  border: none;\n  margin-right: 16px;\n  padding: 0;\n}\n\n.whiteframedemoBasicUsage md-whiteframe {\n  background: #fff;\n  margin: 2px;\n  padding: 2px;\n}\n\n.tabsDefaultTabs {\n  height: 100%;\n  width: 100%;\n  /*\n   * Animation styles\n   */\n}\n\n.tabsDefaultTabs .remove-tab {\n  margin-bottom: 40px;\n}\n.tabsDefaultTabs .home-buttons {\n  .md-button {\n    display: block;\n    max-height: 30px;\n  }\n  .md-button.add-tab {\n    margin-top: 20px;\n    max-height: 30px !important;\n  }\n}\n.tabsDefaultTabs .demo-tab {\n  display: block;\n  position: relative;\n  background: white;\n  border: 0px solid black;\n  min-height: 0px;\n  width: 100%;\n}\n\n.tabsDefaultTabs .tab0, .tabsDefaultTabs .tab1, .tabsDefaultTabs .tab2, .tabsDefaultTabs .tab3 {\n  background-color: #bbdefb;\n}\n.tabsDefaultTabs .md-header {\n  background-color: #1976D2 !important;\n}\n.tabsDefaultTabs md-tab {\n  color: #90caf9 !important;\n}\n.tabsDefaultTabs md-tab.active, .tabsDefaultTabs md-tab:focus {\n  color: white !important;\n}\n.tabsDefaultTabs md-tab[disabled] {\n  opacity: 0.5;\n}\n.tabsDefaultTabs .md-header .md-ripple {\n  border-color: #FFFF8D !important;\n}\n.tabsDefaultTabs md-tabs-ink-bar {\n  background-color: #FFFF8D !important;\n}\n.tabsDefaultTabs .title {\n  padding-top: 8px;\n  padding-right: 8px;\n  text-align: left;\n  text-transform: uppercase;\n  color: #888;\n  margin-top: 24px;\n}\n.tabsDefaultTabs [layout-align] > * {\n  margin-left: 8px;\n}\n.tabsDefaultTabs form > [layout] > * {\n  margin-left: 8px;\n}\n.tabsDefaultTabs .long > input {\n  width: 264px;\n}\n\n.menuBtn {\n  background-color: transparent;\n  border: none;\n  height: 38px;\n  margin: 16px;\n  position: absolute;\n  width: 36px;\n}\nmd-toolbar h1 {\n  font-size: 1.250em;\n  font-weight: 400;\n  margin: auto;\n}\nmd-list .md-button {\n  color: inherit;\n  font-weight: 500;\n  text-align: left;\n  width: 100%;\n}\n.visuallyhidden {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\nmd-list .md-button {\n  color: inherit;\n  font-weight: 500;\n  text-align: left;\n  width: 100%;\n}\nmd-list .md-button.selected {\n  color: #03a9f4;\n}\n\n#content {\n  overflow: hidden;\n}\n#content md-content {\n  padding-left: 0px;\n  padding-right: 0px;\n  padding-top: 0px;\n}\n#content .md-button.action {\n  background-color: transparent;\n  border: none;\n  height: 38px;\n  margin: 8px auto 16px 0;\n  position: absolute;\n  top: 10px;\n  right: 25px;\n  width: 36px;\n}\n\n#content img {\n  display: block;\n  height: auto;\n  max-width: 500px;\n}\n\n.content-wrapper {\n  position: relative;\n}\n\n.visuallyhidden {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\nmd-toolbar h1 {\n  font-size: 1.250em;\n  font-weight: 400;\n}\n\n.menuBtn {\n  background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGcgaWQ9IkhlYWRlciI+CiAgICA8Zz4KICAgICAgICA8cmVjdCB4PSItNjE4IiB5PSItMjIzMiIgZmlsbD0ibm9uZSIgd2lkdGg9IjE0MDAiIGhlaWdodD0iMzYwMCIvPgogICAgPC9nPgo8L2c+CjxnIGlkPSJMYWJlbCI+CjwvZz4KPGcgaWQ9Ikljb24iPgogICAgPGc+CiAgICAgICAgPHJlY3QgZmlsbD0ibm9uZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+CiAgICAgICAgPHBhdGggZD0iTTMsMThoMTh2LTJIM1YxOHogTTMsMTNoMTh2LTJIM1YxM3ogTTMsNnYyaDE4VjZIM3oiIHN0eWxlPSJmaWxsOiNmM2YzZjM7Ii8+CiAgICA8L2c+CjwvZz4KPGcgaWQ9IkdyaWQiIGRpc3BsYXk9Im5vbmUiPgogICAgPGcgZGlzcGxheT0iaW5saW5lIj4KICAgIDwvZz4KPC9nPgo8L3N2Zz4=) no-repeat  center center;\n}\n\n.actionBtn {\n  background: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgdmlld0JveD0iMCAwIDM2IDM2Ij4NCiAgICA8cGF0aCBkPSJNMCAwaDM2djM2aC0zNnoiIGZpbGw9Im5vbmUiLz4NCiAgICA8cGF0aCBkPSJNNCAyN2gyOHYtM2gtMjh2M3ptMC04aDI4di0zaC0yOHYzem0wLTExdjNoMjh2LTNoLTI4eiIvPg0KPC9zdmc+) no-repeat  center center;\n}\n\n.kubernetes-ui-logo {\n  background-image: url(\"../img/kubernetes.svg\");\n  background-size: 40px 40px;\n  width: 40px;\n  height: 40px;\n}\n.kubernetes-ui-text {\n  line-height: 40px; vertical-align: middle;\n  padding: 2px;\n}\n\nmd-select-menu.md-default-theme md-option:focus:not([selected]) {\n  background: rgb(238,238,238);\n}\nmd-select-menu {\n  md-option {\n\n    &:not([disabled]):hover, &:not([disabled]):focus {\n      background-color: rgba(158,158,158,0.2);\n      // background: transparent;\n    }\n\n    transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n\n  }\n}\n"
  },
  {
    "path": "master/package.json",
    "content": "{\n  \"name\": \"kubernetes-ui\",\n  \"description\": \"UI for Kubernetes\",\n  \"version\": \"0.3.0\",\n  \"repository\": \"https://github.com/kubernetes-ui/kubernetes-ui\",\n  \"license\": \"Apache\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"bower\": \"^1.3.1\",\n    \"change-case\": \"^2.2.0\",\n    \"del\": \"^1.1.1\",\n    \"gulp\": \"^3.8.10\",\n    \"gulp-angular-htmlify\": \"^0.4.0\",\n    \"gulp-callback\": \"^0.0.3\",\n    \"gulp-changed\": \"^1.1.0\",\n    \"gulp-concat\": \"^2.4.1\",\n    \"gulp-debug\": \"^2.0.1\",\n    \"gulp-expect-file\": \"0.0.7\",\n    \"gulp-filter\": \"^1.0.2\",\n    \"gulp-foreach\": \"^0.1.0\",\n    \"gulp-html-prettify\": \"0.0.1\",\n    \"gulp-ignore\": \"^1.2.1\",\n    \"gulp-inject\": \"^1.1.1\",\n    \"gulp-jsoncombine\": \"^1.0.2\",\n    \"gulp-less\": \"^1.3.9\",\n    \"gulp-livereload\": \"^2.1.1\",\n    \"gulp-minify-css\": \"^0.3.11\",\n    \"gulp-ng-annotate\": \"^0.4.3\",\n    \"gulp-ng-constant\": \"^0.3.0\",\n    \"gulp-rename\": \"^1.2.0\",\n    \"gulp-sourcemaps\": \"^1.3.0\",\n    \"gulp-sync\": \"^0.1.4\",\n    \"gulp-tag-version\": \"1.2.1\",\n    \"gulp-uglify\": \"^1.0.2\",\n    \"gulp-util\": \"^3.0.1\",\n    \"gulp-w3cjs\": \"^0.2.1\",\n    \"http-server\": \"^0.8.0\",\n    \"karma\": \"^0.10.10\",\n    \"karma-chrome-launcher\": \"^0.1.12\",\n    \"karma-jasmine\": \"^0.1.6\",\n    \"karma-junit-reporter\": \"^0.3.4\",\n    \"karma-story-reporter\": \"^0.3.1\",\n    \"shelljs\": \"^0.2.6\",\n    \"through2\": \"^0.6.3\",\n    \"yargs\": \"~1.3.2\"\n  },\n  \"scripts\": {\n    \"prestart\": \"bower install\",\n    \"start\": \"npm install\",\n    \"poststart\": \"gulp\",\n    \"prebuild\": \"bower install --allow-root --config.interactive=false\",\n    \"build\": \"npm install\",\n    \"postbuild\": \"gulp build\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^3.3.0\"\n  }\n}\n"
  },
  {
    "path": "master/protractor/.gitkeep",
    "content": ""
  },
  {
    "path": "master/protractor/chrome/.gitkeep",
    "content": ""
  },
  {
    "path": "master/protractor/chrome/smoke.spec.js",
    "content": "describe('Kubernetes UI Chome', function() {\n  it('should have all the expected tabs loaded', function() {\n    browser.get('http://localhost:8000');\n    expect(browser.getTitle()).toEqual('Kubernetes UI');\n\n    // Navigate to the graph page.\n    var dashboardTab = element(by.id('tab_001'));\n    expect(dashboardTab).toBeDefined();\n    dashboardTab.click();\n    expect(browser.getLocationAbsUrl()).toBe('/dashboard/');\n\n    // var graphTab = element(by.id('tab_002'));\n    // expect(graphTab).toBeDefined();\n    // graphTab.click();\n    // expect(browser.getLocationAbsUrl()).toBe('/graph/');\n  });\n});\n"
  },
  {
    "path": "master/protractor/conf.js",
    "content": "exports.config = {\n  specs: [\n    'chrome/**/*.js',\n    '../components/**/protractor/*.js'\n  ],\n\n   capabilities: {\n       browserName: 'chrome'\n  }\n};\n"
  },
  {
    "path": "master/shared/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "master/shared/config/development.example.json",
    "content": "{\n  \"k8sApiServer\": \"/api/v1\",\n  \"k8sDataService\": \"/cluster-insight\",\n  \"k8sDataServicePortName\": \":cluster-insight\",\n  \"k8sDataServiceEndpoint\": \"/cluster\",\n  \"k8sDataPollMinIntervalSec\": 10,\n  \"k8sDataPollMaxIntervalSec\": 120,\n  \"k8sDataPollErrorThreshold\": 5,\n  \"cAdvisorProxy\": \"\",\n  \"cAdvisorPort\": \"4194\"\n}\n"
  },
  {
    "path": "master/shared/config/generated-config.js",
    "content": "angular.module(\"kubernetesApp.config\", [])\n\n.constant(\"ENV\", {\n\t\"/\": {\n\t\t\"k8sApiServer\": \"/api/v1\",\n\t\t\"k8sDataService\": \"/cluster-insight\",\n\t\t\"k8sDataServicePortName\": \":cluster-insight\",\n\t\t\"k8sDataServiceEndpoint\": \"/cluster\",\n\t\t\"k8sDataPollMinIntervalSec\": 10,\n\t\t\"k8sDataPollMaxIntervalSec\": 120,\n\t\t\"k8sDataPollErrorThreshold\": 5,\n\t\t\"cAdvisorProxy\": \"\",\n\t\t\"cAdvisorPort\": \"4194\"\n\t}\n})\n\n.constant(\"ngConstant\", true)\n\n;"
  },
  {
    "path": "master/shared/config/production.json",
    "content": "{\n  \"k8sApiServer\": \"/api/v1\",\n  \"k8sDataService\": \"/cluster-insight\",\n  \"k8sDataServicePortName\": \":cluster-insight\",\n  \"k8sDataServiceEndpoint\": \"/cluster\",\n  \"k8sDataPollMinIntervalSec\": 10,\n  \"k8sDataPollMaxIntervalSec\": 120,\n  \"k8sDataPollErrorThreshold\": 5,\n  \"cAdvisorProxy\": \"\",\n  \"cAdvisorPort\": \"4194\"\n}\n"
  },
  {
    "path": "master/shared/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" ng-app=\"kubernetesApp\" ng-strict-di>\n<head>\n  <title>Kubernetes UI</title>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\" />\n  <link rel=\"stylesheet\" href=\"vendor/angular-material/angular-material.css\">\n  <link rel=\"stylesheet\" href=\"assets/css/app.css\" >\n  <link rel=\"shortcut icon\" href=\"assets/img/icons/favicon.png\" type=\"image/vnd.microsoft.icon\" />\n</head>\n<body layout=\"row\" ng-controller=\"PageCtrl\">\n  <md-sidenav layout=\"column\"\n              md-is-locked-open=\"shouldLockOpen()\"\n              style=\"overflow: hidden; display: flex;\"\n              class=\"site-sidenav md-sidenav-left md-whiteframe-z2\"\n              md-component-id=\"left\"\n              md-closed>\n    <md-toolbar>\n      <h1 class=\"md-toolbar-tools\">\n        <a ng-href=\"#/dashboard\" layout=\"row\" flex>\n          <span class=\"kubernetes-ui-logo\"></span>\n          <div style=\"line-height:40px; text-indent: 15px;\">Kubernetes</div>\n        </a>\n      </h1>\n    </md-toolbar>\n    <md-content flex>\n    <div kubernetes-ui-menu role=\"kubernetes-ui-menu\"></div>\n      <div compile=\"sidenavLeft\"></div>\n    </md-content>\n  </md-sidenav>\n  <div layout=\"column\" layout-fill tabIndex=\"-1\" role=\"main\" flex>\n    <md-toolbar>\n      <div class=\"md-toolbar-tools\">\n      <h1 class=\"md-toolbar-tools\">\n        <a ng-href=\"#/dashboard\" layout=\"row\" flex>\n          <span class=\"kubernetes-ui-logo\"></span>\n          <div style=\"line-height:40px; text-indent: 15px;\">Kubernetes</div>\n        </a>\n      </h1>\n      </div>\n    </md-toolbar>\n    <md-content md-scroll-y flex>\n    <md-whiteframe layout layout-align=\"center center\">\n      <div ng-controller=\"TabCtrl\" class=\"tabsDefaultTabs\">\n        <md-tabs md-selected=\"0\">\n          <md-tab ng-repeat=\"tab in tabs\" md-on-select=\"switchTab($index)\" label=\"{{tab.title}}\">\n            <div class=\"demo-tab tab{{$index%4}}\" layout=\"column\" layout-fill></div>\n          </md-tab>\n        </md-tabs>\n        <div ng-view layout=\"column\" layout-fill role=\"main\"></div>\n      </div>\n    </md-whiteframe>\n    </md-content>\n  </div>\n  <script src=\"assets/js/base.js\"></script>\n  <script src=\"assets/js/app.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "master/shared/js/modules/config.js",
    "content": "/**=========================================================\n * Module: config.js\n * App routes and resources configuration\n =========================================================*/"
  },
  {
    "path": "master/shared/js/modules/constants.js",
    "content": "/**=========================================================\n * Module: constants.js\n * Define constants to inject across the application\n =========================================================*/"
  },
  {
    "path": "master/shared/js/modules/controllers/home-page.js",
    "content": "/**=========================================================\n * Module: home-page.js\n * Page Controller\n =========================================================*/\n\napp.controller('PageCtrl', [\n  '$scope',\n  '$timeout',\n  '$mdSidenav',\n  'menu',\n  '$rootScope',\n  function($scope, $timeout, $mdSidenav, menu, $rootScope) {\n  $scope.menu = menu;\n\n  $scope.path = path;\n  $scope.goHome = goHome;\n  $scope.openMenu = openMenu;\n  $rootScope.openMenu = openMenu;\n  $scope.closeMenu = closeMenu;\n  $scope.isSectionSelected = isSectionSelected;\n\n  $rootScope.$on('$locationChangeSuccess', openPage);\n\n  // Methods used by menuLink and menuToggle directives\n  this.isOpen = isOpen;\n  this.isSelected = isSelected;\n  this.toggleOpen = toggleOpen;\n  this.shouldLockOpen = shouldLockOpen;\n  $scope.toggleKubernetesUiMenu = toggleKubernetesUiMenu;\n\n  var mainContentArea = document.querySelector(\"[role='main']\");\n  var kubernetesUiMenu = document.querySelector(\"[role='kubernetes-ui-menu']\");\n\n  // *********************\n  // Internal methods\n  // *********************\n\n  var _t = false;\n\n  $scope.showKubernetesUiMenu = false;\n\n  function shouldLockOpen() {\n    return _t;\n  }\n\n  function toggleKubernetesUiMenu() {\n    $scope.showKubernetesUiMenu = !$scope.showKubernetesUiMenu;\n  }\n\n  function closeMenu() {\n    $timeout(function() {\n      $mdSidenav('left').close();\n    });\n  }\n\n  function openMenu() {\n    $timeout(function() {\n      _t = !$mdSidenav('left').isOpen();\n      $mdSidenav('left').toggle();\n    });\n  }\n\n  function path() {\n    return $location.path();\n  }\n\n  function goHome($event) {\n    menu.selectPage(null, null);\n    $location.path( '/' );\n  }\n\n  function openPage() {\n    $scope.closeMenu();\n    mainContentArea.focus();\n  }\n\n  function isSelected(page) {\n    return menu.isPageSelected(page);\n  }\n\n  function isSectionSelected(section) {\n    var selected = false;\n    var openedSection = menu.openedSection;\n    if(openedSection === section){\n      selected = true;\n    }\n    else if(section.children) {\n      section.children.forEach(function(childSection) {\n        if(childSection === openedSection){\n          selected = true;\n        }\n      });\n    }\n    return selected;\n  }\n\n  function isOpen(section) {\n    return menu.isSectionSelected(section);\n  }\n\n  function toggleOpen(section) {\n    menu.toggleSelectSection(section);\n  }\n\n  }\n]).filter('humanizeDoc', function() {\n  return function(doc) {\n    if (!doc) return;\n    if (doc.type === 'directive') {\n      return doc.name.replace(/([A-Z])/g, function($1) {\n        return '-'+$1.toLowerCase();\n      });\n    }\n    return doc.label || doc.name;\n  }; });\n"
  },
  {
    "path": "master/shared/js/modules/controllers/main.js",
    "content": "/**=========================================================\n * Module: main.js\n * Main Application Controller\n =========================================================*/"
  },
  {
    "path": "master/shared/js/modules/controllers/tabs-global.js",
    "content": "/**=========================================================\n * Module: tabs-global.js\n * Page Controller\n =========================================================*/\n\napp.controller('TabCtrl', [\n  '$scope',\n  '$location',\n  'tabs',\n  function($scope, $location, tabs) {\n    $scope.tabs = tabs;\n\n    $scope.switchTab = function(index) {\n      var location_path = $location.path();\n      var tab = tabs[index];\n\n      if (tab) {\n        var path = '/%s'.format(tab.component);\n        if (location_path.indexOf(path) == -1) {\n          $location.path(path);\n        }\n      }\n    };\n  }\n]);\n"
  },
  {
    "path": "master/shared/js/modules/directives/sidebar.js",
    "content": "/**=========================================================\n * Module: sidebar.js\n * Wraps the sidebar and handles collapsed state\n =========================================================*/"
  },
  {
    "path": "master/shared/js/modules/services/cAdvisor.js",
    "content": "(function() {\n  \"use strict\";\n\n  angular.module('kubernetesApp.services')\n      .service('cAdvisorService', function($http, $q, ENV, k8sApi) {\n        var _baseUrl = function(minionIp) {\n          var minionPort = ENV['/']['cAdvisorPort'] || \"8081\";\n          var proxy = ENV['/']['cAdvisorProxy'] || (k8sApi.getUrlBase() + \"/proxy/nodes/\");\n\n          return proxy + minionIp + ':' + minionPort + '/api/v1.0/';\n        };\n\n        this.getMachineInfo = getMachineInfo;\n\n        function getMachineInfo(minionIp) {\n          var fullUrl = _baseUrl(minionIp) + 'machine';\n          var deferred = $q.defer();\n\n          // hack\n          $http.get(fullUrl).success(function(data) {\n            deferred.resolve(data);\n          }).error(function(data, status) { deferred.reject('There was an error') });\n          return deferred.promise;\n        }\n\n        this.getContainerInfo = getContainerInfo;\n        // containerId optional\n        function getContainerInfo(minionIp, containerId) {\n          containerId = (typeof containerId === \"undefined\") ? \"/\" : containerId;\n\n          var fullUrl = _baseUrl(minionIp) + 'containers' + containerId;\n          var deferred = $q.defer();\n\n          var request = {\n            \"num_stats\": 10,\n            \"num_samples\": 0\n          };\n\n          $http.post(fullUrl, request)\n              .success(function(data) { deferred.resolve(data); })\n              .error(function() { deferred.reject('There was an error') });\n          return deferred.promise;\n        }\n\n        this.getDataForMinion = function(minionIp, isAvailable) {\n          var machineData, containerData;\n          var deferred = $q.defer();\n\n          if(isAvailable) {\n            var p = $q.all([getMachineInfo(minionIp), getContainerInfo(minionIp)])\n                        .then(\n                            function(dataArray) {\n                              machineData = dataArray[0];\n                              containerData = dataArray[1];\n\n                              var memoryData = parseMemory(machineData, containerData);\n                              var cpuData = parseCpu(machineData, containerData);\n                              var fsData = parseFilesystems(machineData, containerData);\n                              deferred.resolve({\n                                memoryData: memoryData,\n                                cpuData: cpuData,\n                                filesystemData: fsData,\n                                machineData: machineData,\n                                containerData: containerData\n                              });\n\n                            },\n                            function(errorData) { deferred.reject(errorData); });\n\n\n          } else {\n            deferred.resolve({\n              memoryData: {\n                current: {\n                    memoryUsage: 0, workingMemoryUsage: 0, memoryLimit: 1.0, memoryUsageDescription: \"-\", memoryLimitDescription: \"-\"\n                },\n                historical: {}\n              },\n              cpuData: { cpuPercentUsage: '' },\n              filesystemData: [],\n              machineData: {},\n              containerData: {}\n            });\n          }\n          return deferred.promise;\n        };\n\n        // Utils to process cadvisor data\n        function humanize(num, size, units) {\n          var unit;\n          for (unit = units.pop(); units.length && num >= size; unit = units.pop()) {\n            num /= size;\n          }\n          return [num, unit];\n        }\n\n        // Following the IEC naming convention\n        function humanizeIEC(num) {\n          var ret = humanize(num, 1024, [\"TiB\", \"GiB\", \"MiB\", \"KiB\", \"Bytes\"]);\n          return ret[0].toFixed(2) + \" \" + ret[1];\n        }\n\n        // Following the Metric naming convention\n        function humanizeMetric(num) {\n          var ret = humanize(num, 1000, [\"TB\", \"GB\", \"MB\", \"KB\", \"Bytes\"]);\n          return ret[0].toFixed(2) + \" \" + ret[1];\n        }\n\n        function hasResource(stats, resource) { return stats.stats.length > 0 && stats.stats[0][resource]; }\n\n        // Gets the length of the interval in nanoseconds.\n        function getInterval(current, previous) {\n          var cur = new Date(current);\n          var prev = new Date(previous);\n\n          // ms -> ns.\n          return (cur.getTime() - prev.getTime()) * 1000000;\n        }\n\n        function parseCpu(machineInfo, containerInfo) {\n          var cur = containerInfo.stats[containerInfo.stats.length - 1];\n          var results = [];\n\n          var cpuUsage = 0;\n          if (containerInfo.spec.has_cpu && containerInfo.stats.length >= 2) {\n            var prev = containerInfo.stats[containerInfo.stats.length - 2];\n            var rawUsage = cur.cpu.usage.total - prev.cpu.usage.total;\n            var intervalInNs = getInterval(cur.timestamp, prev.timestamp);\n\n            // Convert to millicores and take the percentage\n            cpuUsage = Math.round(((rawUsage / intervalInNs) / machineInfo.num_cores) * 100);\n            if (cpuUsage > 100) {\n              cpuUsage = 100;\n            }\n          }\n\n          return {\n            cpuPercentUsage: cpuUsage\n          };\n        }\n\n        function parseFilesystems(machineInfo, containerInfo) {\n          var cur = containerInfo.stats[containerInfo.stats.length - 1];\n          if (!cur.filesystem) {\n            return;\n          }\n\n          var filesystemData = [];\n          for (var i = 0; i < cur.filesystem.length; i++) {\n            var data = cur.filesystem[i];\n            var totalUsage = Math.floor((data.usage * 100.0) / data.capacity);\n\n            var f = {\n              device: data.device,\n              filesystemNumber: i + 1,\n              usage: data.usage,\n              usageDescription: humanizeMetric(data.usage),\n              capacity: data.capacity,\n              capacityDescription: humanizeMetric(data.capacity),\n              totalUsage: Math.floor((data.usage * 100.0) / data.capacity)\n            };\n\n            filesystemData.push(f);\n          }\n          return filesystemData;\n        }\n\n        var oneMegabyte = 1024 * 1024;\n        var oneGigabyte = 1024 * oneMegabyte;\n\n        function parseMemory(machineInfo, containerInfo) {\n          if (containerInfo.spec.has_memory && !hasResource(containerInfo, \"memory\")) {\n            return;\n          }\n\n          // var titles = [\"Time\", \"Total\", \"Hot\"];\n          var data = [];\n          for (var i = 0; i < containerInfo.stats.length; i++) {\n            var cur = containerInfo.stats[i];\n\n            var elements = [];\n            elements.push(cur.timestamp);\n            elements.push(cur.memory.usage / oneMegabyte);\n            elements.push(cur.memory.working_set / oneMegabyte);\n            data.push(elements);\n          }\n\n          // Get the memory limit, saturate to the machine size.\n          var memory_limit = machineInfo.memory_capacity;\n          if (containerInfo.spec.memory.limit && (containerInfo.spec.memory.limit < memory_limit)) {\n            memory_limit = containerInfo.spec.memory.limit;\n          }\n\n          var cur = containerInfo.stats[containerInfo.stats.length - 1];\n\n          var r = {\n            current: {\n              memoryUsage: cur.memory.usage,\n              workingMemoryUsage: cur.memory.working_set,\n              memoryLimit: memory_limit,\n              memoryUsageDescription: humanizeMetric(cur.memory.usage),\n              workingMemoryUsageDescription: humanizeMetric(cur.memory.working_set),\n              memoryLimitDescription: humanizeMetric(memory_limit)\n            },\n            historical: data\n          };\n\n          return r;\n        }\n      });\n})();\n"
  },
  {
    "path": "master/shared/js/modules/services/k8sApiService.js",
    "content": "(function() {\n  \"use strict\";\n\n  angular.module('kubernetesApp.services')\n    .provider('k8sApi',\n             function() {\n\n               var urlBase = '';\n               var _namespace = undefined;\n\n               this.setUrlBase = function(value) { urlBase = value; };\n\n               this.setNamespace = function(value) { _namespace = value; };\n               this.getNamespace = function() { return _namespace; };\n\n               var _get = function($http, baseUrl, query) {\n                 var _fullUrl = baseUrl;\n\n                 if (query !== undefined) {\n                   _fullUrl += '/' + query;\n                 }\n\n                 return $http.get(_fullUrl);\n               };\n\n               this.$get = function($http, $q) {\n                 var api = {};\n\n                 api.getUrlBase = function() { return urlBase; };\n\n                 api.getNamespacedUrlBase = function(namespace) {\n                   var ns = namespace || _namespace;\n                   return ns ?\n                       urlBase + '/namespaces/' + ns :\n                       urlBase;\n                 };\n\n                 api.getPods = function(query, namespace) { return _get($http, api.getNamespacedUrlBase(namespace) + '/pods', query); };\n\n                 api.getNodes = function(query) { return _get($http, urlBase + '/nodes', query); };\n\n                 api.getMinions = api.getNodes;\n\n                 api.getServices = function(query, namespace) { return _get($http, api.getNamespacedUrlBase(namespace) + '/services', query); };\n\n                 api.getReplicationControllers = function(query, namespace) {\n                   return _get($http, api.getNamespacedUrlBase(namespace) + '/replicationcontrollers', query);\n                 };\n\n                 api.getEvents = function(query) { return _get($http, api.getNamespacedUrlBase() + '/events', query); };\n\n                 return api;\n               };\n             })\n    .config(function(k8sApiProvider, ENV) {\n      if (ENV && ENV['/'] && ENV['/']['k8sApiServer']) {\n        var base = ENV['/']['k8sApiServer']\n\n        if (base[0] == '/') {\n          // try to find the k8sApiServer location in the current path, falling\n          // back to <k8sApiServer> if not found:\n          // e.g.: /some/prefix/api/v1/proxy/.../kube-ui => /some/prefix/api/v1\n          //       /kube-ui                              => /api/v1\n          //       /a/api/v1/b/api/v1/.../kube-ui        => /a/api/v1/b/api/v1\n          var i = window.location.pathname.lastIndexOf(base)\n          if (i != -1) {\n            base = window.location.pathname.substr(0, i + base.length)\n          }\n        }\n\n        k8sApiProvider.setUrlBase(base);\n      }\n    });\n})();\n"
  },
  {
    "path": "master/shared/js/modules/services/pollK8sData.js",
    "content": "(function() {\n  \"use strict\";\n\n  var pollK8sDataServiceProvider = function PollK8sDataServiceProvider(_) {\n    // A set of configuration controlling the polling behavior.\n    // Their values should be configured in the application before\n    // creating the service instance.\n\n    var useSampleData = false;\n    this.setUseSampleData = function(value) { useSampleData = value; };\n\n    var sampleDataFiles = [];\n    this.setSampleDataFiles = function(value) { sampleDataFiles = value; };\n\n    var proxyVerb = \"/api/v1/proxy/namespaces/default/services\";\n\n    var dataService = undefined;\n    var dataServiceDefault = \"/cluster-insight\";\n\n    this.setDataService = function(value) { dataService = value; };\n    this.getDataService = function() { return dataService || dataServiceDefault; }\n    var getDataService = this.getDataService;\n\n    var dataServicePortName = undefined;\n    var dataServicePortNameDefault = \":cluster-insight\";\n\n    this.setDataServicePortName = function(value) { dataServicePortName = value; };\n    this.getDataServicePortName = function() { return dataServicePortName || dataServicePortNameDefault; }\n    var getDataServicePortName = this.getDataServicePortName;\n\n    var dataServiceEndpoint = undefined;\n    var dataServiceEndpointDefault = \"/cluster\";\n\n    this.setDataServiceEndpoint = function(value) { dataServiceEndpoint = value; };\n    this.getDataServiceEndpoint = function() { return dataServiceEndpoint || dataServiceEndpointDefault; }\n    var getDataServiceEndpoint = this.getDataServiceEndpoint;\n\n    var pollMinIntervalSec = undefined;\n    var pollMinIntervalSecDefault = 10;\n\n    this.setPollMinIntervalSec = function(value) { pollMinIntervalSec = value; };\n    this.getPollMinIntervalSec = function() { return pollMinIntervalSec || pollMinIntervalSecDefault; };\n    var getPollMinIntervalSec = this.getPollMinIntervalSec;\n\n    var pollMaxIntervalSec = undefined;\n    var pollMaxIntervalSecDefault = 120;\n\n    this.setPollMaxIntervalSec = function(value) { pollMaxIntervalSec = value; };\n    this.getPollMaxIntervalSec = function() { return pollMaxIntervalSec || pollMaxIntervalSecDefault; };\n    var getPollMaxIntervalSec = this.getPollMaxIntervalSec;\n\n    var pollErrorThreshold = undefined;\n    var pollErrorThresholdDefault = 5;\n\n    this.setPollErrorThreshold = function(value) { pollErrorThreshold = value; };\n    this.getPollErrorThreshold = function() { return pollErrorThreshold || pollErrorThresholdDefault; };\n    var getPollErrorThreshold = this.getPollErrorThreshold;\n\n    this.$get = function($http, $timeout) {\n      // Now the sequenceNumber will be used for debugging and verification purposes.\n      var k8sdatamodel = {\n        \"data\": undefined,\n        \"sequenceNumber\": 0,\n        \"useSampleData\": useSampleData\n      };\n      var pollingError = 0;\n      var promise = undefined;\n\n      // Implement fibonacci back off when the service is down.\n      var pollInterval = getPollMinIntervalSec();\n      var pollIncrement = pollInterval;\n\n      // Reset polling interval.\n      var resetCounters = function() {\n        pollInterval = getPollMinIntervalSec();\n        pollIncrement = pollInterval;\n      };\n\n      // Bump error count and polling interval.\n      var bumpCounters = function() {\n        // Bump the error count.\n        pollingError++;\n\n        // TODO: maybe display an error in the UI to the end user.\n        if (pollingError % getPollErrorThreshold() === 0) {\n          console.log(\"Error: \" + pollingError + \" consecutive polling errors for \" + getDataService() + \".\");\n        }\n\n        // Bump the polling interval.\n        var oldIncrement = pollIncrement;\n        pollIncrement = pollInterval;\n        pollInterval += oldIncrement;\n\n        // Reset when limit reached.\n        if (pollInterval > getPollMaxIntervalSec()) {\n          resetCounters();\n        }\n      };\n\n      var updateModel = function(newModel) {\n        var dedupe = function(dataModel) {\n          if (dataModel.resources) {\n            var compareResources = function(resource) { return resource.id; };\n            dataModel.resources = _.chain(dataModel.resources)\n              .sortBy(compareResources)\n              .uniq(true, compareResources)\n              .value();\n          }\n\n          if (dataModel.relations) {\n            var compareRelations = function(relation) { return relation.source + relation.target; };\n            dataModel.relations = _.chain(dataModel.relations)\n              .sortBy(compareRelations)\n              .uniq(true, compareRelations)\n              .value();\n          }\n        };\n\n        dedupe(newModel);\n\n        var newModelString = JSON.stringify(newModel);\n        var oldModelString = \"\";\n        if (k8sdatamodel.data) {\n          oldModelString = JSON.stringify(k8sdatamodel.data);\n        }\n\n        if (newModelString !== oldModelString) {\n          k8sdatamodel.data = newModel;\n          k8sdatamodel.sequenceNumber++;\n        }\n\n        pollingError = 0;\n        resetCounters();\n      };\n\n      var nextSampleDataFile = 0;\n      var getSampleDataFile = function() {\n        var result = \"\";\n        if (sampleDataFiles.length > 0) {\n          result = sampleDataFiles[nextSampleDataFile % sampleDataFiles.length];\n          ++nextSampleDataFile;\n        }\n\n        return result;\n      };\n\n      var getDataServiceURL = function() {\n        return proxyVerb + getDataService() + getDataServicePortName() + getDataServiceEndpoint();\n      };\n\n      var pollOnce = function(scope, repeat) {\n        var dataSource = (k8sdatamodel.useSampleData) ? getSampleDataFile() : getDataServiceURL();\n        if (dataSource) {\n          $.getJSON(dataSource)\n              .done(function(newModel, jqxhr, textStatus) {\n                if (newModel && newModel.success) {\n                  delete newModel.success;\n                  delete newModel.timestamp;  // Remove changing timestamp.\n                  updateModel(newModel);\n                  scope.$apply();\n                  promise = repeat ? $timeout(function() { pollOnce(scope, true); }, pollInterval * 1000) : undefined;\n                  return;\n                }\n\n                bumpCounters();\n                promise = repeat ? $timeout(function() { pollOnce(scope, true); }, pollInterval * 1000) : undefined;\n              })\n              .fail(function(jqxhr, textStatus, error) {\n                bumpCounters();\n                promise = repeat ? $timeout(function() { pollOnce(scope, true); }, pollInterval * 1000) : undefined;\n              });\n        }\n      };\n\n      var isPolling = function() { return promise ? true : false; };\n\n      var start = function(scope) {\n        // If polling has already started, then calling start() again would\n        // just reset the counters and polling interval, but it will not\n        // start a new thread polling in parallel to the existing polling\n        // thread.\n        resetCounters();\n        if (!promise) {\n          k8sdatamodel.data = undefined;\n          pollOnce(scope, true);\n        }\n      };\n\n      var stop = function() {\n        if (promise) {\n          $timeout.cancel(promise);\n          promise = undefined;\n        }\n      };\n\n      var refresh = function(scope) {\n        stop();\n        resetCounters();\n        k8sdatamodel.data = undefined;\n        pollOnce(scope, false);\n      };\n\n      return {\n        \"k8sdatamodel\": k8sdatamodel,\n        \"isPolling\": isPolling,\n        \"refresh\": refresh,\n        \"start\": start,\n        \"stop\": stop\n      };\n    };\n  };\n\n  angular.module(\"kubernetesApp.services\")\n      .provider(\"pollK8sDataService\", [\"lodash\", pollK8sDataServiceProvider])\n      .config(function(pollK8sDataServiceProvider, ENV) {\n        if (ENV && ENV['/']) {\n          if (ENV['/']['k8sDataService']) {\n            pollK8sDataServiceProvider.setDataService(ENV['/']['k8sDataService']);\n          }\n          if (ENV['/']['k8sDataServicePortName']) {\n            pollK8sDataServiceProvider.setDataServicePortName(ENV['/']['k8sDataServicePortName']);\n          }\n          if (ENV['/']['k8sDataServiceEndpoint']) {\n            pollK8sDataServiceProvider.setDataServiceEndpoint(ENV['/']['k8sDataServiceEndpoint']);\n          }\n          if (ENV['/']['k8sDataPollIntervalMinSec']) {\n            pollK8sDataServiceProvider.setPollIntervalSec(ENV['/']['k8sDataPollIntervalMinSec']);\n          }\n          if (ENV['/']['k8sDataPollIntervalMaxSec']) {\n            pollK8sDataServiceProvider.setPollIntervalSec(ENV['/']['k8sDataPollIntervalMaxSec']);\n          }\n          if (ENV['/']['k8sDataPollErrorThreshold']) {\n            pollK8sDataServiceProvider.setPollErrorThreshold(ENV['/']['k8sDataPollErrorThreshold']);\n          }\n        }\n      });\n\n}());\n"
  },
  {
    "path": "master/shared/js/modules/services/toggle-state.js",
    "content": "/**=========================================================\n * Module: toggle-state.js\n * Services to share toggle state functionality\n =========================================================*/"
  },
  {
    "path": "master/shared/vendor/.gitkeep",
    "content": ""
  },
  {
    "path": "master/shared/vendor/angular-json-human/dist/angular-json-human.css",
    "content": ".jh-key,.jh-root,.jh-root tr,.jh-type-array,.jh-type-object,.jh-value{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.jh-key,.jh-value{margin:0;padding:.2em}.jh-value{border-left:1px solid #ddd}.jh-type-bool,.jh-type-number{font-weight:700;text-align:center;color:#5286BC}.jh-type-string{font-style:italic;color:#839B00}.jh-array-key{font-style:italic;font-size:small;text-align:center}.jh-array-key,.jh-object-key{color:#444;vertical-align:top}.jh-type-array>tbody>tr:nth-child(odd),.jh-type-object>tbody>tr:nth-child(odd){background-color:#f5f5f5}.jh-type-array>tbody>tr:nth-child(even),.jh-type-object>tbody>tr:nth-child(even){background-color:#fff}.jh-type-array,.jh-type-object{width:100%;border-collapse:collapse}.jh-root{border:1px solid #ccc;margin:.2em}th.jh-key{text-align:left}.jh-type-array>tbody>tr,.jh-type-object>tbody>tr{border:1px solid #ddd;border-bottom:none}.jh-type-array>tbody>tr:last-child,.jh-type-object>tbody>tr:last-child{border-bottom:1px solid #ddd}.jh-type-array>tbody>tr:hover,.jh-type-object>tbody>tr:hover{border:1px solid #F99927}.jh-empty{font-style:italic;color:#999;font-size:small}"
  },
  {
    "path": "master/shared/vendor/angular-material/angular-material.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */*,:after,:before{box-sizing:border-box}:focus{outline:0}body,html{height:100%;color:rgba(0,0,0,.87);background:#fff;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body p,html p{line-height:1.846}body h3,html h3{display:block;-webkit-margin-before:1em;-webkit-margin-after:1em;-webkit-margin-start:0;-webkit-margin-end:0;font-size:1.17em;font-weight:700}button,html,input,select,textarea{font-family:RobotoDraft,Roboto,'Helvetica Neue',sans-serif}body{margin:0;padding:0;outline:0}.inset{padding:10px}a{background:0 0;outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.75em;margin:2.33em 0}button,input,select,textarea{margin:0;font-size:100%;font-family:inherit;vertical-align:baseline}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default}textarea{vertical-align:top;overflow:auto}input[type=radio],input[type=checkbox]{padding:0;box-sizing:border-box}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box;-webkit-box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;text-transform:none;width:1px}.md-shadow{position:absolute;top:0;left:0;bottom:0;right:0;border-radius:inherit;pointer-events:none}.md-button.md-fab,.md-button.md-raised:not([disabled]),.md-shadow-bottom-z-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}.md-button.md-fab:not([disabled]):focus,.md-button.md-fab:not([disabled]):hover,.md-button.md-raised:not([disabled]):focus,.md-button.md-raised:not([disabled]):hover,.md-shadow-bottom-z-2{box-shadow:0 4px 8px 0 rgba(0,0,0,.4)}.md-shadow-animated.md-shadow{transition:box-shadow .28s cubic-bezier(.4,0,.2,1)}.md-ripple-container{pointer-events:none;position:absolute;overflow:hidden;left:0;top:0;width:100%;height:100%;transition:all .55s cubic-bezier(.25,.8,.25,1)}.md-ripple{position:absolute;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;opacity:0;border-radius:50%}.md-ripple.md-ripple-placed{transition:left .9s cubic-bezier(.25,.8,.25,1),top .9s cubic-bezier(.25,.8,.25,1),margin .65s cubic-bezier(.25,.8,.25,1),border .65s cubic-bezier(.25,.8,.25,1),width .65s cubic-bezier(.25,.8,.25,1),height .65s cubic-bezier(.25,.8,.25,1),opacity .65s cubic-bezier(.25,.8,.25,1),-webkit-transform .65s cubic-bezier(.25,.8,.25,1);transition:left .9s cubic-bezier(.25,.8,.25,1),top .9s cubic-bezier(.25,.8,.25,1),margin .65s cubic-bezier(.25,.8,.25,1),border .65s cubic-bezier(.25,.8,.25,1),width .65s cubic-bezier(.25,.8,.25,1),height .65s cubic-bezier(.25,.8,.25,1),opacity .65s cubic-bezier(.25,.8,.25,1),transform .65s cubic-bezier(.25,.8,.25,1)}.md-ripple.md-ripple-scaled{-webkit-transform:scale(1);transform:scale(1)}.md-ripple.md-ripple-active,.md-ripple.md-ripple-full,.md-ripple.md-ripple-visible{opacity:.2}md-tab>.md-ripple-container .md-ripple{box-sizing:content-box;background-color:transparent!important;border-width:0;border-style:solid;opacity:.2;-webkit-transform:none!important;transform:none!important}md-tab>.md-ripple-container .md-ripple.md-ripple-active,md-tab>.md-ripple-container .md-ripple.md-ripple-full,md-tab>.md-ripple-container .md-ripple.md-ripple-visible{opacity:.2}[layout]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[layout-padding],[layout-padding]>[flex]{padding:8px}[layout-margin],[layout-margin]>[flex]{margin:8px}[layout-wrap]{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}[layout-fill]{margin:0;min-height:100%;width:100%}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:auto;height:inherit}}[flex]{-webkit-flex:1;-ms-flex:1;flex:1}[flex=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex=\"0\"]{max-width:0}[layout=column]>[flex=\"0\"]{max-height:0}[flex=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex=\"5\"]{max-width:5%}[layout=column]>[flex=\"5\"]{max-height:5%}[flex=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex=\"10\"]{max-width:10%}[layout=column]>[flex=\"10\"]{max-height:10%}[flex=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex=\"15\"]{max-width:15%}[layout=column]>[flex=\"15\"]{max-height:15%}[flex=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex=\"20\"]{max-width:20%}[layout=column]>[flex=\"20\"]{max-height:20%}[flex=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex=\"25\"]{max-width:25%}[layout=column]>[flex=\"25\"]{max-height:25%}[flex=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex=\"30\"]{max-width:30%}[layout=column]>[flex=\"30\"]{max-height:30%}[flex=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex=\"35\"]{max-width:35%}[layout=column]>[flex=\"35\"]{max-height:35%}[flex=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex=\"40\"]{max-width:40%}[layout=column]>[flex=\"40\"]{max-height:40%}[flex=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex=\"45\"]{max-width:45%}[layout=column]>[flex=\"45\"]{max-height:45%}[flex=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex=\"50\"]{max-width:50%}[layout=column]>[flex=\"50\"]{max-height:50%}[flex=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex=\"55\"]{max-width:55%}[layout=column]>[flex=\"55\"]{max-height:55%}[flex=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex=\"60\"]{max-width:60%}[layout=column]>[flex=\"60\"]{max-height:60%}[flex=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex=\"65\"]{max-width:65%}[layout=column]>[flex=\"65\"]{max-height:65%}[flex=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex=\"70\"]{max-width:70%}[layout=column]>[flex=\"70\"]{max-height:70%}[flex=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex=\"75\"]{max-width:75%}[layout=column]>[flex=\"75\"]{max-height:75%}[flex=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex=\"80\"]{max-width:80%}[layout=column]>[flex=\"80\"]{max-height:80%}[flex=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex=\"85\"]{max-width:85%}[layout=column]>[flex=\"85\"]{max-height:85%}[flex=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex=\"90\"]{max-width:90%}[layout=column]>[flex=\"90\"]{max-height:90%}[flex=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex=\"95\"]{max-width:95%}[layout=column]>[flex=\"95\"]{max-height:95%}[flex=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex=\"100\"]{max-width:100%}[layout=column]>[flex=\"100\"]{max-height:100%}[layout=row]>[flex=\"33\"],[layout=row]>[flex=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex=\"66\"],[layout=row]>[flex=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex=\"33\"],[layout=column]>[flex=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex=\"66\"],[layout=column]>[flex=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}[layout-align=center],[layout-align=\"center center\"],[layout-align=\"center start\"],[layout-align=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align=end],[layout-align=\"end center\"],[layout-align=\"end start\"],[layout-align=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align=space-around],[layout-align=\"space-around center\"],[layout-align=\"space-around start\"],[layout-align=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align=space-between],[layout-align=\"space-between center\"],[layout-align=\"space-between start\"],[layout-align=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align=\"center center\"],[layout-align=\"end center\"],[layout-align=\"space-around center\"],[layout-align=\"space-between center\"],[layout-align=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align=\"center start\"],[layout-align=\"end start\"],[layout-align=\"space-around start\"],[layout-align=\"space-between start\"],[layout-align=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align=\"center end\"],[layout-align=\"end end\"],[layout-align=\"space-around end\"],[layout-align=\"space-between end\"],[layout-align=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[flex-order=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}@media (max-width:599px){[hide-sm]:not([show-sm]):not([show]),[hide]:not([show-sm]):not([show]){display:none}[flex-order-sm=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-sm=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-sm=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-sm=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-sm=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-sm=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-sm=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-sm=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-sm=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-sm=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-sm=center],[layout-align-sm=\"center center\"],[layout-align-sm=\"center start\"],[layout-align-sm=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-sm=end],[layout-align-sm=\"end center\"],[layout-align-sm=\"end start\"],[layout-align-sm=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-sm=space-around],[layout-align-sm=\"space-around center\"],[layout-align-sm=\"space-around start\"],[layout-align-sm=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-sm=space-between],[layout-align-sm=\"space-between center\"],[layout-align-sm=\"space-between start\"],[layout-align-sm=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-sm=\"center center\"],[layout-align-sm=\"end center\"],[layout-align-sm=\"space-around center\"],[layout-align-sm=\"space-between center\"],[layout-align-sm=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-sm=\"center start\"],[layout-align-sm=\"end start\"],[layout-align-sm=\"space-around start\"],[layout-align-sm=\"space-between start\"],[layout-align-sm=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-sm=\"center end\"],[layout-align-sm=\"end end\"],[layout-align-sm=\"space-around end\"],[layout-align-sm=\"space-between end\"],[layout-align-sm=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-sm]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-sm=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-sm=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-sm]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-sm=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-sm=\"0\"]{max-width:0}[layout=column]>[flex-sm=\"0\"]{max-height:0}[flex-sm=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-sm=\"5\"]{max-width:5%}[layout=column]>[flex-sm=\"5\"]{max-height:5%}[flex-sm=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-sm=\"10\"]{max-width:10%}[layout=column]>[flex-sm=\"10\"]{max-height:10%}[flex-sm=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-sm=\"15\"]{max-width:15%}[layout=column]>[flex-sm=\"15\"]{max-height:15%}[flex-sm=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-sm=\"20\"]{max-width:20%}[layout=column]>[flex-sm=\"20\"]{max-height:20%}[flex-sm=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-sm=\"25\"]{max-width:25%}[layout=column]>[flex-sm=\"25\"]{max-height:25%}[flex-sm=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-sm=\"30\"]{max-width:30%}[layout=column]>[flex-sm=\"30\"]{max-height:30%}[flex-sm=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-sm=\"35\"]{max-width:35%}[layout=column]>[flex-sm=\"35\"]{max-height:35%}[flex-sm=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-sm=\"40\"]{max-width:40%}[layout=column]>[flex-sm=\"40\"]{max-height:40%}[flex-sm=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-sm=\"45\"]{max-width:45%}[layout=column]>[flex-sm=\"45\"]{max-height:45%}[flex-sm=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-sm=\"50\"]{max-width:50%}[layout=column]>[flex-sm=\"50\"]{max-height:50%}[flex-sm=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-sm=\"55\"]{max-width:55%}[layout=column]>[flex-sm=\"55\"]{max-height:55%}[flex-sm=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-sm=\"60\"]{max-width:60%}[layout=column]>[flex-sm=\"60\"]{max-height:60%}[flex-sm=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-sm=\"65\"]{max-width:65%}[layout=column]>[flex-sm=\"65\"]{max-height:65%}[flex-sm=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-sm=\"70\"]{max-width:70%}[layout=column]>[flex-sm=\"70\"]{max-height:70%}[flex-sm=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-sm=\"75\"]{max-width:75%}[layout=column]>[flex-sm=\"75\"]{max-height:75%}[flex-sm=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-sm=\"80\"]{max-width:80%}[layout=column]>[flex-sm=\"80\"]{max-height:80%}[flex-sm=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-sm=\"85\"]{max-width:85%}[layout=column]>[flex-sm=\"85\"]{max-height:85%}[flex-sm=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-sm=\"90\"]{max-width:90%}[layout=column]>[flex-sm=\"90\"]{max-height:90%}[flex-sm=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-sm=\"95\"]{max-width:95%}[layout=column]>[flex-sm=\"95\"]{max-height:95%}[flex-sm=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-sm=\"100\"]{max-width:100%}[layout=column]>[flex-sm=\"100\"]{max-height:100%}[layout=row]>[flex-sm=\"33\"],[layout=row]>[flex-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-sm=\"66\"],[layout=row]>[flex-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-sm=\"33\"],[layout=column]>[flex-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-sm=\"66\"],[layout=column]>[flex-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:600px){[flex-order-gt-sm=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-sm=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-sm=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-sm=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-sm=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-sm=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-sm=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-sm=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-sm=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-sm=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-sm=center],[layout-align-gt-sm=\"center center\"],[layout-align-gt-sm=\"center start\"],[layout-align-gt-sm=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-sm=end],[layout-align-gt-sm=\"end center\"],[layout-align-gt-sm=\"end start\"],[layout-align-gt-sm=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-sm=space-around],[layout-align-gt-sm=\"space-around center\"],[layout-align-gt-sm=\"space-around start\"],[layout-align-gt-sm=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-sm=space-between],[layout-align-gt-sm=\"space-between center\"],[layout-align-gt-sm=\"space-between start\"],[layout-align-gt-sm=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-sm=\"center center\"],[layout-align-gt-sm=\"end center\"],[layout-align-gt-sm=\"space-around center\"],[layout-align-gt-sm=\"space-between center\"],[layout-align-gt-sm=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-sm=\"center start\"],[layout-align-gt-sm=\"end start\"],[layout-align-gt-sm=\"space-around start\"],[layout-align-gt-sm=\"space-between start\"],[layout-align-gt-sm=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-sm=\"center end\"],[layout-align-gt-sm=\"end end\"],[layout-align-gt-sm=\"space-around end\"],[layout-align-gt-sm=\"space-between end\"],[layout-align-gt-sm=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-sm]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-sm=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-sm=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-sm]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-sm=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-sm=\"0\"]{max-width:0}[layout=column]>[flex-gt-sm=\"0\"]{max-height:0}[flex-gt-sm=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-sm=\"5\"]{max-width:5%}[layout=column]>[flex-gt-sm=\"5\"]{max-height:5%}[flex-gt-sm=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-sm=\"10\"]{max-width:10%}[layout=column]>[flex-gt-sm=\"10\"]{max-height:10%}[flex-gt-sm=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-sm=\"15\"]{max-width:15%}[layout=column]>[flex-gt-sm=\"15\"]{max-height:15%}[flex-gt-sm=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-sm=\"20\"]{max-width:20%}[layout=column]>[flex-gt-sm=\"20\"]{max-height:20%}[flex-gt-sm=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-sm=\"25\"]{max-width:25%}[layout=column]>[flex-gt-sm=\"25\"]{max-height:25%}[flex-gt-sm=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-sm=\"30\"]{max-width:30%}[layout=column]>[flex-gt-sm=\"30\"]{max-height:30%}[flex-gt-sm=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-sm=\"35\"]{max-width:35%}[layout=column]>[flex-gt-sm=\"35\"]{max-height:35%}[flex-gt-sm=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-sm=\"40\"]{max-width:40%}[layout=column]>[flex-gt-sm=\"40\"]{max-height:40%}[flex-gt-sm=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-sm=\"45\"]{max-width:45%}[layout=column]>[flex-gt-sm=\"45\"]{max-height:45%}[flex-gt-sm=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-sm=\"50\"]{max-width:50%}[layout=column]>[flex-gt-sm=\"50\"]{max-height:50%}[flex-gt-sm=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-sm=\"55\"]{max-width:55%}[layout=column]>[flex-gt-sm=\"55\"]{max-height:55%}[flex-gt-sm=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-sm=\"60\"]{max-width:60%}[layout=column]>[flex-gt-sm=\"60\"]{max-height:60%}[flex-gt-sm=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-sm=\"65\"]{max-width:65%}[layout=column]>[flex-gt-sm=\"65\"]{max-height:65%}[flex-gt-sm=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-sm=\"70\"]{max-width:70%}[layout=column]>[flex-gt-sm=\"70\"]{max-height:70%}[flex-gt-sm=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-sm=\"75\"]{max-width:75%}[layout=column]>[flex-gt-sm=\"75\"]{max-height:75%}[flex-gt-sm=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-sm=\"80\"]{max-width:80%}[layout=column]>[flex-gt-sm=\"80\"]{max-height:80%}[flex-gt-sm=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-sm=\"85\"]{max-width:85%}[layout=column]>[flex-gt-sm=\"85\"]{max-height:85%}[flex-gt-sm=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-sm=\"90\"]{max-width:90%}[layout=column]>[flex-gt-sm=\"90\"]{max-height:90%}[flex-gt-sm=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-sm=\"95\"]{max-width:95%}[layout=column]>[flex-gt-sm=\"95\"]{max-height:95%}[flex-gt-sm=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-sm=\"100\"]{max-width:100%}[layout=column]>[flex-gt-sm=\"100\"]{max-height:100%}[layout=row]>[flex-gt-sm=\"33\"],[layout=row]>[flex-gt-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-sm=\"66\"],[layout=row]>[flex-gt-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-sm=\"33\"],[layout=column]>[flex-gt-sm=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-sm=\"66\"],[layout=column]>[flex-gt-sm=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:600px) and (max-width:959px){[hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]),[hide-md]:not([show-md]):not([show]),[hide]:not([show-gt-sm]):not([show-md]):not([show]){display:none}[flex-order-md=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-md=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-md=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-md=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-md=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-md=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-md=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-md=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-md=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-md=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-md=center],[layout-align-md=\"center center\"],[layout-align-md=\"center start\"],[layout-align-md=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-md=end],[layout-align-md=\"end center\"],[layout-align-md=\"end start\"],[layout-align-md=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-md=space-around],[layout-align-md=\"space-around center\"],[layout-align-md=\"space-around start\"],[layout-align-md=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-md=space-between],[layout-align-md=\"space-between center\"],[layout-align-md=\"space-between start\"],[layout-align-md=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-md=\"center center\"],[layout-align-md=\"end center\"],[layout-align-md=\"space-around center\"],[layout-align-md=\"space-between center\"],[layout-align-md=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-md=\"center start\"],[layout-align-md=\"end start\"],[layout-align-md=\"space-around start\"],[layout-align-md=\"space-between start\"],[layout-align-md=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-md=\"center end\"],[layout-align-md=\"end end\"],[layout-align-md=\"space-around end\"],[layout-align-md=\"space-between end\"],[layout-align-md=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-md]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-md=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-md=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-md]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-md=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-md=\"0\"]{max-width:0}[layout=column]>[flex-md=\"0\"]{max-height:0}[flex-md=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-md=\"5\"]{max-width:5%}[layout=column]>[flex-md=\"5\"]{max-height:5%}[flex-md=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-md=\"10\"]{max-width:10%}[layout=column]>[flex-md=\"10\"]{max-height:10%}[flex-md=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-md=\"15\"]{max-width:15%}[layout=column]>[flex-md=\"15\"]{max-height:15%}[flex-md=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-md=\"20\"]{max-width:20%}[layout=column]>[flex-md=\"20\"]{max-height:20%}[flex-md=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-md=\"25\"]{max-width:25%}[layout=column]>[flex-md=\"25\"]{max-height:25%}[flex-md=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-md=\"30\"]{max-width:30%}[layout=column]>[flex-md=\"30\"]{max-height:30%}[flex-md=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-md=\"35\"]{max-width:35%}[layout=column]>[flex-md=\"35\"]{max-height:35%}[flex-md=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-md=\"40\"]{max-width:40%}[layout=column]>[flex-md=\"40\"]{max-height:40%}[flex-md=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-md=\"45\"]{max-width:45%}[layout=column]>[flex-md=\"45\"]{max-height:45%}[flex-md=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-md=\"50\"]{max-width:50%}[layout=column]>[flex-md=\"50\"]{max-height:50%}[flex-md=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-md=\"55\"]{max-width:55%}[layout=column]>[flex-md=\"55\"]{max-height:55%}[flex-md=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-md=\"60\"]{max-width:60%}[layout=column]>[flex-md=\"60\"]{max-height:60%}[flex-md=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-md=\"65\"]{max-width:65%}[layout=column]>[flex-md=\"65\"]{max-height:65%}[flex-md=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-md=\"70\"]{max-width:70%}[layout=column]>[flex-md=\"70\"]{max-height:70%}[flex-md=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-md=\"75\"]{max-width:75%}[layout=column]>[flex-md=\"75\"]{max-height:75%}[flex-md=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-md=\"80\"]{max-width:80%}[layout=column]>[flex-md=\"80\"]{max-height:80%}[flex-md=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-md=\"85\"]{max-width:85%}[layout=column]>[flex-md=\"85\"]{max-height:85%}[flex-md=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-md=\"90\"]{max-width:90%}[layout=column]>[flex-md=\"90\"]{max-height:90%}[flex-md=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-md=\"95\"]{max-width:95%}[layout=column]>[flex-md=\"95\"]{max-height:95%}[flex-md=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-md=\"100\"]{max-width:100%}[layout=column]>[flex-md=\"100\"]{max-height:100%}[layout=row]>[flex-md=\"33\"],[layout=row]>[flex-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-md=\"66\"],[layout=row]>[flex-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-md=\"33\"],[layout=column]>[flex-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-md=\"66\"],[layout=column]>[flex-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:960px){[flex-order-gt-md=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-md=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-md=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-md=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-md=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-md=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-md=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-md=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-md=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-md=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-md=center],[layout-align-gt-md=\"center center\"],[layout-align-gt-md=\"center start\"],[layout-align-gt-md=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-md=end],[layout-align-gt-md=\"end center\"],[layout-align-gt-md=\"end start\"],[layout-align-gt-md=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-md=space-around],[layout-align-gt-md=\"space-around center\"],[layout-align-gt-md=\"space-around start\"],[layout-align-gt-md=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-md=space-between],[layout-align-gt-md=\"space-between center\"],[layout-align-gt-md=\"space-between start\"],[layout-align-gt-md=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-md=\"center center\"],[layout-align-gt-md=\"end center\"],[layout-align-gt-md=\"space-around center\"],[layout-align-gt-md=\"space-between center\"],[layout-align-gt-md=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-md=\"center start\"],[layout-align-gt-md=\"end start\"],[layout-align-gt-md=\"space-around start\"],[layout-align-gt-md=\"space-between start\"],[layout-align-gt-md=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-md=\"center end\"],[layout-align-gt-md=\"end end\"],[layout-align-gt-md=\"space-around end\"],[layout-align-gt-md=\"space-between end\"],[layout-align-gt-md=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-md]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-md=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-md=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-md]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-md=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-md=\"0\"]{max-width:0}[layout=column]>[flex-gt-md=\"0\"]{max-height:0}[flex-gt-md=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-md=\"5\"]{max-width:5%}[layout=column]>[flex-gt-md=\"5\"]{max-height:5%}[flex-gt-md=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-md=\"10\"]{max-width:10%}[layout=column]>[flex-gt-md=\"10\"]{max-height:10%}[flex-gt-md=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-md=\"15\"]{max-width:15%}[layout=column]>[flex-gt-md=\"15\"]{max-height:15%}[flex-gt-md=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-md=\"20\"]{max-width:20%}[layout=column]>[flex-gt-md=\"20\"]{max-height:20%}[flex-gt-md=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-md=\"25\"]{max-width:25%}[layout=column]>[flex-gt-md=\"25\"]{max-height:25%}[flex-gt-md=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-md=\"30\"]{max-width:30%}[layout=column]>[flex-gt-md=\"30\"]{max-height:30%}[flex-gt-md=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-md=\"35\"]{max-width:35%}[layout=column]>[flex-gt-md=\"35\"]{max-height:35%}[flex-gt-md=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-md=\"40\"]{max-width:40%}[layout=column]>[flex-gt-md=\"40\"]{max-height:40%}[flex-gt-md=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-md=\"45\"]{max-width:45%}[layout=column]>[flex-gt-md=\"45\"]{max-height:45%}[flex-gt-md=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-md=\"50\"]{max-width:50%}[layout=column]>[flex-gt-md=\"50\"]{max-height:50%}[flex-gt-md=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-md=\"55\"]{max-width:55%}[layout=column]>[flex-gt-md=\"55\"]{max-height:55%}[flex-gt-md=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-md=\"60\"]{max-width:60%}[layout=column]>[flex-gt-md=\"60\"]{max-height:60%}[flex-gt-md=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-md=\"65\"]{max-width:65%}[layout=column]>[flex-gt-md=\"65\"]{max-height:65%}[flex-gt-md=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-md=\"70\"]{max-width:70%}[layout=column]>[flex-gt-md=\"70\"]{max-height:70%}[flex-gt-md=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-md=\"75\"]{max-width:75%}[layout=column]>[flex-gt-md=\"75\"]{max-height:75%}[flex-gt-md=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-md=\"80\"]{max-width:80%}[layout=column]>[flex-gt-md=\"80\"]{max-height:80%}[flex-gt-md=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-md=\"85\"]{max-width:85%}[layout=column]>[flex-gt-md=\"85\"]{max-height:85%}[flex-gt-md=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-md=\"90\"]{max-width:90%}[layout=column]>[flex-gt-md=\"90\"]{max-height:90%}[flex-gt-md=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-md=\"95\"]{max-width:95%}[layout=column]>[flex-gt-md=\"95\"]{max-height:95%}[flex-gt-md=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-md=\"100\"]{max-width:100%}[layout=column]>[flex-gt-md=\"100\"]{max-height:100%}[layout=row]>[flex-gt-md=\"33\"],[layout=row]>[flex-gt-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-md=\"66\"],[layout=row]>[flex-gt-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-md=\"33\"],[layout=column]>[flex-gt-md=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-md=\"66\"],[layout=column]>[flex-gt-md=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:960px) and (max-width:1199px){[hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]),[hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]),[hide-lg]:not([show-lg]):not([show]),[hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]){display:none}[flex-order-lg=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-lg=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-lg=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-lg=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-lg=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-lg=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-lg=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-lg=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-lg=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-lg=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-lg=center],[layout-align-lg=\"center center\"],[layout-align-lg=\"center start\"],[layout-align-lg=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-lg=end],[layout-align-lg=\"end center\"],[layout-align-lg=\"end start\"],[layout-align-lg=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-lg=space-around],[layout-align-lg=\"space-around center\"],[layout-align-lg=\"space-around start\"],[layout-align-lg=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-lg=space-between],[layout-align-lg=\"space-between center\"],[layout-align-lg=\"space-between start\"],[layout-align-lg=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-lg=\"center center\"],[layout-align-lg=\"end center\"],[layout-align-lg=\"space-around center\"],[layout-align-lg=\"space-between center\"],[layout-align-lg=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-lg=\"center start\"],[layout-align-lg=\"end start\"],[layout-align-lg=\"space-around start\"],[layout-align-lg=\"space-between start\"],[layout-align-lg=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-lg=\"center end\"],[layout-align-lg=\"end end\"],[layout-align-lg=\"space-around end\"],[layout-align-lg=\"space-between end\"],[layout-align-lg=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-lg]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-lg=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-lg=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-lg]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-lg=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-lg=\"0\"]{max-width:0}[layout=column]>[flex-lg=\"0\"]{max-height:0}[flex-lg=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-lg=\"5\"]{max-width:5%}[layout=column]>[flex-lg=\"5\"]{max-height:5%}[flex-lg=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-lg=\"10\"]{max-width:10%}[layout=column]>[flex-lg=\"10\"]{max-height:10%}[flex-lg=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-lg=\"15\"]{max-width:15%}[layout=column]>[flex-lg=\"15\"]{max-height:15%}[flex-lg=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-lg=\"20\"]{max-width:20%}[layout=column]>[flex-lg=\"20\"]{max-height:20%}[flex-lg=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-lg=\"25\"]{max-width:25%}[layout=column]>[flex-lg=\"25\"]{max-height:25%}[flex-lg=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-lg=\"30\"]{max-width:30%}[layout=column]>[flex-lg=\"30\"]{max-height:30%}[flex-lg=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-lg=\"35\"]{max-width:35%}[layout=column]>[flex-lg=\"35\"]{max-height:35%}[flex-lg=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-lg=\"40\"]{max-width:40%}[layout=column]>[flex-lg=\"40\"]{max-height:40%}[flex-lg=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-lg=\"45\"]{max-width:45%}[layout=column]>[flex-lg=\"45\"]{max-height:45%}[flex-lg=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-lg=\"50\"]{max-width:50%}[layout=column]>[flex-lg=\"50\"]{max-height:50%}[flex-lg=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-lg=\"55\"]{max-width:55%}[layout=column]>[flex-lg=\"55\"]{max-height:55%}[flex-lg=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-lg=\"60\"]{max-width:60%}[layout=column]>[flex-lg=\"60\"]{max-height:60%}[flex-lg=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-lg=\"65\"]{max-width:65%}[layout=column]>[flex-lg=\"65\"]{max-height:65%}[flex-lg=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-lg=\"70\"]{max-width:70%}[layout=column]>[flex-lg=\"70\"]{max-height:70%}[flex-lg=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-lg=\"75\"]{max-width:75%}[layout=column]>[flex-lg=\"75\"]{max-height:75%}[flex-lg=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-lg=\"80\"]{max-width:80%}[layout=column]>[flex-lg=\"80\"]{max-height:80%}[flex-lg=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-lg=\"85\"]{max-width:85%}[layout=column]>[flex-lg=\"85\"]{max-height:85%}[flex-lg=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-lg=\"90\"]{max-width:90%}[layout=column]>[flex-lg=\"90\"]{max-height:90%}[flex-lg=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-lg=\"95\"]{max-width:95%}[layout=column]>[flex-lg=\"95\"]{max-height:95%}[flex-lg=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-lg=\"100\"]{max-width:100%}[layout=column]>[flex-lg=\"100\"]{max-height:100%}[layout=row]>[flex-lg=\"33\"],[layout=row]>[flex-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-lg=\"66\"],[layout=row]>[flex-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-lg=\"33\"],[layout=column]>[flex-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-lg=\"66\"],[layout=column]>[flex-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@media (min-width:1200px){[hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]),[hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]){display:none}[flex-order-gt-lg=\"0\"]{-webkit-order:0;-ms-flex-order:0;order:0}[flex-order-gt-lg=\"1\"]{-webkit-order:1;-ms-flex-order:1;order:1}[flex-order-gt-lg=\"2\"]{-webkit-order:2;-ms-flex-order:2;order:2}[flex-order-gt-lg=\"3\"]{-webkit-order:3;-ms-flex-order:3;order:3}[flex-order-gt-lg=\"4\"]{-webkit-order:4;-ms-flex-order:4;order:4}[flex-order-gt-lg=\"5\"]{-webkit-order:5;-ms-flex-order:5;order:5}[flex-order-gt-lg=\"6\"]{-webkit-order:6;-ms-flex-order:6;order:6}[flex-order-gt-lg=\"7\"]{-webkit-order:7;-ms-flex-order:7;order:7}[flex-order-gt-lg=\"8\"]{-webkit-order:8;-ms-flex-order:8;order:8}[flex-order-gt-lg=\"9\"]{-webkit-order:9;-ms-flex-order:9;order:9}[layout-align-gt-lg=center],[layout-align-gt-lg=\"center center\"],[layout-align-gt-lg=\"center start\"],[layout-align-gt-lg=\"center end\"]{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[layout-align-gt-lg=end],[layout-align-gt-lg=\"end center\"],[layout-align-gt-lg=\"end start\"],[layout-align-gt-lg=\"end end\"]{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}[layout-align-gt-lg=space-around],[layout-align-gt-lg=\"space-around center\"],[layout-align-gt-lg=\"space-around start\"],[layout-align-gt-lg=\"space-around end\"]{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}[layout-align-gt-lg=space-between],[layout-align-gt-lg=\"space-between center\"],[layout-align-gt-lg=\"space-between start\"],[layout-align-gt-lg=\"space-between end\"]{-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}[layout-align-gt-lg=\"center center\"],[layout-align-gt-lg=\"end center\"],[layout-align-gt-lg=\"space-around center\"],[layout-align-gt-lg=\"space-between center\"],[layout-align-gt-lg=\"start center\"]{-webkit-align-items:center;-ms-flex-align:center;align-items:center}[layout-align-gt-lg=\"center start\"],[layout-align-gt-lg=\"end start\"],[layout-align-gt-lg=\"space-around start\"],[layout-align-gt-lg=\"space-between start\"],[layout-align-gt-lg=\"start start\"]{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}[layout-align-gt-lg=\"center end\"],[layout-align-gt-lg=\"end end\"],[layout-align-gt-lg=\"space-around end\"],[layout-align-gt-lg=\"space-between end\"],[layout-align-gt-lg=\"start end\"]{-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}[layout-gt-lg]{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex}[layout-gt-lg=column]{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}[layout-gt-lg=row]{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}[flex-gt-lg]{-webkit-flex:1;-ms-flex:1;flex:1}[flex-gt-lg=\"0\"]{-webkit-flex:0 0 0;-ms-flex:0 0 0;flex:0 0 0}[layout=row]>[flex-gt-lg=\"0\"]{max-width:0}[layout=column]>[flex-gt-lg=\"0\"]{max-height:0}[flex-gt-lg=\"5\"]{-webkit-flex:0 0 5%;-ms-flex:0 0 5%;flex:0 0 5%}[layout=row]>[flex-gt-lg=\"5\"]{max-width:5%}[layout=column]>[flex-gt-lg=\"5\"]{max-height:5%}[flex-gt-lg=\"10\"]{-webkit-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%}[layout=row]>[flex-gt-lg=\"10\"]{max-width:10%}[layout=column]>[flex-gt-lg=\"10\"]{max-height:10%}[flex-gt-lg=\"15\"]{-webkit-flex:0 0 15%;-ms-flex:0 0 15%;flex:0 0 15%}[layout=row]>[flex-gt-lg=\"15\"]{max-width:15%}[layout=column]>[flex-gt-lg=\"15\"]{max-height:15%}[flex-gt-lg=\"20\"]{-webkit-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%}[layout=row]>[flex-gt-lg=\"20\"]{max-width:20%}[layout=column]>[flex-gt-lg=\"20\"]{max-height:20%}[flex-gt-lg=\"25\"]{-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%}[layout=row]>[flex-gt-lg=\"25\"]{max-width:25%}[layout=column]>[flex-gt-lg=\"25\"]{max-height:25%}[flex-gt-lg=\"30\"]{-webkit-flex:0 0 30%;-ms-flex:0 0 30%;flex:0 0 30%}[layout=row]>[flex-gt-lg=\"30\"]{max-width:30%}[layout=column]>[flex-gt-lg=\"30\"]{max-height:30%}[flex-gt-lg=\"35\"]{-webkit-flex:0 0 35%;-ms-flex:0 0 35%;flex:0 0 35%}[layout=row]>[flex-gt-lg=\"35\"]{max-width:35%}[layout=column]>[flex-gt-lg=\"35\"]{max-height:35%}[flex-gt-lg=\"40\"]{-webkit-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%}[layout=row]>[flex-gt-lg=\"40\"]{max-width:40%}[layout=column]>[flex-gt-lg=\"40\"]{max-height:40%}[flex-gt-lg=\"45\"]{-webkit-flex:0 0 45%;-ms-flex:0 0 45%;flex:0 0 45%}[layout=row]>[flex-gt-lg=\"45\"]{max-width:45%}[layout=column]>[flex-gt-lg=\"45\"]{max-height:45%}[flex-gt-lg=\"50\"]{-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%}[layout=row]>[flex-gt-lg=\"50\"]{max-width:50%}[layout=column]>[flex-gt-lg=\"50\"]{max-height:50%}[flex-gt-lg=\"55\"]{-webkit-flex:0 0 55%;-ms-flex:0 0 55%;flex:0 0 55%}[layout=row]>[flex-gt-lg=\"55\"]{max-width:55%}[layout=column]>[flex-gt-lg=\"55\"]{max-height:55%}[flex-gt-lg=\"60\"]{-webkit-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%}[layout=row]>[flex-gt-lg=\"60\"]{max-width:60%}[layout=column]>[flex-gt-lg=\"60\"]{max-height:60%}[flex-gt-lg=\"65\"]{-webkit-flex:0 0 65%;-ms-flex:0 0 65%;flex:0 0 65%}[layout=row]>[flex-gt-lg=\"65\"]{max-width:65%}[layout=column]>[flex-gt-lg=\"65\"]{max-height:65%}[flex-gt-lg=\"70\"]{-webkit-flex:0 0 70%;-ms-flex:0 0 70%;flex:0 0 70%}[layout=row]>[flex-gt-lg=\"70\"]{max-width:70%}[layout=column]>[flex-gt-lg=\"70\"]{max-height:70%}[flex-gt-lg=\"75\"]{-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%}[layout=row]>[flex-gt-lg=\"75\"]{max-width:75%}[layout=column]>[flex-gt-lg=\"75\"]{max-height:75%}[flex-gt-lg=\"80\"]{-webkit-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%}[layout=row]>[flex-gt-lg=\"80\"]{max-width:80%}[layout=column]>[flex-gt-lg=\"80\"]{max-height:80%}[flex-gt-lg=\"85\"]{-webkit-flex:0 0 85%;-ms-flex:0 0 85%;flex:0 0 85%}[layout=row]>[flex-gt-lg=\"85\"]{max-width:85%}[layout=column]>[flex-gt-lg=\"85\"]{max-height:85%}[flex-gt-lg=\"90\"]{-webkit-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%}[layout=row]>[flex-gt-lg=\"90\"]{max-width:90%}[layout=column]>[flex-gt-lg=\"90\"]{max-height:90%}[flex-gt-lg=\"95\"]{-webkit-flex:0 0 95%;-ms-flex:0 0 95%;flex:0 0 95%}[layout=row]>[flex-gt-lg=\"95\"]{max-width:95%}[layout=column]>[flex-gt-lg=\"95\"]{max-height:95%}[flex-gt-lg=\"100\"]{-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}[layout=row]>[flex-gt-lg=\"100\"]{max-width:100%}[layout=column]>[flex-gt-lg=\"100\"]{max-height:100%}[layout=row]>[flex-gt-lg=\"33\"],[layout=row]>[flex-gt-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-width:33.33%}[layout=row]>[flex-gt-lg=\"66\"],[layout=row]>[flex-gt-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-width:66.66%}[layout=column]>[flex-gt-lg=\"33\"],[layout=column]>[flex-gt-lg=\"34\"]{-webkit-flex:0 0 33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%;max-height:33.33%}[layout=column]>[flex-gt-lg=\"66\"],[layout=column]>[flex-gt-lg=\"67\"]{-webkit-flex:0 0 66.66%;-ms-flex:0 0 66.66%;flex:0 0 66.66%;max-height:66.66%}}@-webkit-keyframes md-autocomplete-list-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear}50%{opacity:0;height:40px;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{height:0;opacity:0}}@keyframes md-autocomplete-list-out{0%{-webkit-animation-timing-function:linear;animation-timing-function:linear}50%{opacity:0;height:40px;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{height:0;opacity:0}}@-webkit-keyframes md-autocomplete-list-in{0%{opacity:0;height:0;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{opacity:0;height:40px}100%{opacity:1;height:40px}}@keyframes md-autocomplete-list-in{0%{opacity:0;height:0;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{opacity:0;height:40px}100%{opacity:1;height:40px}}md-autocomplete{box-shadow:0 2px 5px rgba(0,0,0,.25);border-radius:2px;display:block;height:40px;position:relative;overflow:visible}md-autocomplete md-autocomplete-wrap{display:block;position:relative;overflow:visible;height:40px}md-autocomplete md-autocomplete-wrap md-progress-linear{position:absolute;bottom:0;left:0;width:100%;height:3px;transition:none}md-autocomplete md-autocomplete-wrap md-progress-linear .md-container{transition:none;top:auto;height:3px}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter{transition:opacity .15s linear}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter.ng-enter-active{opacity:1}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave{transition:opacity .15s linear}md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave.ng-leave-active{opacity:0}md-autocomplete input{position:absolute;left:0;top:0;width:100%;box-sizing:border-box;border:none;box-shadow:none;padding:0 15px;font-size:14px;line-height:40px;height:40px;outline:0;z-index:2;background:0 0}md-autocomplete input::-ms-clear{display:none}md-autocomplete button{position:absolute;top:10px;right:10px;line-height:20px;z-index:2;text-align:center;width:20px;height:20px;cursor:pointer;border:none;border-radius:50%;padding:0;font-size:12px;background:0 0}md-autocomplete button:after{content:'';position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;border-radius:50%;-webkit-transform:scale(0);transform:scale(0);opacity:0;transition:all .4s cubic-bezier(.25,.8,.25,1);z-index:-1}md-autocomplete button:focus:after{-webkit-transform:scale(1);transform:scale(1);opacity:1}md-autocomplete button md-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0) scale(.9);transform:translate3d(-50%,-50%,0) scale(.9)}md-autocomplete button md-icon path{stroke-width:0}md-autocomplete button.ng-enter{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .15s ease-out;transition:transform .15s ease-out}md-autocomplete button.ng-enter.ng-enter-active{-webkit-transform:scale(1);transform:scale(1)}md-autocomplete button.ng-leave{transition:-webkit-transform .15s ease-out;transition:transform .15s ease-out}md-autocomplete button.ng-leave.ng-leave-active{-webkit-transform:scale(0);transform:scale(0)}md-autocomplete ul{position:absolute;top:100%;left:0;right:0;box-shadow:0 2px 5px rgba(0,0,0,.25);margin:0;list-style:none;padding:0;overflow:auto;max-height:225.5px;z-index:49}md-autocomplete ul li{border-top:1px solid #ddd;padding:0 15px;line-height:40px;font-size:14px;overflow:hidden;height:40px;transition:background .15s linear;cursor:pointer;margin:0}md-autocomplete ul li.ng-enter,md-autocomplete ul li.ng-hide-remove{transition:none;-webkit-animation:md-autocomplete-list-in .2s;animation:md-autocomplete-list-in .2s}md-autocomplete ul li.ng-hide-add,md-autocomplete ul li.ng-leave{transition:none;-webkit-animation:md-autocomplete-list-out .2s;animation:md-autocomplete-list-out .2s}md-backdrop{z-index:50;background-color:transparent;position:fixed;left:0;top:0;right:0;bottom:0}md-backdrop.md-select-backdrop{z-index:81}md-backdrop.md-dialog-backdrop{z-index:79}md-backdrop.md-bottom-sheet-backdrop{z-index:69}md-backdrop.md-sidenav-backdrop{z-index:59}md-backdrop.ng-enter{-webkit-animation:cubic-bezier(.25,.8,.25,1) mdBackdropFadeIn .5s both;animation:cubic-bezier(.25,.8,.25,1) mdBackdropFadeIn .5s both}md-backdrop.ng-leave{-webkit-animation:cubic-bezier(.55,0,.55,.2) mdBackdropFadeOut .2s both;animation:cubic-bezier(.55,0,.55,.2) mdBackdropFadeOut .2s both}@-webkit-keyframes mdBackdropFadeIn{from{opacity:0}to{opacity:1}}@keyframes mdBackdropFadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes mdBackdropFadeOut{from{opacity:1}to{opacity:0}}@keyframes mdBackdropFadeOut{from{opacity:1}to{opacity:0}}md-bottom-sheet{position:absolute;left:0;right:0;bottom:0;padding:8px 16px 88px;z-index:70;border-top:1px solid;-webkit-transform:translate3d(0,80px,0);transform:translate3d(0,80px,0);transition:all .4s cubic-bezier(.25,.8,.25,1);transition-property:-webkit-transform;transition-property:transform}md-bottom-sheet.md-has-header{padding-top:0}md-bottom-sheet.ng-enter{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}md-bottom-sheet.ng-enter-active{opacity:1;display:block;-webkit-transform:translate3d(0,80px,0)!important;transform:translate3d(0,80px,0)!important}md-bottom-sheet.ng-leave-active{-webkit-transform:translate3d(0,100%,0)!important;transform:translate3d(0,100%,0)!important;transition:all .3s cubic-bezier(.55,0,.55,.2)}md-bottom-sheet .md-subheader{background-color:transparent;font-family:RobotoDraft,Roboto,'Helvetica Neue',sans-serif;line-height:56px;padding:0;white-space:nowrap}md-bottom-sheet md-inline-icon{display:inline-block;height:24px;width:24px;fill:#444}md-bottom-sheet md-item{display:-webkit-flex;display:-ms-flexbox;display:flex;outline:0}md-bottom-sheet md-item:hover{cursor:pointer}md-bottom-sheet.md-list md-item{-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:48px}md-bottom-sheet.md-list md-item div.md-icon-container{display:inline-block;height:24px;margin-right:32px}md-bottom-sheet.md-grid{padding-left:24px;padding-right:24px;padding-top:0}md-bottom-sheet.md-grid md-list{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;transition:all .5s;-webkit-align-items:center;-ms-flex-align:center;align-items:center}md-bottom-sheet.md-grid md-item{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;transition:all .5s;height:96px;margin-top:8px;margin-bottom:8px}@media screen and (max-width:600px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 33.33333%;-ms-flex:1 1 33.33333%;flex:1 1 33.33333%;max-width:33.33333%}md-bottom-sheet.md-grid md-item:nth-of-type(3n+1){-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}md-bottom-sheet.md-grid md-item:nth-of-type(3n){-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}}@media screen and (min-width:600px) and (max-width:960px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 25%;-ms-flex:1 1 25%;flex:1 1 25%;max-width:25%}}@media screen and (min-width:960px) and (max-width:1200px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 16.66667%;-ms-flex:1 1 16.66667%;flex:1 1 16.66667%;max-width:16.66667%}}@media screen and (min-width:1200px){md-bottom-sheet.md-grid md-item{-webkit-flex:1 1 14.28571%;-ms-flex:1 1 14.28571%;flex:1 1 14.28571%;max-width:14.28571%}}md-bottom-sheet.md-grid md-item .md-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:48px;padding-bottom:16px}md-bottom-sheet.md-grid md-item .md-grid-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:80px}md-bottom-sheet.md-grid md-item .md-icon-container{display:inline-block;box-sizing:border-box;height:48px;width:48px;margin:0}md-bottom-sheet.md-grid md-item p.md-grid-text{font-weight:300;line-height:16px;font-size:13px;margin:0;white-space:nowrap;width:64px;text-align:center;padding-top:8px}md-card{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-card>:not(md-card-content) img,md-card>img{-webkit-order:0;-ms-flex-order:0;order:0;width:100%}md-card md-card-content{-webkit-order:1;-ms-flex-order:1;order:1;padding:16px}.md-button{color:currentColor;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;outline:0;border:0;padding:6px;margin:0;background:0 0;white-space:nowrap;text-align:center;text-transform:uppercase;font-weight:500;font-style:inherit;font-variant:inherit;font-size:inherit;font-family:inherit;line-height:inherit;text-decoration:none;cursor:pointer;overflow:hidden;transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),-webkit-transform .4s cubic-bezier(.25,.8,.25,1);transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),transform .4s cubic-bezier(.25,.8,.25,1)}.md-button:focus{outline:0}.md-button:hover{text-decoration:none}.md-button.ng-hide{transition:none}.md-button.md-cornered{border-radius:0}.md-button.md-icon{padding:0;background:0 0}.md-button.md-raised{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-button.md-fab{z-index:20;width:56px;height:56px;border-radius:50%;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);transition:.2s linear;transition-property:-webkit-transform,box-shadow;transition-property:transform,box-shadow}.md-button.md-fab.md-fab-bottom-right{top:auto;right:20px;bottom:20px;left:auto;position:absolute}.md-button.md-fab.md-fab-bottom-left{top:auto;right:auto;bottom:20px;left:20px;position:absolute}.md-button.md-fab.md-fab-top-right{top:20px;right:20px;bottom:auto;left:auto;position:absolute}.md-button.md-fab.md-fab-top-left{top:20px;right:auto;bottom:auto;left:20px;position:absolute}.md-button.md-fab md-icon{margin-top:0}.md-button.md-fab.md-mini{width:40px;height:40px}.md-button:not([disabled]).md-fab:focus,.md-button:not([disabled]).md-fab:hover,.md-button:not([disabled]).md-raised:focus,.md-button:not([disabled]).md-raised:hover{-webkit-transform:translate3d(0,-1px,0);transform:translate3d(0,-1px,0)}.md-toast-open-top .md-button.md-fab-top-left,.md-toast-open-top .md-button.md-fab-top-right{-webkit-transform:translate3d(0,42px,0);transform:translate3d(0,42px,0)}.md-toast-open-top .md-button.md-fab-top-left:not([disabled]):focus,.md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover,.md-toast-open-top .md-button.md-fab-top-right:not([disabled]):focus,.md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover{-webkit-transform:translate3d(0,41px,0);transform:translate3d(0,41px,0)}.md-toast-open-bottom .md-button.md-fab-bottom-left,.md-toast-open-bottom .md-button.md-fab-bottom-right{-webkit-transform:translate3d(0,-42px,0);transform:translate3d(0,-42px,0)}.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):focus,.md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover,.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):focus,.md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover{-webkit-transform:translate3d(0,-43px,0);transform:translate3d(0,-43px,0)}.md-button-group{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;width:100%}.md-button-group>.md-button{-webkit-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.md-button-group>.md-button:first-child{border-radius:2px 0 0 2px}.md-button-group>.md-button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}md-checkbox{display:block;margin:15px;white-space:nowrap;cursor:pointer;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-checkbox .md-container{position:relative;top:4px;display:inline-block;width:18px;height:18px}md-checkbox .md-container:after{content:'';position:absolute;top:-10px;right:-10px;bottom:-10px;left:-10px}md-checkbox .md-container .md-ripple-container{position:absolute;display:block;width:auto;height:auto;left:-15px;top:-15px;right:-15px;bottom:-15px}md-checkbox .md-icon{transition:240ms;position:absolute;top:0;left:0;width:18px;height:18px;border:2px solid;border-radius:2px}md-checkbox.md-checked .md-icon{border:none}md-checkbox[disabled]{cursor:no-drop}md-checkbox:focus .md-label:not(:empty){border-color:#000}md-checkbox.md-checked .md-icon:after{-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;left:6px;top:2px;display:table;width:6px;height:12px;border:2px solid;border-top:0;border-left:0;content:' '}md-checkbox .md-label{border:1px dotted transparent;position:relative;display:inline-block;margin-left:10px;vertical-align:middle;white-space:normal;pointer-events:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}md-content{display:block;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}md-content[md-scroll-y]{overflow-y:auto;overflow-x:hidden}md-content[md-scroll-x]{overflow-x:auto;overflow-y:hidden}md-content.md-padding{padding:8px}@media (min-width:600px){md-content.md-padding{padding:16px}}.md-dialog-container{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:0;left:0;width:100%;height:100%;z-index:80}md-dialog{opacity:0;min-width:240px;max-width:80%;max-height:80%;position:relative;overflow:hidden;box-shadow:0 27px 24px 0 rgba(0,0,0,.2);display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}md-dialog.transition-in{opacity:1;transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}md-dialog.transition-out{transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate3d(0,100%,0) scale(.2);transform:translate3d(0,100%,0) scale(.2)}md-dialog md-content{-webkit-order:1;-ms-flex-order:1;order:1;padding:24px;overflow:auto;-webkit-overflow-scrolling:touch}md-dialog md-content:not([layout=row])>:first-child:not(.md-subheader){margin-top:0}md-dialog .md-actions{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-order:2;-ms-flex-order:2;order:2;box-sizing:border-box;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:16px;min-height:40px}md-dialog .md-actions>*{margin-left:8px}md-dialog.md-content-overflow .md-actions{border-top:1px solid}md-divider{display:block;border-top:1px solid;margin:0}md-divider[md-inset]{margin-left:80px}md-grid-list{display:block;position:relative}md-grid-list md-grid-tile{display:block;position:absolute}md-grid-list md-grid-tile figure{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0}md-grid-list md-grid-tile md-grid-tile-footer,md-grid-list md-grid-tile md-grid-tile-header{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.18);overflow:hidden;position:absolute;left:0;right:0}md-grid-list md-grid-tile md-grid-tile-footer h3,md-grid-list md-grid-tile md-grid-tile-footer h4,md-grid-list md-grid-tile md-grid-tile-header h3,md-grid-list md-grid-tile md-grid-tile-header h4{font-weight:400;margin:0 0 0 16px}md-grid-list md-grid-tile md-grid-tile-footer h3,md-grid-list md-grid-tile md-grid-tile-header h3{font-size:14px}md-grid-list md-grid-tile md-grid-tile-footer h4,md-grid-list md-grid-tile md-grid-tile-header h4{font-size:12px}md-grid-list md-grid-tile md-grid-tile-header{top:0}md-grid-list md-grid-tile md-grid-tile-footer{bottom:0}md-icon{margin:auto;background-repeat:no-repeat no-repeat;display:inline-block;vertical-align:middle;fill:currentcolor;height:24px;width:24px}md-input-container{display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-x:hidden;padding:2px 2px 26px}md-input-container input[type=text],md-input-container input[type=password],md-input-container input[type=datetime],md-input-container input[type=datetime-local],md-input-container input[type=date],md-input-container input[type=month],md-input-container input[type=time],md-input-container input[type=search],md-input-container input[type=week],md-input-container input[type=number],md-input-container input[type=email],md-input-container input[type=url],md-input-container input[type=tel],md-input-container input[type=color],md-input-container textarea{-moz-appearance:none;-webkit-appearance:none}md-input-container textarea{resize:none;overflow:hidden}md-input-container .md-placeholder,md-input-container label:not(.md-no-float){-webkit-order:1;-ms-flex-order:1;order:1;pointer-events:none;-webkit-font-smoothing:antialiased;padding-left:2px;z-index:1;-webkit-transform:translate3d(0,24px,0) scale(1);transform:translate3d(0,24px,0) scale(1);-webkit-transform-origin:left top;transform-origin:left top;transition:-webkit-transform cubic-bezier(.25,.8,.25,1) .25s;transition:transform cubic-bezier(.25,.8,.25,1) .25s}md-input-container .md-placeholder{position:absolute;top:0;opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;-webkit-transform:translate3d(0,30px,0);transform:translate3d(0,30px,0)}md-input-container.md-input-focused .md-placeholder{opacity:1;-webkit-transform:translate3d(0,24px,0);transform:translate3d(0,24px,0)}md-input-container.md-input-has-value .md-placeholder{transition:none;opacity:0}md-input-container:not(.md-input-has-value) input:not(:focus){color:transparent}md-input-container .md-input{-webkit-flex:1;-ms-flex:1;flex:1;-webkit-order:2;-ms-flex-order:2;order:2;display:block;background:0 0;padding:2px 2px 1px;border-width:0 0 1px;line-height:26px;-ms-flex-preferred-size:26px;border-radius:0}md-input-container .md-input:focus{outline:0}md-input-container .md-input:invalid{outline:0;box-shadow:none}md-input-container [data-ng-messages],md-input-container [ng-messages],md-input-container [x-ng-messages],md-input-container data-ng-messages,md-input-container ng-messages,md-input-container x-ng-messages{-webkit-order:3;-ms-flex-order:3;order:3;position:relative}md-input-container .md-char-counter,md-input-container [data-ng-message],md-input-container [ng-message],md-input-container [x-ng-message],md-input-container data-ng-message,md-input-container ng-message,md-input-container x-ng-message{-webkit-font-smoothing:antialiased;position:absolute;font-size:12px;line-height:24px}md-input-container .md-char-counter.ng-enter,md-input-container [data-ng-message].ng-enter,md-input-container [ng-message].ng-enter,md-input-container [x-ng-message].ng-enter,md-input-container data-ng-message.ng-enter,md-input-container ng-message.ng-enter,md-input-container x-ng-message.ng-enter{transition:all .4s cubic-bezier(.25,.8,.25,1);transition-delay:.2s}md-input-container .md-char-counter.ng-leave,md-input-container [data-ng-message].ng-leave,md-input-container [ng-message].ng-leave,md-input-container [x-ng-message].ng-leave,md-input-container data-ng-message.ng-leave,md-input-container ng-message.ng-leave,md-input-container x-ng-message.ng-leave{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-input-container .md-char-counter.ng-enter,md-input-container .md-char-counter.ng-leave.ng-leave-active,md-input-container [data-ng-message].ng-enter,md-input-container [data-ng-message].ng-leave.ng-leave-active,md-input-container [ng-message].ng-enter,md-input-container [ng-message].ng-leave.ng-leave-active,md-input-container [x-ng-message].ng-enter,md-input-container [x-ng-message].ng-leave.ng-leave-active,md-input-container data-ng-message.ng-enter,md-input-container data-ng-message.ng-leave.ng-leave-active,md-input-container ng-message.ng-enter,md-input-container ng-message.ng-leave.ng-leave-active,md-input-container x-ng-message.ng-enter,md-input-container x-ng-message.ng-leave.ng-leave-active{opacity:0;-webkit-transform:translate3d(0,-20%,0);transform:translate3d(0,-20%,0)}md-input-container .md-char-counter.ng-enter.ng-enter-active,md-input-container .md-char-counter.ng-leave,md-input-container [data-ng-message].ng-enter.ng-enter-active,md-input-container [data-ng-message].ng-leave,md-input-container [ng-message].ng-enter.ng-enter-active,md-input-container [ng-message].ng-leave,md-input-container [x-ng-message].ng-enter.ng-enter-active,md-input-container [x-ng-message].ng-leave,md-input-container data-ng-message.ng-enter.ng-enter-active,md-input-container data-ng-message.ng-leave,md-input-container ng-message.ng-enter.ng-enter-active,md-input-container ng-message.ng-leave,md-input-container x-ng-message.ng-enter.ng-enter-active,md-input-container x-ng-message.ng-leave{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-input-container .md-char-counter{bottom:2px;right:2px}md-input-container.md-input-focused label:not(.md-no-float),md-input-container.md-input-has-value label:not(.md-no-float){-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}md-input-container .md-input.ng-invalid.ng-dirty,md-input-container.md-input-focused .md-input{padding-bottom:0;border-width:0 0 2px}[disabled] md-input-container .md-input,md-input-container .md-input[disabled]{background-position:0 bottom;background-size:3px 1px;background-repeat:repeat-x}md-list{padding:8px 0}md-item-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;box-sizing:border-box;position:relative;padding:0}.md-tile-left{min-width:56px;margin-right:-16px}.md-tile-content{-webkit-flex:1;-ms-flex:1;flex:1;padding:16px;text-overflow:ellipsis}.md-tile-content h3{margin:0 0 3px;font-weight:400;font-size:1.1em}.md-tile-content h4{margin:0 0 3px;font-weight:400;font-size:.9em}.md-tile-content p{margin:0 0 3px;font-size:.75em}.md-tile-right{padding-right:0}@-webkit-keyframes outer-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes outer-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes left-wobble{0%,100%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@keyframes left-wobble{0%,100%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@-webkit-keyframes right-wobble{0%,100%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@keyframes right-wobble{0%,100%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@-webkit-keyframes sporadic-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes sporadic-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}100%{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}md-progress-circular{width:50px;height:50px;display:block;position:relative;padding-top:0!important;margin-bottom:0!important;overflow:hidden}md-progress-circular .md-inner{width:50px;height:50px;position:relative}md-progress-circular .md-inner .md-gap{position:absolute;left:24px;right:24px;top:0;bottom:0;border-top:5px solid #000;box-sizing:border-box}md-progress-circular .md-inner .md-left,md-progress-circular .md-inner .md-right{position:absolute;top:0;height:50px;width:25px;overflow:hidden}md-progress-circular .md-inner .md-left .md-half-circle,md-progress-circular .md-inner .md-right .md-half-circle{position:absolute;top:0;width:50px;height:50px;box-sizing:border-box;border-width:5px;border-style:solid;border-color:#000 #000 transparent;border-radius:50%}md-progress-circular .md-inner .md-left{left:0}md-progress-circular .md-inner .md-left .md-half-circle{left:0;border-right-color:transparent}md-progress-circular .md-inner .md-right{right:0}md-progress-circular .md-inner .md-right .md-half-circle{right:0;border-left-color:transparent}md-progress-circular[value=\"0\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"0\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}md-progress-circular[value=\"0\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"1\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"1\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-131.4deg);transform:rotate(-131.4deg)}md-progress-circular[value=\"1\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"2\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"2\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-127.8deg);transform:rotate(-127.8deg)}md-progress-circular[value=\"2\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"3\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"3\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-124.2deg);transform:rotate(-124.2deg)}md-progress-circular[value=\"3\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"4\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"4\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-120.6deg);transform:rotate(-120.6deg)}md-progress-circular[value=\"4\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"5\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"5\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-117deg);transform:rotate(-117deg)}md-progress-circular[value=\"5\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"6\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"6\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-113.4deg);transform:rotate(-113.4deg)}md-progress-circular[value=\"6\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"7\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"7\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-109.8deg);transform:rotate(-109.8deg)}md-progress-circular[value=\"7\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"8\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"8\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-106.2deg);transform:rotate(-106.2deg)}md-progress-circular[value=\"8\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"9\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"9\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-102.6deg);transform:rotate(-102.6deg)}md-progress-circular[value=\"9\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"10\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"10\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-99deg);transform:rotate(-99deg)}md-progress-circular[value=\"10\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"11\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"11\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-95.4deg);transform:rotate(-95.4deg)}md-progress-circular[value=\"11\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"12\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"12\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-91.8deg);transform:rotate(-91.8deg)}md-progress-circular[value=\"12\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"13\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"13\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-88.2deg);transform:rotate(-88.2deg)}md-progress-circular[value=\"13\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"14\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"14\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-84.6deg);transform:rotate(-84.6deg)}md-progress-circular[value=\"14\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"15\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"15\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-81deg);transform:rotate(-81deg)}md-progress-circular[value=\"15\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"16\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"16\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-77.4deg);transform:rotate(-77.4deg)}md-progress-circular[value=\"16\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"17\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"17\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-73.8deg);transform:rotate(-73.8deg)}md-progress-circular[value=\"17\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"18\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"18\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-70.2deg);transform:rotate(-70.2deg)}md-progress-circular[value=\"18\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"19\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"19\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-66.6deg);transform:rotate(-66.6deg)}md-progress-circular[value=\"19\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"20\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"20\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-63deg);transform:rotate(-63deg)}md-progress-circular[value=\"20\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"21\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"21\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-59.4deg);transform:rotate(-59.4deg)}md-progress-circular[value=\"21\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"22\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"22\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-55.8deg);transform:rotate(-55.8deg)}md-progress-circular[value=\"22\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"23\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"23\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-52.2deg);transform:rotate(-52.2deg)}md-progress-circular[value=\"23\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"24\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"24\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-48.6deg);transform:rotate(-48.6deg)}md-progress-circular[value=\"24\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"25\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"25\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}md-progress-circular[value=\"25\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"26\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"26\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-41.4deg);transform:rotate(-41.4deg)}md-progress-circular[value=\"26\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"27\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"27\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-37.8deg);transform:rotate(-37.8deg)}md-progress-circular[value=\"27\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"28\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"28\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-34.2deg);transform:rotate(-34.2deg)}md-progress-circular[value=\"28\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"29\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"29\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-30.6deg);transform:rotate(-30.6deg)}md-progress-circular[value=\"29\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"30\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"30\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-27deg);transform:rotate(-27deg)}md-progress-circular[value=\"30\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"31\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"31\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-23.4deg);transform:rotate(-23.4deg)}md-progress-circular[value=\"31\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"32\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"32\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-19.8deg);transform:rotate(-19.8deg)}md-progress-circular[value=\"32\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"33\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"33\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-16.2deg);transform:rotate(-16.2deg)}md-progress-circular[value=\"33\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"34\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"34\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-12.6deg);transform:rotate(-12.6deg)}md-progress-circular[value=\"34\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"35\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"35\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-9deg);transform:rotate(-9deg)}md-progress-circular[value=\"35\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"36\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"36\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-5.4deg);transform:rotate(-5.4deg)}md-progress-circular[value=\"36\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"37\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"37\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(-1.8deg);transform:rotate(-1.8deg)}md-progress-circular[value=\"37\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"38\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"38\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(1.8deg);transform:rotate(1.8deg)}md-progress-circular[value=\"38\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"39\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"39\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(5.4deg);transform:rotate(5.4deg)}md-progress-circular[value=\"39\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"40\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"40\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(9deg);transform:rotate(9deg)}md-progress-circular[value=\"40\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"41\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"41\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(12.6deg);transform:rotate(12.6deg)}md-progress-circular[value=\"41\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"42\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"42\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(16.2deg);transform:rotate(16.2deg)}md-progress-circular[value=\"42\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"43\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"43\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(19.8deg);transform:rotate(19.8deg)}md-progress-circular[value=\"43\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"44\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"44\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(23.4deg);transform:rotate(23.4deg)}md-progress-circular[value=\"44\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"45\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"45\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(27deg);transform:rotate(27deg)}md-progress-circular[value=\"45\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"46\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"46\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(30.6deg);transform:rotate(30.6deg)}md-progress-circular[value=\"46\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"47\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"47\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(34.2deg);transform:rotate(34.2deg)}md-progress-circular[value=\"47\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"48\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"48\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(37.8deg);transform:rotate(37.8deg)}md-progress-circular[value=\"48\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"49\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"49\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(41.4deg);transform:rotate(41.4deg)}md-progress-circular[value=\"49\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"50\"] .md-inner .md-left .md-half-circle{-webkit-transform:rotate(135deg);transform:rotate(135deg)}md-progress-circular[value=\"50\"] .md-inner .md-right .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"50\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;border-bottom-color:transparent!important}md-progress-circular[value=\"51\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(138.6deg);transform:rotate(138.6deg)}md-progress-circular[value=\"51\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"51\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"52\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(142.2deg);transform:rotate(142.2deg)}md-progress-circular[value=\"52\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"52\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"53\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(145.8deg);transform:rotate(145.8deg)}md-progress-circular[value=\"53\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"53\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"54\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(149.4deg);transform:rotate(149.4deg)}md-progress-circular[value=\"54\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"54\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"55\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(153deg);transform:rotate(153deg)}md-progress-circular[value=\"55\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"55\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"56\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(156.6deg);transform:rotate(156.6deg)}md-progress-circular[value=\"56\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"56\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"57\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(160.2deg);transform:rotate(160.2deg)}md-progress-circular[value=\"57\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"57\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"58\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(163.8deg);transform:rotate(163.8deg)}md-progress-circular[value=\"58\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"58\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"59\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(167.4deg);transform:rotate(167.4deg)}md-progress-circular[value=\"59\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"59\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"60\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(171deg);transform:rotate(171deg)}md-progress-circular[value=\"60\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"60\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"61\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(174.6deg);transform:rotate(174.6deg)}md-progress-circular[value=\"61\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"61\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"62\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(178.2deg);transform:rotate(178.2deg)}md-progress-circular[value=\"62\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"62\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"63\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(181.8deg);transform:rotate(181.8deg)}md-progress-circular[value=\"63\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"63\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"64\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(185.4deg);transform:rotate(185.4deg)}md-progress-circular[value=\"64\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"64\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"65\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(189deg);transform:rotate(189deg)}md-progress-circular[value=\"65\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"65\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"66\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(192.6deg);transform:rotate(192.6deg)}md-progress-circular[value=\"66\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"66\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"67\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(196.2deg);transform:rotate(196.2deg)}md-progress-circular[value=\"67\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"67\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"68\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(199.8deg);transform:rotate(199.8deg)}md-progress-circular[value=\"68\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"68\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"69\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(203.4deg);transform:rotate(203.4deg)}md-progress-circular[value=\"69\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"69\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"70\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(207deg);transform:rotate(207deg)}md-progress-circular[value=\"70\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"70\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"71\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(210.6deg);transform:rotate(210.6deg)}md-progress-circular[value=\"71\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"71\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"72\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(214.2deg);transform:rotate(214.2deg)}md-progress-circular[value=\"72\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"72\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"73\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(217.8deg);transform:rotate(217.8deg)}md-progress-circular[value=\"73\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"73\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"74\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(221.4deg);transform:rotate(221.4deg)}md-progress-circular[value=\"74\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"74\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"75\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(225deg);transform:rotate(225deg)}md-progress-circular[value=\"75\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"75\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"76\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(228.6deg);transform:rotate(228.6deg)}md-progress-circular[value=\"76\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"76\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"77\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(232.2deg);transform:rotate(232.2deg)}md-progress-circular[value=\"77\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"77\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"78\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(235.8deg);transform:rotate(235.8deg)}md-progress-circular[value=\"78\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"78\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"79\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(239.4deg);transform:rotate(239.4deg)}md-progress-circular[value=\"79\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"79\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"80\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(243deg);transform:rotate(243deg)}md-progress-circular[value=\"80\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"80\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"81\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(246.6deg);transform:rotate(246.6deg)}md-progress-circular[value=\"81\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"81\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"82\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(250.2deg);transform:rotate(250.2deg)}md-progress-circular[value=\"82\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"82\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"83\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(253.8deg);transform:rotate(253.8deg)}md-progress-circular[value=\"83\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"83\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"84\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(257.4deg);transform:rotate(257.4deg)}md-progress-circular[value=\"84\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"84\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"85\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(261deg);transform:rotate(261deg)}md-progress-circular[value=\"85\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"85\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"86\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(264.6deg);transform:rotate(264.6deg)}md-progress-circular[value=\"86\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"86\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"87\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(268.2deg);transform:rotate(268.2deg)}md-progress-circular[value=\"87\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"87\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"88\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(271.8deg);transform:rotate(271.8deg)}md-progress-circular[value=\"88\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"88\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"89\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(275.4deg);transform:rotate(275.4deg)}md-progress-circular[value=\"89\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"89\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"90\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(279deg);transform:rotate(279deg)}md-progress-circular[value=\"90\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"90\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"91\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(282.6deg);transform:rotate(282.6deg)}md-progress-circular[value=\"91\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"91\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"92\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(286.2deg);transform:rotate(286.2deg)}md-progress-circular[value=\"92\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"92\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"93\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(289.8deg);transform:rotate(289.8deg)}md-progress-circular[value=\"93\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"93\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"94\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(293.4deg);transform:rotate(293.4deg)}md-progress-circular[value=\"94\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"94\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"95\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(297deg);transform:rotate(297deg)}md-progress-circular[value=\"95\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"95\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"96\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(300.6deg);transform:rotate(300.6deg)}md-progress-circular[value=\"96\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"96\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"97\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(304.2deg);transform:rotate(304.2deg)}md-progress-circular[value=\"97\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"97\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"98\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(307.8deg);transform:rotate(307.8deg)}md-progress-circular[value=\"98\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"98\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"99\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(311.4deg);transform:rotate(311.4deg)}md-progress-circular[value=\"99\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"99\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[value=\"100\"] .md-inner .md-left .md-half-circle{transition:-webkit-transform .1s linear;transition:transform .1s linear;-webkit-transform:rotate(315deg);transform:rotate(315deg)}md-progress-circular[value=\"100\"] .md-inner .md-right .md-half-circle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}md-progress-circular[value=\"100\"] .md-inner .md-gap{border-bottom-width:5px;border-bottom-style:solid;transition:border-bottom-color .1s linear}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper{-webkit-animation:outer-rotate 2.91667s linear infinite;animation:outer-rotate 2.91667s linear infinite}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner{-webkit-animation:sporadic-rotate 5.25s cubic-bezier(.35,0,.25,1) infinite;animation:sporadic-rotate 5.25s cubic-bezier(.35,0,.25,1) infinite}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle,md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-duration:1.3125s;animation-duration:1.3125s;-webkit-animation-timing-function:cubic-bezier(.35,0,.25,1);animation-timing-function:cubic-bezier(.35,0,.25,1)}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle{-webkit-animation-name:left-wobble;animation-name:left-wobble}md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle{-webkit-animation-name:right-wobble;animation-name:right-wobble}md-progress-linear{display:block;width:100%;height:5px}md-progress-linear .md-container{overflow:hidden;position:relative;height:5px;top:5px;-webkit-transform:translate(0,5px) scale(1,0);transform:translate(0,5px) scale(1,0);transition:all .3s linear}md-progress-linear .md-container.md-ready{-webkit-transform:translate(0,0) scale(1,1);transform:translate(0,0) scale(1,1)}md-progress-linear .md-bar{height:5px;position:absolute;width:100%}md-progress-linear .md-bar1,md-progress-linear .md-bar2{transition:all .2s linear}md-progress-linear[md-mode=determinate] .md-bar1{display:none}md-progress-linear[md-mode=indeterminate] .md-bar1{-webkit-animation:indeterminate1 4s infinite linear;animation:indeterminate1 4s infinite linear}md-progress-linear[md-mode=indeterminate] .md-bar2{-webkit-animation:indeterminate2 4s infinite linear;animation:indeterminate2 4s infinite linear}md-progress-linear[md-mode=buffer] .md-container{background-color:transparent!important}md-progress-linear[md-mode=buffer] .md-dashed:before{content:\"\";display:block;height:5px;width:100%;margin-top:0;position:absolute;background-color:transparent;background-size:10px 10px!important;background-position:0 -23px;-webkit-animation:buffer 3s infinite linear;animation:buffer 3s infinite linear}md-progress-linear[md-mode=query] .md-bar2{-webkit-animation:query .8s infinite cubic-bezier(.39,.575,.565,1);animation:query .8s infinite cubic-bezier(.39,.575,.565,1)}@-webkit-keyframes indeterminate1{0%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}10%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}19.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}20%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}30%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}34.99%,36.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}37%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}47%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}52%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}55%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}58%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}61.99%,69.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}70%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}80%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}85%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}88%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}91%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}92.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}93%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}100%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}}@keyframes indeterminate1{0%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}10%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}19.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}20%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}30%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}34.99%,36.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}37%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}47%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}52%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}55%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}58%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}61.99%,69.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}70%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}80%{-webkit-transform:translateX(20%) scale(.25,1);transform:translateX(20%) scale(.25,1)}85%{-webkit-transform:translateX(35%) scale(.05,1);transform:translateX(35%) scale(.05,1)}88%{-webkit-transform:translateX(35%) scale(.1,1);transform:translateX(35%) scale(.1,1)}91%{-webkit-transform:translateX(50%) scale(.1,1);transform:translateX(50%) scale(.1,1)}92.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}93%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}100%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}}@-webkit-keyframes indeterminate2{0%,25.99%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}28%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}38%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}42.99%,46.99%,49.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}50%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}60%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}70%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}79.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}}@keyframes indeterminate2{0%,25.99%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}28%{-webkit-transform:translateX(-37.5%) scale(.25,1);transform:translateX(-37.5%) scale(.25,1)}38%{-webkit-transform:translateX(37.5%) scale(.25,1);transform:translateX(37.5%) scale(.25,1)}42.99%,46.99%,49.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}50%{-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}60%{-webkit-transform:translateX(-25%) scale(.5,1);transform:translateX(-25%) scale(.5,1)}70%{-webkit-transform:translateX(25%) scale(.5,1);transform:translateX(25%) scale(.5,1)}79.99%{-webkit-transform:translateX(50%) scale(0,1);transform:translateX(50%) scale(0,1)}}@-webkit-keyframes query{0%{opacity:1;-webkit-transform:translateX(35%) scale(.3,1);transform:translateX(35%) scale(.3,1)}100%{opacity:0;-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}}@keyframes query{0%{opacity:1;-webkit-transform:translateX(35%) scale(.3,1);transform:translateX(35%) scale(.3,1)}100%{opacity:0;-webkit-transform:translateX(-50%) scale(0,1);transform:translateX(-50%) scale(0,1)}}@-webkit-keyframes buffer{0%{opacity:1;background-position:0 -23px}50%{opacity:0}100%{opacity:1;background-position:-200px -23px}}@keyframes buffer{0%{opacity:1;background-position:0 -23px}50%{opacity:0}100%{opacity:1;background-position:-200px -23px}}.md-switch-thumb,md-radio-button{display:block;margin:15px;white-space:nowrap;cursor:pointer}.md-switch-thumb input,md-radio-button input{display:none}.md-switch-thumb .md-container,md-radio-button .md-container{position:relative;top:4px;display:inline-block;width:16px;height:16px;cursor:pointer}.md-switch-thumb .md-container .md-ripple-container,md-radio-button .md-container .md-ripple-container{position:absolute;display:block;width:48px;height:48px;left:-16px;top:-16px}.md-switch-thumb .md-off,md-radio-button .md-off{position:absolute;top:0;left:0;width:16px;height:16px;border:2px solid;border-radius:50%;transition:border-color ease .28s}.md-switch-thumb .md-on,md-radio-button .md-on{position:absolute;top:0;left:0;width:16px;height:16px;border-radius:50%;transition:-webkit-transform ease .28s;transition:transform ease .28s;-webkit-transform:scale(0);transform:scale(0)}.md-switch-thumb.md-checked .md-on,md-radio-button.md-checked .md-on{-webkit-transform:scale(.55);transform:scale(.55)}.md-switch-thumb .md-label,md-radio-button .md-label{position:relative;display:inline-block;margin-left:10px;margin-right:10px;vertical-align:middle;white-space:normal;pointer-events:none;width:auto}.md-switch-thumb .circle,md-radio-button .circle{border-radius:50%}md-radio-group{border:1px dotted transparent;display:block;outline:0}.radioButtondemoBasicUsage md-radio-group{border:none}.md-select-menu-container{position:absolute;left:0;top:0;z-index:99;opacity:0}.md-select-menu-container:not(.md-clickable){pointer-events:none}.md-select-menu-container md-progress-circular{display:table;margin:24px auto!important}.md-select-menu-container.md-active{opacity:1}.md-select-menu-container.md-active md-select-menu{transition:-webkit-transform all .4s cubic-bezier(.25,.8,.25,1);transition:transform all .4s cubic-bezier(.25,.8,.25,1);transition-duration:200ms}.md-select-menu-container.md-active md-select-menu>*{opacity:1;transition:all .3s cubic-bezier(.55,0,.55,.2);transition-duration:200ms;transition-delay:100ms}.md-select-menu-container.md-leave{opacity:0;transition:all .3s cubic-bezier(.55,0,.55,.2);transition-duration:250ms}md-select{display:inline-block;margin-top:20px}md-select[disabled]:hover{cursor:default}md-select:not([disabled]):hover{cursor:pointer}md-select:not([disabled]):focus .md-select-label{border-bottom:2px solid;padding-bottom:7px}.md-select-label{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-top:9px;padding-right:32px;padding-bottom:8px;border-bottom:1px solid;font-size:.875em;line-height:.8em;position:relative;box-sizing:border-box;min-width:64px}.md-select-label .md-select-icon:after{content:'\\25BC';display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;height:100%;top:0;right:2px;speak:none;-webkit-transform:scaleY(.6) scaleX(1);transform:scaleY(.6) scaleX(1)}md-select-menu{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;box-shadow:0 2px 5px 0 rgba(0,0,0,.26);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scale(1);transform:scale(1);max-height:256px;overflow-y:scroll}md-select-menu.md-reverse{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}md-select-menu:not(.md-overflow) md-content{padding-top:8px;padding-bottom:8px}md-select-menu md-content{min-width:136px}md-select-menu>*{opacity:0}md-option{cursor:pointer;position:relative;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:auto;padding:0 16px;height:48px}md-option .md-text{width:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:.875em}md-optgroup{display:block}md-optgroup label{display:block;font-size:.75em;text-transform:uppercase;padding:16px 8px}md-optgroup md-option{padding-left:24px}md-sidenav{position:absolute;width:304px;min-width:304px;max-width:304px;bottom:0;z-index:60;background-color:#fff;overflow:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}md-sidenav.md-closed{display:none}md-sidenav.md-closed-add,md-sidenav.md-closed-remove{display:-webkit-flex;display:-ms-flexbox;display:flex;transition:0s all}md-sidenav.md-closed-add.md-closed-add-active,md-sidenav.md-closed-remove.md-closed-remove-active{transition:all .4s cubic-bezier(.25,.8,.25,1)}md-sidenav.md-locked-open-add,md-sidenav.md-locked-open-remove{position:static;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-locked-open{width:304px;min-width:304px;max-width:304px}md-sidenav.md-locked-open,md-sidenav.md-locked-open-remove.md-closed,md-sidenav.md-locked-open.md-closed,md-sidenav.md-locked-open.md-closed.md-sidenav-left,md-sidenav.md-locked-open.md-closed.md-sidenav-right{position:static;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-locked-open-remove-active{transition:width .3s cubic-bezier(.55,0,.55,.2),min-width .3s cubic-bezier(.55,0,.55,.2);width:0;min-width:0}md-sidenav.md-closed.md-locked-open-add{width:0;min-width:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}md-sidenav.md-closed.md-locked-open-add-active{transition:width .3s cubic-bezier(.55,0,.55,.2),min-width .3s cubic-bezier(.55,0,.55,.2);width:304px;min-width:304px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sidenav-backdrop.md-locked-open{display:none}.md-sidenav-left,md-sidenav{left:0;top:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sidenav-left.md-closed,md-sidenav.md-closed{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.md-sidenav-right{left:100%;top:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.md-sidenav-right.md-closed{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (max-width:360px){md-sidenav{width:85%}}@-webkit-keyframes sliderFocusThumb{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@keyframes sliderFocusThumb{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}md-slider{height:48px;position:relative;display:block;margin-left:4px;margin-right:4px;padding:0}md-slider .md-slider-wrapper{position:relative}md-slider .md-track-container{width:100%;position:absolute;top:23px;height:2px}md-slider .md-track{position:absolute;left:0;right:0;height:100%}md-slider .md-track-fill{transition:width .05s linear}md-slider .md-track-ticks{position:absolute;left:0;right:0;height:100%}md-slider .md-thumb-container{position:absolute;left:0;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);transition:left .1s linear}md-slider .md-thumb{z-index:1;position:absolute;left:-19px;top:5px;width:38px;height:38px;border-radius:38px;-webkit-transform:scale(.5);transform:scale(.5);transition:all .1s linear}md-slider .md-thumb:after{content:'';position:absolute;left:3px;top:3px;width:32px;height:32px;border-radius:32px;border:3px solid}md-slider .md-sign{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:absolute;left:-14px;top:-20px;width:28px;height:28px;border-radius:28px;-webkit-transform:scale(.4) translate3d(0,70px,0);transform:scale(.4) translate3d(0,70px,0);transition:all .2s ease-in-out}md-slider .md-sign:after{position:absolute;content:'';left:0;border-radius:16px;top:19px;border-left:14px solid transparent;border-right:14px solid transparent;border-top:16px solid;opacity:0;-webkit-transform:translate3d(0,-8px,0);transform:translate3d(0,-8px,0);transition:all .2s ease-in-out}md-slider .md-sign .md-thumb-text{z-index:1;font-size:12px;font-weight:700}md-slider .md-focus-thumb{position:absolute;left:-24px;top:0;width:48px;height:48px;border-radius:48px;display:none;opacity:0;background-color:silver;-webkit-animation:sliderFocusThumb .4s linear;animation:sliderFocusThumb .4s linear}md-slider .md-focus-ring{position:absolute;left:-24px;top:0;width:48px;height:48px;border-radius:48px;border:2px solid #D6D6D6;background-color:transparent;-webkit-transform:scale(0);transform:scale(0);transition:all .2s linear}md-slider .md-disabled-thumb{position:absolute;left:-22px;top:2px;width:44px;height:44px;border-radius:44px;-webkit-transform:scale(.35);transform:scale(.35);border:6px solid;display:none}md-slider.md-min .md-thumb:after{background-color:#fff}md-slider.md-min .md-sign{opacity:0}md-slider:focus{outline:0}md-slider.dragging .md-thumb-container,md-slider.dragging .md-track-fill{transition:none}md-slider:not([md-discrete]) .md-sign,md-slider:not([md-discrete]) .md-track-ticks{display:none}md-slider:not([md-discrete]):not([disabled]):hover .md-thumb{-webkit-transform:scale(.6);transform:scale(.6)}md-slider:not([md-discrete]):not([disabled]).active .md-focus-thumb,md-slider:not([md-discrete]):not([disabled]):focus .md-focus-thumb{display:block}md-slider:not([md-discrete]):not([disabled]).active .md-focus-ring,md-slider:not([md-discrete]):not([disabled]):focus .md-focus-ring{-webkit-transform:scale(1);transform:scale(1)}md-slider:not([md-discrete]):not([disabled]).active .md-thumb,md-slider:not([md-discrete]):not([disabled]):focus .md-thumb{-webkit-transform:scale(.85);transform:scale(.85)}md-slider[md-discrete] .md-focus-ring,md-slider[md-discrete] .md-focus-thumb{display:none}md-slider[md-discrete]:not([disabled]).active .md-sign,md-slider[md-discrete]:not([disabled]).active .md-sign:after,md-slider[md-discrete]:not([disabled]):focus .md-sign,md-slider[md-discrete]:not([disabled]):focus .md-sign:after{opacity:1;-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}md-slider[disabled] .md-sign,md-slider[disabled] .md-track-fill{display:none}md-slider[disabled] .md-thumb{-webkit-transform:scale(.35);transform:scale(.35)}md-slider[disabled] .md-disabled-thumb{display:block}.md-sticky-clone{z-index:2;top:0;left:0;right:0;position:absolute!important;-webkit-transform:translate3d(-9999px,-9999px,0);transform:translate3d(-9999px,-9999px,0)}.md-sticky-clone[sticky-state=active]{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-sticky-clone[sticky-state=active]:not(.md-sticky-no-effect):after{-webkit-animation:subheaderStickyHoverIn .3s ease-out both;animation:subheaderStickyHoverIn .3s ease-out both}@-webkit-keyframes subheaderStickyHoverIn{0%{box-shadow:0 0 0 0 transparent}100%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}}@keyframes subheaderStickyHoverIn{0%{box-shadow:0 0 0 0 transparent}100%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}}@-webkit-keyframes subheaderStickyHoverOut{0%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}100%{box-shadow:0 0 0 0 transparent}}@keyframes subheaderStickyHoverOut{0%{box-shadow:0 2px 4px 0 rgba(0,0,0,.16)}100%{box-shadow:0 0 0 0 transparent}}.md-subheader{display:block;font-size:.9em;font-weight:400;line-height:1em;padding:16px 0 16px 16px;margin:0 16px 0 0;position:relative}.md-subheader:not(.md-sticky-no-effect){transition:.2s ease-out margin}.md-subheader:not(.md-sticky-no-effect):after{position:absolute;left:0;bottom:0;top:0;right:-16px;content:''}.md-subheader:not(.md-sticky-no-effect).md-sticky-clone{z-index:2}.md-subheader:not(.md-sticky-no-effect)[sticky-state=active]{margin-top:-2px}.md-subheader:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state=active]:after{-webkit-animation:subheaderStickyHoverOut .3s ease-out both;animation:subheaderStickyHoverOut .3s ease-out both}.md-subheader .md-subheader-content{z-index:1;position:relative}md-switch{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin:15px;white-space:nowrap;cursor:pointer;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-switch .md-container{cursor:-webkit-grab;cursor:grab;width:36px;height:24px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:8px}md-switch:not([disabled]) .md-dragging,md-switch:not([disabled]).md-dragging .md-container{cursor:-webkit-grabbing;cursor:grabbing}md-switch .md-label{border-color:transparent;border-width:0}md-switch .md-bar{left:1px;width:34px;top:5px;height:14px;border-radius:8px;position:absolute}md-switch .md-thumb-container{top:2px;left:0;width:16px;position:absolute;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}md-switch.md-checked .md-thumb-container{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}md-switch .md-thumb{position:absolute;margin:0;left:0;top:0;outline:0;height:20px;width:20px;border-radius:50%;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-switch .md-thumb .md-ripple-container{position:absolute;display:block;width:auto;height:auto;left:-20px;top:-20px;right:-20px;bottom:-20px}md-switch:not(.md-dragging) .md-bar,md-switch:not(.md-dragging) .md-thumb,md-switch:not(.md-dragging) .md-thumb-container{transition:all .5s cubic-bezier(.35,0,.25,1);transition-property:-webkit-transform,background-color;transition-property:transform,background-color}md-switch:not(.md-dragging) .md-bar,md-switch:not(.md-dragging) .md-thumb{transition-delay:.05s}md-tabs{display:block;width:100%;font-weight:500;overflow:auto}.md-header{width:100%;height:48px;box-sizing:border-box;position:relative}.md-paginator{z-index:1;margin-right:-2px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:32px;min-height:100%;cursor:pointer;border:none;background-color:transparent;background-repeat:no-repeat;background-position:center center;position:absolute}.md-paginator.md-prev{left:0}.md-paginator.md-next{right:0}.md-paginator.md-next md-icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}md-tabs[center] .md-header:not(.md-paginating) .md-header-items{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.md-paginating .md-header-items-container{left:32px;right:32px}.md-header-items-container{overflow:hidden;position:absolute;left:0;right:0;height:100%;white-space:nowrap;font-size:14px;font-weight:500;text-transform:uppercase;margin:auto}.md-header-items-container .md-header-items{display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);height:100%;width:99999px}.md-tabs-content{overflow:hidden;width:100%;position:relative}.md-tabs-content .md-tab-content{height:100%}.md-tabs-content .md-tab-content.ng-hide.ng-animate{display:block!important}.md-tabs-content .md-tab-content.ng-animate{transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);-webkit-transform:translateX(0);transform:translateX(0)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-add{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-add.md-transition-rtl{-webkit-transform:translateX(100%);transform:translateX(100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove{position:absolute;-webkit-transform:translateX(100%);transform:translateX(100%);top:0;left:0;right:0;bottom:0}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.md-transition-rtl{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.ng-hide-remove-active{-webkit-transform:translateX(0);transform:translateX(0)}md-tabs-ink-bar{z-index:1;display:none;position:absolute;left:0;bottom:0;box-sizing:border-box;height:2px;margin-top:-2px;-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0}md-tabs-ink-bar.md-transition-right{transition:right .25s cubic-bezier(.35,0,.25,1),left .25s cubic-bezier(.35,0,.25,1) .075s}md-tabs-ink-bar.md-transition-left{transition:right .25s cubic-bezier(.35,0,.25,1) .075s,left .25s cubic-bezier(.35,0,.25,1)}md-tab{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:relative;z-index:0;overflow:hidden;height:100%;text-align:center;cursor:pointer;padding:20px 24px;box-sizing:border-box;transition:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}md-tab.md-tab-themed{transition:background .35s cubic-bezier(.35,0,.25,1),color .35s cubic-bezier(.35,0,.25,1)}md-tab[disabled]{pointer-events:none;cursor:default}md-tab:focus{outline:0}md-tab md-tab-label{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;z-index:100;opacity:1;overflow:hidden}.md-input-group label,md-input-group label{display:block}.md-input-group input[type=text],.md-input-group input[type=password],.md-input-group input[type=datetime],.md-input-group input[type=datetime-local],.md-input-group input[type=date],.md-input-group input[type=month],.md-input-group input[type=time],.md-input-group input[type=search],.md-input-group input[type=week],.md-input-group input[type=number],.md-input-group input[type=email],.md-input-group input[type=url],.md-input-group input[type=tel],.md-input-group input[type=color],.md-input-group textarea,md-input-group input[type=text],md-input-group input[type=password],md-input-group input[type=datetime],md-input-group input[type=datetime-local],md-input-group input[type=date],md-input-group input[type=month],md-input-group input[type=time],md-input-group input[type=search],md-input-group input[type=week],md-input-group input[type=number],md-input-group input[type=email],md-input-group input[type=url],md-input-group input[type=tel],md-input-group input[type=color],md-input-group textarea{display:block;border-width:0 0 1px;padding-top:2px;line-height:26px;padding-bottom:1px}.md-input-group input[type=text]:focus,.md-input-group input[type=password]:focus,.md-input-group input[type=datetime]:focus,.md-input-group input[type=datetime-local]:focus,.md-input-group input[type=date]:focus,.md-input-group input[type=month]:focus,.md-input-group input[type=time]:focus,.md-input-group input[type=search]:focus,.md-input-group input[type=week]:focus,.md-input-group input[type=number]:focus,.md-input-group input[type=email]:focus,.md-input-group input[type=url]:focus,.md-input-group input[type=tel]:focus,.md-input-group input[type=color]:focus,.md-input-group textarea:focus,md-input-group input[type=text]:focus,md-input-group input[type=password]:focus,md-input-group input[type=datetime]:focus,md-input-group input[type=datetime-local]:focus,md-input-group input[type=date]:focus,md-input-group input[type=month]:focus,md-input-group input[type=time]:focus,md-input-group input[type=search]:focus,md-input-group input[type=week]:focus,md-input-group input[type=number]:focus,md-input-group input[type=email]:focus,md-input-group input[type=url]:focus,md-input-group input[type=tel]:focus,md-input-group input[type=color]:focus,md-input-group textarea:focus{outline:0}.md-input-group input,.md-input-group textarea,md-input-group input,md-input-group textarea{background:0 0}.md-input-group,md-input-group{padding-bottom:2px;margin:10px 0 8px;position:relative;display:block}.md-input-group label,md-input-group label{font-size:1em;z-index:1;pointer-events:none;-webkit-font-smoothing:antialiased}.md-input-group label:hover,md-input-group label:hover{cursor:text}.md-input-group label,md-input-group label{-webkit-transform:translate3d(0,22px,0);transform:translate3d(0,22px,0);-webkit-transform-origin:left center;transform-origin:left center;transition:all .15s cubic-bezier(.35,0,.25,1)}.md-input-group input,.md-input-group textarea,md-input-group input,md-input-group textarea{border-bottom-width:1px;transition:all .15s cubic-bezier(.35,0,.25,1)}.md-input-group.md-input-focused label,md-input-group.md-input-focused label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group.md-input-focused input,.md-input-group.md-input-focused textarea,md-input-group.md-input-focused input,md-input-group.md-input-focused textarea{border-bottom-width:2px}.md-input-group.md-input-focused input,md-input-group.md-input-focused input{padding-bottom:0}.md-input-group.md-input-has-value label,.md-input-group.md-input-has-value:not(.md-input-focused) label,md-input-group.md-input-has-value label,md-input-group.md-input-has-value:not(.md-input-focused) label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group[disabled] input,.md-input-group[disabled] textarea,md-input-group[disabled] input,md-input-group[disabled] textarea{border-bottom-width:0;background-position:0 bottom;background-size:2px 1px;background-repeat:repeat-x;pointer-events:none}.md-input-group[disabled] label,md-input-group[disabled] label{-webkit-transform:translate3d(0,4px,0) scale(.75);transform:translate3d(0,4px,0) scale(.75)}.md-input-group[disabled] :not(.md-input-has-value) label,md-input-group[disabled] :not(.md-input-has-value) label{-webkit-transform:translate3d(0,22px,0);transform:translate3d(0,22px,0);-webkit-transform-origin:left center;transform-origin:left center;transition:all .15s cubic-bezier(.35,0,.25,1)}md-toast{display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;box-sizing:border-box;-webkit-align-items:center;-ms-flex-align:center;align-items:center;min-height:48px;padding-left:24px;padding-right:24px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26);border-radius:2px;font-size:14px;cursor:default;max-width:879px;max-height:40px;height:24px;z-index:90;opacity:1;-webkit-transform:translate3d(0,0,0) rotateZ(0deg);transform:translate3d(0,0,0) rotateZ(0deg);transition:all .4s cubic-bezier(.25,.8,.25,1)}md-toast.md-capsule{border-radius:24px}md-toast.ng-leave-active{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-toast.md-swipedown,md-toast.md-swipeleft,md-toast.md-swiperight,md-toast.md-swipeup{transition:all .4s cubic-bezier(.25,.8,.25,1)}md-toast.ng-enter{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}md-toast.ng-enter.md-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}md-toast.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}md-toast.ng-leave.ng-leave-active{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}md-toast.ng-leave.ng-leave-active.md-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}md-toast.ng-leave.ng-leave-active.md-swipeleft{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}md-toast.ng-leave.ng-leave-active.md-swiperight{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}md-toast .md-action{line-height:19px;margin-left:24px;cursor:pointer;text-transform:uppercase;float:right}@media (max-width:600px){md-toast{left:0;right:0;width:100%;max-width:100%;min-width:0;border-radius:0;bottom:0}md-toast.md-top{bottom:auto;top:0}}@media (min-width:600px){md-toast{min-width:288px}md-toast.md-bottom{bottom:8px}md-toast.md-left{left:8px}md-toast.md-right{right:8px}md-toast.md-top{top:8px}md-toast.ng-leave.ng-leave-active.md-swipeleft{-webkit-transform:translate3d(-100%,25%,0) rotateZ(-15deg);transform:translate3d(-100%,25%,0) rotateZ(-15deg)}md-toast.ng-leave.ng-leave-active.md-swiperight{-webkit-transform:translate3d(100%,25%,0) rotateZ(15deg);transform:translate3d(100%,25%,0) rotateZ(15deg)}md-toast.ng-leave.ng-leave-active.md-top.md-swipeleft{-webkit-transform:translate3d(-100%,0,0) rotateZ(-15deg);transform:translate3d(-100%,0,0) rotateZ(-15deg)}md-toast.ng-leave.ng-leave-active.md-top.md-swiperight{-webkit-transform:translate3d(100%,0,0) rotateZ(15deg);transform:translate3d(100%,0,0) rotateZ(15deg)}}md-toolbar{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;z-index:2;font-size:1.3em;min-height:64px;width:100%;box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}md-toolbar.md-tall{height:128px;min-height:128px;max-height:128px}md-toolbar.md-medium-tall{height:88px;min-height:88px;max-height:88px}md-toolbar.md-medium-tall .md-toolbar-tools{height:48px;min-height:48px;max-height:48px}md-toolbar .md-indent{margin-left:64px}.md-toolbar-tools{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:100%;height:64px;max-height:64px;font-size:inherit;font-weight:400;padding:0 16px;margin:0}.md-toolbar-tools>*{font-size:inherit}.md-toolbar-tools h2,.md-toolbar-tools h3{font-weight:400}.md-toolbar-tools a{color:inherit;text-decoration:none}.md-toolbar-tools .fill-height{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.md-toolbar-tools .md-tools{margin-left:auto}.md-toolbar-tools .md-button{font-size:14px}md-tooltip{position:absolute;font-size:14px;z-index:100;overflow:hidden;pointer-events:none;border-radius:4px}md-tooltip .md-background{position:absolute;border-radius:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1}md-tooltip .md-background.md-show-add{transition:all .4s cubic-bezier(.25,.8,.25,1);-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0}md-tooltip .md-background.md-show,md-tooltip .md-background.md-show-add-active{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1}md-tooltip .md-background.md-show-remove{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip .md-background.md-show-remove.md-show-remove-active{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0}md-tooltip .md-content{position:relative;max-width:240px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:8px;background:0 0;opacity:0}md-tooltip .md-content.md-show-add{transition:all .4s cubic-bezier(.25,.8,.25,1);opacity:0}md-tooltip .md-content.md-show,md-tooltip .md-content.md-show-add-active{opacity:1}md-tooltip .md-content.md-show-remove{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip .md-content.md-show-remove.md-show-remove-active{opacity:0}md-tooltip.md-hide{transition:all .3s cubic-bezier(.55,0,.55,.2)}md-tooltip.md-show{transition:all .4s cubic-bezier(.25,.8,.25,1);pointer-events:auto;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.md-whiteframe-z1{box-shadow:0 2px 5px 0 rgba(0,0,0,.26)}.md-whiteframe-z2{box-shadow:0 8px 17px rgba(0,0,0,.2)}.md-whiteframe-z3{box-shadow:0 17px 50px rgba(0,0,0,.19)}.md-whiteframe-z4{box-shadow:0 16px 28px 0 rgba(0,0,0,.22)}.md-whiteframe-z5{box-shadow:0 27px 24px 0 rgba(0,0,0,.2)}"
  },
  {
    "path": "master/shared/views/partials/404.html",
    "content": "<span>The page you're looking for could not be found.</span>"
  },
  {
    "path": "master/shared/views/partials/kubernetes-ui-menu.tmpl.html",
    "content": "<ul class=\"kubernetes-ui-menu\">\n  <li ng-repeat=\"section in menu.sections\" class=\"parent-list-item\" ng-class=\"{'parentActive' : isSectionSelected(section)}\">\n    <h2 class=\"menu-heading\" ng-if=\"section.type === 'heading'\" id=\"heading_{{ section.name | nospace }}\">\n      {{section.name}}\n    </h2>\n    <menu-link section=\"section\" ng-if=\"section.type === 'link'\"></menu-link>\n    <menu-toggle section=\"section\" ng-if=\"section.type === 'toggle'\"></menu-toggle>\n    <ul ng-if=\"section.children\" class=\"menu-nested-list\">\n      <li ng-repeat=\"child in section.children\" ng-class=\"{'childActive' : isSectionSelected(child)}\">\n        <menu-toggle section=\"child\"></menu-toggle>\n      </li>\n    </ul>\n  </li>\n</ul>\n"
  },
  {
    "path": "master/shared/views/partials/md-table.tmpl.html",
    "content": "<table class=\"md-table\">\n  <thead>\n    <tr class=\"md-table-headers-row\">\n      <th class=\"md-table-header\" ng-repeat=\"h in headers\">\n        <a href ng-if=\"handleSort(h.field)\" ng-click=\"reverse=!reverse;order(h.field,reverse)\">{{h.name}} <span class=\"md-table-caret\" ng-show=\"reverse && h.field == predicate\"><img src=\"assets/img/ic_arrow_drop_up_24px.svg\"></span><span  class=\"md-table-caret\" ng-show=\"!reverse && h.field == predicate\"><img src=\"assets/img/ic_arrow_drop_down_24px.svg\"></span></a>\n        <span ng-if=\"!handleSort(h.field)\">{{h.name}}</span>\n      </th>\n      <th class=\"md-table-header\" ng-show=\"showMore()\"></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class=\"md-table-content-row\" ng-repeat=\"c in content | filter:filters | startFrom:currentPage*count | limitTo: count\">\n      <td ng-repeat=\"h in headers\" ng-if=\"h.field == thumbs\" class=\"md-table-thumbs\">\n        <div ng-if=\"h.field == thumbs\" style=\"background-image:url({{c.thumb}})\"></div>\n      </td>\n      <td class=\"md-table-content\" ng-click=\"doSelect({data:c})\" ng-repeat=\"h in headers\" ng-class=\"customClass[h.field]\" ng-if=\"h.field != thumbs\">\n        {{c[h.field]}}\n      </td>\n      <td class=\"md-table-td-more\" ng-show=\"showMore()\">\n        <md-button aria-label=\"More\" ng-click=\"moreClick(c, $event)\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n            <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/>\n          </svg>\n        </md-button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n<div class=\"md-table-footer\" layout=\"row\">\n  <span class=\"md-table-count-info\">Rows count per page : <a href ng-click=\"goToPage(0); count=1\">1</a>, <a href ng-click=\"goToPage(0); count=10\">10</a>, <a href ng-click=\"goToPage(0); count=25\">25</a>, <a href ng-click=\"goToPage(0); count=50\">50</a>, <a href ng-click=\"goToPage(0); count=100\">100</a> (current is <strong>{{count}}</strong>)</span>\n  <span flex></span>\n  <span ng-show=\"nbOfPages() > 1\">\n    <md-button aria-label=\"Back\" class=\"md-table-footer-item\" ng-disabled=\"currentPage==0\" ng-click=\"currentPage=currentPage-1\">\n      <img src=\"assets/img/ic_keyboard_arrow_left_24px.svg\">\n    </md-button>\n    <a href ng-repeat=\"i in getNumber(nbOfPages()) track by $index\" >\n      <md-button aria-label=\"Next\" class=\"md-primary md-table-footer-item\" ng-click=\"goToPage($index)\">\n        <span ng-class=\"{ 'md-table-active-page': currentPage==$index}\">{{$index+1}}</span>\n      </md-button>\n    </a>\n    <md-button aria-label=\"Jump\" class=\"md-table-footer-item\" ng-disabled=\"currentPage==nbOfPages()-1\" ng-click=\"currentPage=currentPage+1\">\n      <img src=\"assets/img/ic_keyboard_arrow_right_24px.svg\">\n    </md-button>\n  </span>\n</div>\n"
  },
  {
    "path": "master/shared/views/partials/menu-toggle.tmpl.html",
    "content": "<md-button class=\"md-button-toggle\"\n           ng-click=\"toggle()\"\n           aria-controls=\"kubernetes-ui-menu-{{section.name | nospace}}\"\n           flex layout=\"row\"\n           aria-expanded=\"{{isOpen()}}\">\n  {{section.name}}\n  <span aria-hidden=\"true\" class=\"md-toggle-icon\" ng-class=\"{'toggled' : isOpen()}\"></span>\n  <span class=\"visually-hidden\">Toggle {{isOpen()? 'expanded' : 'collapsed'}}</span>\n</md-button>\n<ul ng-show=\"isOpen()\" id=\"kubernetes-ui-menu-{{section.name | nospace}}\" class=\"menu-toggle-list\">\n  <li ng-repeat=\"page in section.pages\">\n    <menu-link section=\"page\"></menu-link>\n  </li>\n</ul>\n"
  },
  {
    "path": "master/test/modules/controllers/.gitkeep",
    "content": ""
  },
  {
    "path": "master/test/modules/controllers/cAdvisorController.spec.js",
    "content": "'use strict';\n\ndescribe(\"cAdvisor controller\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/groupController.spec.js",
    "content": "'use strict';\n\ndescribe(\"group controller\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/listEventsController.spec.js",
    "content": "'use strict';\n\ndescribe(\"ListEventsController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/listMinionsController.spec.js",
    "content": "'use strict';\n\ndescribe(\"ListMinionsController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/listPodsController.spec.js",
    "content": "'use strict';\n\ndescribe(\"ListPodsController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/listReplicationControllersController.spec.js",
    "content": "'use strict';\n\ndescribe(\"ListReplicationControllersController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/listServicesController.spec.js",
    "content": "'use strict';\n\ndescribe(\"ListServicesController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/replicationController.js",
    "content": "'use strict';\n\ndescribe(\"replicationController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/controllers/serviceController.spec.js",
    "content": "'use strict';\n\ndescribe(\"serviceController\", function() { it(\"should work as intended\", function() {}); });\n"
  },
  {
    "path": "master/test/modules/directives/.gitkeep",
    "content": ""
  },
  {
    "path": "master/test/modules/services/.gitkeep",
    "content": ""
  },
  {
    "path": "master/vendor.base.json",
    "content": "[\n  \"../third_party/ui/bower_components/jquery/dist/jquery.min.js\",\n  \"../third_party/ui/bower_components/hammerjs/hammer.js\",\n  \"../third_party/ui/bower_components/angular/angular.js\",\n  \"../third_party/ui/bower_components/angular-cookies/angular-cookies.js\",\n  \"../third_party/ui/bower_components/angular-animate/angular-animate.js\",\n  \"../third_party/ui/bower_components/angular-json-human/dist/angular-json-human.js\",\n  \"../third_party/ui/bower_components/angular-route/angular-route.js\",\n  \"../third_party/ui/bower_components/angular-css/angular-css.js\",\n  \"../third_party/ui/bower_components/angular-aria/angular-aria.js\",\n  \"../third_party/ui/bower_components/angular-animate/angular-animate.js\",\n  \"../third_party/ui/bower_components/angular-material/angular-material.min.js\",\n  \"../third_party/ui/bower_components/angular-filter/dist/angular-filter.min.js\",\n  \"../third_party/ui/bower_components/ng-lodash/build/ng-lodash.js\",\n  \"../third_party/ui/bower_components/string-format-js/format.js\",\n  \"../third_party/ui/bower_components/sprintf/dist/sprintf.min.js\",\n  \"../third_party/ui/bower_components/jsonpath/lib/jsonpath.js\"\n]\n"
  },
  {
    "path": "master/vendor.json",
    "content": "[\n  \"shared/vendor/**/*.*\"\n]\n"
  },
  {
    "path": "server/kube-ui.go",
    "content": "/*\nCopyright 2014 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// A simple static web server for hosting the Kubernetes cluster UI.\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"mime\"\n\t\"net/http\"\n\t\"log\"\n\n\t\"k8s.io/kube-ui/data\"\n\n\tassetfs \"github.com/elazarl/go-bindata-assetfs\"\n)\n\nvar (\n\tport = flag.Int(\"port\", 8080, \"Port number to serve at.\")\n)\n\nfunc main() {\n\tflag.Parse()\n\n\t// Send correct mime type for .svg files.  TODO: remove when\n\t// https://github.com/golang/go/commit/21e47d831bafb59f22b1ea8098f709677ec8ce33\n\t// makes it into all of our supported go versions.\n\tmime.AddExtensionType(\".svg\", \"image/svg+xml\")\n\n\t// Expose files in www/ on <host>\n\tfileServer := http.FileServer(&assetfs.AssetFS{\n\t\tAsset:    data.Asset,\n\t\tAssetDir: data.AssetDir,\n\t\tPrefix:   \"app\",\n\t})\n\thttp.Handle(\"/\", fileServer)\n\n\t// TODO: Add support for serving over TLS.\n\tlog.Fatal(http.ListenAndServe(fmt.Sprintf(\"0.0.0.0:%d\", *port), nil))\n}\n"
  },
  {
    "path": "server/sidebar-menu.json",
    "content": "[]\n"
  },
  {
    "path": "test/e2e/protractor.conf.js",
    "content": "exports.config = {\n  allScriptsTimeout: 11000,\n\n  specs: ['*.js'],\n\n  capabilities: {'browserName': 'chrome'},\n\n  baseUrl: 'http://localhost:8000/app/',\n\n  framework: 'jasmine',\n\n  jasmineNodeOpts: {defaultTimeoutInterval: 30000}\n};\n"
  },
  {
    "path": "test/e2e/scenarios.js",
    "content": "'use strict';\n\n/* https://github.com/angular/protractor/blob/master/docs/toc.md */\n\ndescribe('my app', function() {\n\n  browser.get('index.html');\n\n  it('should automatically redirect to /view1 when location hash/fragment is empty', function() {\n    expect(browser.getLocationAbsUrl()).toMatch(\"/view1\");\n  });\n\n  describe('view1', function() {\n\n    beforeEach(function() { browser.get('index.html#/view1'); });\n\n    it('should render view1 when user navigates to /view1', function() {\n      expect(element.all(by.css('[ng-view] p')).first().getText()).toMatch(/partial for view 1/);\n    });\n\n  });\n\n  describe('view2', function() {\n\n    beforeEach(function() { browser.get('index.html#/view2'); });\n\n    it('should render view2 when user navigates to /view2', function() {\n      expect(element.all(by.css('[ng-view] p')).first().getText()).toMatch(/partial for view 2/);\n    });\n\n  });\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/angular/.bower.json",
    "content": "{\n  \"name\": \"angular\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular.js\",\n  \"ignore\": [],\n  \"dependencies\": {},\n  \"homepage\": \"https://github.com/angular/bower-angular\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"ba7abcfa409ba852146e6ba206693cf7bac3e359\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular.git\",\n  \"_target\": \">= 1.3.0\",\n  \"_originalSource\": \"angular\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular/README.md",
    "content": "# packaged angular\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular\n```\n\nThen add a `<script>` to your `index.html`:\n\n```html\n<script src=\"/node_modules/angular/angular.js\"></script>\n```\n\nOr `require('angular')` from your code.\n\n### bower\n\n```shell\nbower install angular\n```\n\nThen add a `<script>` to your `index.html`:\n\n```html\n<script src=\"/bower_components/angular/angular.js\"></script>\n```\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](http://docs.angularjs.org/).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular/angular-csp.css",
    "content": "/* Include this file in your html if you are using the CSP mode. */\n\n@charset \"UTF-8\";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak,\n.ng-hide:not(.ng-hide-animate) {\n  display: none !important;\n}\n\nng\\:form {\n  display: block;\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular/angular.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, document, undefined) {'use strict';\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * Angular. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning\n *   error from returned function, for cases when a particular type of error is useful.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module, ErrorConstructor) {\n  ErrorConstructor = ErrorConstructor || Error;\n  return function() {\n    var code = arguments[0],\n      prefix = '[' + (module ? module + ':' : '') + code + '] ',\n      template = arguments[1],\n      templateArgs = arguments,\n\n      message, i;\n\n    message = prefix + template.replace(/\\{\\d+\\}/g, function(match) {\n      var index = +match.slice(1, -1), arg;\n\n      if (index + 2 < templateArgs.length) {\n        return toDebugString(templateArgs[index + 2]);\n      }\n      return match;\n    });\n\n    message = message + '\\nhttp://errors.angularjs.org/1.3.15/' +\n      (module ? module + '/' : '') + code;\n    for (i = 2; i < arguments.length; i++) {\n      message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +\n        encodeURIComponent(toDebugString(arguments[i]));\n    }\n    return new ErrorConstructor(message);\n  };\n}\n\n/* We need to tell jshint what variables are being exported */\n/* global angular: true,\n  msie: true,\n  jqLite: true,\n  jQuery: true,\n  slice: true,\n  splice: true,\n  push: true,\n  toString: true,\n  ngMinErr: true,\n  angularModule: true,\n  uid: true,\n  REGEX_STRING_REGEXP: true,\n  VALIDITY_STATE_PROPERTY: true,\n\n  lowercase: true,\n  uppercase: true,\n  manualLowercase: true,\n  manualUppercase: true,\n  nodeName_: true,\n  isArrayLike: true,\n  forEach: true,\n  sortedKeys: true,\n  forEachSorted: true,\n  reverseParams: true,\n  nextUid: true,\n  setHashKey: true,\n  extend: true,\n  int: true,\n  inherit: true,\n  noop: true,\n  identity: true,\n  valueFn: true,\n  isUndefined: true,\n  isDefined: true,\n  isObject: true,\n  isString: true,\n  isNumber: true,\n  isDate: true,\n  isArray: true,\n  isFunction: true,\n  isRegExp: true,\n  isWindow: true,\n  isScope: true,\n  isFile: true,\n  isFormData: true,\n  isBlob: true,\n  isBoolean: true,\n  isPromiseLike: true,\n  trim: true,\n  escapeForRegexp: true,\n  isElement: true,\n  makeMap: true,\n  includes: true,\n  arrayRemove: true,\n  copy: true,\n  shallowCopy: true,\n  equals: true,\n  csp: true,\n  concat: true,\n  sliceArgs: true,\n  bind: true,\n  toJsonReplacer: true,\n  toJson: true,\n  fromJson: true,\n  startingTag: true,\n  tryDecodeURIComponent: true,\n  parseKeyValue: true,\n  toKeyValue: true,\n  encodeUriSegment: true,\n  encodeUriQuery: true,\n  angularInit: true,\n  bootstrap: true,\n  getTestability: true,\n  snake_case: true,\n  bindJQuery: true,\n  assertArg: true,\n  assertArgFn: true,\n  assertNotHasOwnProperty: true,\n  getter: true,\n  getBlockNodes: true,\n  hasOwnProperty: true,\n  createMap: true,\n\n  NODE_TYPE_ELEMENT: true,\n  NODE_TYPE_TEXT: true,\n  NODE_TYPE_COMMENT: true,\n  NODE_TYPE_DOCUMENT: true,\n  NODE_TYPE_DOCUMENT_FRAGMENT: true,\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @description\n *\n * # ng (core module)\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n * <div doc-module-components=\"ng\"></div>\n */\n\nvar REGEX_STRING_REGEXP = /^\\/(.+)\\/([a-z]*)$/;\n\n// The name of a form control's ValidityState property.\n// This is used so that it's possible for internal tests to create mock ValidityStates.\nvar VALIDITY_STATE_PROPERTY = 'validity';\n\n/**\n * @ngdoc function\n * @name angular.lowercase\n * @module ng\n * @kind function\n *\n * @description Converts the specified string to lowercase.\n * @param {string} string String to be converted to lowercase.\n * @returns {string} Lowercased string.\n */\nvar lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * @ngdoc function\n * @name angular.uppercase\n * @module ng\n * @kind function\n *\n * @description Converts the specified string to uppercase.\n * @param {string} string String to be converted to uppercase.\n * @returns {string} Uppercased string.\n */\nvar uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};\n\n\nvar manualLowercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})\n      : s;\n};\nvar manualUppercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})\n      : s;\n};\n\n\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\n// with correct but slower alternatives.\nif ('i' !== 'I'.toLowerCase()) {\n  lowercase = manualLowercase;\n  uppercase = manualUppercase;\n}\n\n\nvar\n    msie,             // holds major version number for IE, or NaN if UA is not IE.\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    splice            = [].splice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    uid               = 0;\n\n/**\n * documentMode is an IE-only property\n * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\n */\nmsie = document.documentMode;\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n  if (obj == null || isWindow(obj)) {\n    return false;\n  }\n\n  var length = obj.length;\n\n  if (obj.nodeType === NODE_TYPE_ELEMENT && length) {\n    return true;\n  }\n\n  return isString(obj) || isArray(obj) || length === 0 ||\n         typeof length === 'number' && length > 0 && (length - 1) in obj;\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @kind function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`\n * is the value of an object property or an array element, `key` is the object property key or\n * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n * Unlike ES262's\n * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),\n * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just\n * return the value provided.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\n\nfunction forEach(obj, iterator, context) {\n  var key, length;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        // Need to check if hasOwnProperty exists,\n        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function\n        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (isArray(obj) || isArrayLike(obj)) {\n      var isPrimitive = typeof obj !== 'object';\n      for (key = 0, length = obj.length; key < length; key++) {\n        if (isPrimitive || key in obj) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n        obj.forEach(iterator, context, obj);\n    } else {\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction sortedKeys(obj) {\n  return Object.keys(obj).sort();\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = sortedKeys(obj);\n  for (var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) { iteratorFn(key, value); };\n}\n\n/**\n * A consistent way of creating unique IDs in angular.\n *\n * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before\n * we hit number precision issues in JavaScript.\n *\n * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M\n *\n * @returns {number} an unique alpha-numeric string\n */\nfunction nextUid() {\n  return ++uid;\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  } else {\n    delete obj.$$hashKey;\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @kind function\n *\n * @description\n * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.\n * Note: Keep in mind that `angular.extend` does not support recursive merge (deep copy).\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  var h = dst.$$hashKey;\n\n  for (var i = 1, ii = arguments.length; i < ii; i++) {\n    var obj = arguments[i];\n    if (obj) {\n      var keys = Object.keys(obj);\n      for (var j = 0, jj = keys.length; j < jj; j++) {\n        var key = keys[j];\n        dst[key] = obj[key];\n      }\n    }\n  }\n\n  setHashKey(dst, h);\n  return dst;\n}\n\nfunction int(str) {\n  return parseInt(str, 10);\n}\n\n\nfunction inherit(parent, extra) {\n  return extend(Object.create(parent), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @kind function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @kind function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n     function transformer(transformationFn, value) {\n       return (transformationFn || angular.identity)(value);\n     };\n   ```\n  * @param {*} value to be returned.\n  * @returns {*} the value passed in.\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function() {return value;};}\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value) {return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value) {return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value) {\n  // http://jsperf.com/isobject4\n  return value !== null && typeof value === 'object';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value) {return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * This includes the \"special\" numbers `NaN`, `+Infinity` and `-Infinity`.\n *\n * If you wish to exclude these then you can use the native\n * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)\n * method.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value) {return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Array`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nvar isArray = Array.isArray;\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value) {return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.window === obj;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isFormData(obj) {\n  return toString.call(obj) === '[object FormData]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nfunction isPromiseLike(obj) {\n  return obj && isFunction(obj.then);\n}\n\n\nvar trim = function(value) {\n  return isString(value) ? value.trim() : value;\n};\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021\n// Prereq: s is a string.\nvar escapeForRegexp = function(s) {\n  return s.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1').\n           replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // we are a direct element\n    || (node.prop && node.attr && node.find)));  // we have an on and find method part of jQuery API\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(\",\"), i;\n  for (i = 0; i < items.length; i++)\n    obj[items[i]] = true;\n  return obj;\n}\n\n\nfunction nodeName_(element) {\n  return lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\nfunction includes(array, obj) {\n  return Array.prototype.indexOf.call(array, obj) != -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = array.indexOf(value);\n  if (index >= 0)\n    array.splice(index, 1);\n  return value;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @kind function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array.\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for arrays) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to 'destination' an exception will be thrown.\n *\n * @param {*} source The source that will be used to make a copy.\n *                   Can be any type, including primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\n *     provided, must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n <example module=\"copyExample\">\n <file name=\"index.html\">\n <div ng-controller=\"ExampleController\">\n <form novalidate class=\"simple-form\">\n Name: <input type=\"text\" ng-model=\"user.name\" /><br />\n E-mail: <input type=\"email\" ng-model=\"user.email\" /><br />\n Gender: <input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male\n <input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female<br />\n <button ng-click=\"reset()\">RESET</button>\n <button ng-click=\"update(user)\">SAVE</button>\n </form>\n <pre>form = {{user | json}}</pre>\n <pre>master = {{master | json}}</pre>\n </div>\n\n <script>\n  angular.module('copyExample', [])\n    .controller('ExampleController', ['$scope', function($scope) {\n      $scope.master= {};\n\n      $scope.update = function(user) {\n        // Example with 1 argument\n        $scope.master= angular.copy(user);\n      };\n\n      $scope.reset = function() {\n        // Example with 2 arguments\n        angular.copy($scope.master, $scope.user);\n      };\n\n      $scope.reset();\n    }]);\n </script>\n </file>\n </example>\n */\nfunction copy(source, destination, stackSource, stackDest) {\n  if (isWindow(source) || isScope(source)) {\n    throw ngMinErr('cpws',\n      \"Can't copy! Making copies of Window or Scope instances is not supported.\");\n  }\n\n  if (!destination) {\n    destination = source;\n    if (source) {\n      if (isArray(source)) {\n        destination = copy(source, [], stackSource, stackDest);\n      } else if (isDate(source)) {\n        destination = new Date(source.getTime());\n      } else if (isRegExp(source)) {\n        destination = new RegExp(source.source, source.toString().match(/[^\\/]*$/)[0]);\n        destination.lastIndex = source.lastIndex;\n      } else if (isObject(source)) {\n        var emptyObject = Object.create(Object.getPrototypeOf(source));\n        destination = copy(source, emptyObject, stackSource, stackDest);\n      }\n    }\n  } else {\n    if (source === destination) throw ngMinErr('cpi',\n      \"Can't copy! Source and destination are identical.\");\n\n    stackSource = stackSource || [];\n    stackDest = stackDest || [];\n\n    if (isObject(source)) {\n      var index = stackSource.indexOf(source);\n      if (index !== -1) return stackDest[index];\n\n      stackSource.push(source);\n      stackDest.push(destination);\n    }\n\n    var result;\n    if (isArray(source)) {\n      destination.length = 0;\n      for (var i = 0; i < source.length; i++) {\n        result = copy(source[i], null, stackSource, stackDest);\n        if (isObject(source[i])) {\n          stackSource.push(source[i]);\n          stackDest.push(result);\n        }\n        destination.push(result);\n      }\n    } else {\n      var h = destination.$$hashKey;\n      if (isArray(destination)) {\n        destination.length = 0;\n      } else {\n        forEach(destination, function(value, key) {\n          delete destination[key];\n        });\n      }\n      for (var key in source) {\n        if (source.hasOwnProperty(key)) {\n          result = copy(source[key], null, stackSource, stackDest);\n          if (isObject(source[key])) {\n            stackSource.push(source[key]);\n            stackDest.push(result);\n          }\n          destination[key] = result;\n        }\n      }\n      setHashKey(destination,h);\n    }\n\n  }\n  return destination;\n}\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @kind function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 == t2) {\n    if (t1 == 'object') {\n      if (isArray(o1)) {\n        if (!isArray(o2)) return false;\n        if ((length = o1.length) == o2.length) {\n          for (key = 0; key < length; key++) {\n            if (!equals(o1[key], o2[key])) return false;\n          }\n          return true;\n        }\n      } else if (isDate(o1)) {\n        if (!isDate(o2)) return false;\n        return equals(o1.getTime(), o2.getTime());\n      } else if (isRegExp(o1)) {\n        return isRegExp(o2) ? o1.toString() == o2.toString() : false;\n      } else {\n        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||\n          isArray(o2) || isDate(o2) || isRegExp(o2)) return false;\n        keySet = {};\n        for (key in o1) {\n          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n          if (!equals(o1[key], o2[key])) return false;\n          keySet[key] = true;\n        }\n        for (key in o2) {\n          if (!keySet.hasOwnProperty(key) &&\n              key.charAt(0) !== '$' &&\n              o2[key] !== undefined &&\n              !isFunction(o2[key])) return false;\n        }\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nvar csp = function() {\n  if (isDefined(csp.isActive_)) return csp.isActive_;\n\n  var active = !!(document.querySelector('[ng-csp]') ||\n                  document.querySelector('[data-ng-csp]'));\n\n  if (!active) {\n    try {\n      /* jshint -W031, -W054 */\n      new Function('');\n      /* jshint +W031, +W054 */\n    } catch (e) {\n      active = true;\n    }\n  }\n\n  return (csp.isActive_ = active);\n};\n\n\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/* jshint -W101 */\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @kind function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\n/* jshint +W101 */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, concat(curryArgs, arguments, 0))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @kind function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be\n * stripped since angular uses this notation internally.\n *\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\n * @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace.\n *    If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2).\n * @returns {string|undefined} JSON-ified string representing `obj`.\n */\nfunction toJson(obj, pretty) {\n  if (typeof obj === 'undefined') return undefined;\n  if (!isNumber(pretty)) {\n    pretty = pretty ? 2 : null;\n  }\n  return JSON.stringify(obj, toJsonReplacer, pretty);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @kind function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized JSON string.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone();\n  try {\n    // turns out IE does not let you set .html() on elements which\n    // are not allowed to have children. So we just ignore it.\n    element.empty();\n  } catch (e) {}\n  var elemHtml = jqLite('<div>').append(element).html();\n  try {\n    return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w\\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });\n  } catch (e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch (e) {\n    // Ignore any invalid uri component\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {}, key_value, key;\n  forEach((keyValue || \"\").split('&'), function(keyValue) {\n    if (keyValue) {\n      key_value = keyValue.replace(/\\+/g,'%20').split('=');\n      key = tryDecodeURIComponent(key_value[0]);\n      if (isDefined(key)) {\n        var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;\n        if (!hasOwnProperty.call(obj, key)) {\n          obj[key] = val;\n        } else if (isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query       = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%3B/gi, ';').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length;\n  element = jqLite(element);\n  for (i = 0; i < ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.attr(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n * found in the document will be used to define the root element to auto-bootstrap as an\n * application. To run multiple applications in an HTML document you must manually bootstrap them using\n * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * `ngApp` is the easiest, and most common way to bootstrap an application.\n *\n <example module=\"ngAppDemo\">\n   <file name=\"index.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\">\n   <file name=\"index.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = \"World\";\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var appElement,\n      module,\n      config = {};\n\n  // The element `element` has priority over any other element\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n\n    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {\n      appElement = element;\n      module = element.getAttribute(name);\n    }\n  });\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n    var candidate;\n\n    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\\\:') + ']'))) {\n      appElement = candidate;\n      module = candidate.getAttribute(name);\n    }\n  });\n  if (appElement) {\n    config.strictDi = getNgAttribute(appElement, \"strict-di\") !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up angular application.\n *\n * See: {@link guide/bootstrap Bootstrap}\n *\n * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n *\n * Angular will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts. This prevents strange results in applications, where otherwise\n * multiple instances of Angular try to work on the DOM.\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of angular application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a `config` block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n * * `strictDi` - disable automatic function annotation for the application. This is meant to\n *   assist in finding bugs which break minified code. Defaults to `false`.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === document) ? 'document' : startingTag(element);\n      //Encode angle brackets to prevent input from being sanitized to empty string #8683\n      throw ngMinErr(\n          'btstrpd',\n          \"App Already Bootstrapped with this Element '{0}'\",\n          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n\n    if (config.debugInfoEnabled) {\n      // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.\n      modules.push(['$compileProvider', function($compileProvider) {\n        $compileProvider.debugInfoEnabled(true);\n      }]);\n    }\n\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',\n       function bootstrapApply(scope, element, compile, injector) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {\n    config.debugInfoEnabled = true;\n    window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');\n  }\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    return doBootstrap();\n  };\n\n  if (isFunction(angular.resumeDeferredBootstrap)) {\n    angular.resumeDeferredBootstrap();\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.reloadWithDebugInfo\n * @module ng\n * @description\n * Use this function to reload the current application with debug information turned on.\n * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.\n *\n * See {@link ng.$compileProvider#debugInfoEnabled} for more.\n */\nfunction reloadWithDebugInfo() {\n  window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;\n  window.location.reload();\n}\n\n/**\n * @name angular.getTestability\n * @module ng\n * @description\n * Get the testability service for the instance of Angular on the given\n * element.\n * @param {DOMElement} element DOM element which is the root of angular application.\n */\nfunction getTestability(rootElement) {\n  var injector = angular.element(rootElement).injector();\n  if (!injector) {\n    throw ngMinErr('test',\n      'no injector found for element argument to getTestability');\n  }\n  return injector.get('$$testability');\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nvar bindJQueryFired = false;\nvar skipDestroyOnNextJQueryCleanData;\nfunction bindJQuery() {\n  var originalCleanData;\n\n  if (bindJQueryFired) {\n    return;\n  }\n\n  // bind to jQuery if present;\n  jQuery = window.jQuery;\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.\n  // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older\n  // versions. It will not work for sure with jQuery <1.7, though.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: JQLitePrototype.controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n\n    // All nodes removed from the DOM via various jQuery APIs like .remove()\n    // are passed through jQuery.cleanData. Monkey-patch this method to fire\n    // the $destroy event on all removed nodes.\n    originalCleanData = jQuery.cleanData;\n    jQuery.cleanData = function(elems) {\n      var events;\n      if (!skipDestroyOnNextJQueryCleanData) {\n        for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n          events = jQuery._data(elem, \"events\");\n          if (events && events.$destroy) {\n            jQuery(elem).triggerHandler('$destroy');\n          }\n        }\n      } else {\n        skipDestroyOnNextJQueryCleanData = false;\n      }\n      originalCleanData(elems);\n    };\n  } else {\n    jqLite = JQLite;\n  }\n\n  angular.element = jqLite;\n\n  // Prevent double-proxying.\n  bindJQueryFired = true;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', \"Argument '{0}' is {1}\", (name || '?'), (reason || \"required\"));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', \"hasOwnProperty is not a valid {0} name\", context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {jqLite} jqLite collection containing the nodes\n */\nfunction getBlockNodes(nodes) {\n  // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original\n  //             collection, otherwise update the original collection.\n  var node = nodes[0];\n  var endNode = nodes[nodes.length - 1];\n  var blockNodes = [node];\n\n  do {\n    node = node.nextSibling;\n    if (!node) break;\n    blockNodes.push(node);\n  } while (node !== endNode);\n\n  return jqLite(blockNodes);\n}\n\n\n/**\n * Creates a new object without a prototype. This object is useful for lookup without having to\n * guard against prototypically inherited properties via hasOwnProperty.\n *\n * Related micro-benchmarks:\n * - http://jsperf.com/object-create2\n * - http://jsperf.com/proto-map-lookup/2\n * - http://jsperf.com/for-in-vs-object-keys2\n *\n * @returns {Object}\n */\nfunction createMap() {\n  return Object.create(null);\n}\n\nvar NODE_TYPE_ELEMENT = 1;\nvar NODE_TYPE_TEXT = 3;\nvar NODE_TYPE_COMMENT = 8;\nvar NODE_TYPE_DOCUMENT = 9;\nvar NODE_TYPE_DOCUMENT_FRAGMENT = 11;\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring angular {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving Angular\n     * modules.\n     * All modules (angular core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * When passed two or more arguments, a new module is created.  If passed only one argument, an\n     * existing module (the name passed as the first argument to `module`) is retrieved.\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, controllers, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', \"Module '{0}' is not available! You either misspelled \" +\n             \"the module name or forgot to load it. If registering a module ensure that you \" +\n             \"specify the dependencies as the second argument.\", name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           *\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           *\n           * @description\n           * Name of the module.\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLater('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLater('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLater('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constant are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link ngAnimate.$animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ng.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLater('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name.\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           */\n          filter: invokeLater('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLater('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLater('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to register work which needs to be performed on module loading.\n           * For more about how to configure services, see\n           * {@link providers#provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global: toDebugString: true */\n\nfunction serializeObject(obj) {\n  var seen = [];\n\n  return JSON.stringify(obj, function(key, val) {\n    val = toJsonReplacer(key, val);\n    if (isObject(val)) {\n\n      if (seen.indexOf(val) >= 0) return '<<already seen>>';\n\n      seen.push(val);\n    }\n    return val;\n  });\n}\n\nfunction toDebugString(obj) {\n  if (typeof obj === 'function') {\n    return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n  } else if (typeof obj === 'undefined') {\n    return 'undefined';\n  } else if (typeof obj !== 'string') {\n    return serializeObject(obj);\n  }\n  return obj;\n}\n\n/* global angularModule: true,\n  version: true,\n\n  $LocaleProvider,\n  $CompileProvider,\n\n  htmlAnchorDirective,\n  inputDirective,\n  inputDirective,\n  formDirective,\n  scriptDirective,\n  selectDirective,\n  styleDirective,\n  optionDirective,\n  ngBindDirective,\n  ngBindHtmlDirective,\n  ngBindTemplateDirective,\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective,\n  ngCspDirective,\n  ngCloakDirective,\n  ngControllerDirective,\n  ngFormDirective,\n  ngHideDirective,\n  ngIfDirective,\n  ngIncludeDirective,\n  ngIncludeFillContentDirective,\n  ngInitDirective,\n  ngNonBindableDirective,\n  ngPluralizeDirective,\n  ngRepeatDirective,\n  ngShowDirective,\n  ngStyleDirective,\n  ngSwitchDirective,\n  ngSwitchWhenDirective,\n  ngSwitchDefaultDirective,\n  ngOptionsDirective,\n  ngTranscludeDirective,\n  ngModelDirective,\n  ngListDirective,\n  ngChangeDirective,\n  patternDirective,\n  patternDirective,\n  requiredDirective,\n  requiredDirective,\n  minlengthDirective,\n  minlengthDirective,\n  maxlengthDirective,\n  maxlengthDirective,\n  ngValueDirective,\n  ngModelOptionsDirective,\n  ngAttributeAliasDirectives,\n  ngEventDirectives,\n\n  $AnchorScrollProvider,\n  $AnimateProvider,\n  $BrowserProvider,\n  $CacheFactoryProvider,\n  $ControllerProvider,\n  $DocumentProvider,\n  $ExceptionHandlerProvider,\n  $FilterProvider,\n  $InterpolateProvider,\n  $IntervalProvider,\n  $HttpProvider,\n  $HttpBackendProvider,\n  $LocationProvider,\n  $LogProvider,\n  $ParseProvider,\n  $RootScopeProvider,\n  $QProvider,\n  $$QProvider,\n  $$SanitizeUriProvider,\n  $SceProvider,\n  $SceDelegateProvider,\n  $SnifferProvider,\n  $TemplateCacheProvider,\n  $TemplateRequestProvider,\n  $$TestabilityProvider,\n  $TimeoutProvider,\n  $$RAFProvider,\n  $$AsyncCallbackProvider,\n  $WindowProvider,\n  $$jqLiteProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version. This object has the\n * following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  full: '1.3.15',    // all of these placeholder strings will be replaced by grunt's\n  major: 1,    // package task\n  minor: 3,\n  dot: 15,\n  codeName: 'locality-filtration'\n};\n\n\nfunction publishExternalAPI(angular) {\n  extend(angular, {\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop': noop,\n    'bind': bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity': identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'lowercase': lowercase,\n    'uppercase': uppercase,\n    'callbacks': {counter: 0},\n    'getTestability': getTestability,\n    '$$minErr': minErr,\n    '$$csp': csp,\n    'reloadWithDebugInfo': reloadWithDebugInfo\n  });\n\n  angularModule = setupModuleLoader(window);\n  try {\n    angularModule('ngLocale');\n  } catch (e) {\n    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);\n  }\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            style: styleDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            pattern: patternDirective,\n            ngPattern: patternDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            minlength: minlengthDirective,\n            ngMinlength: minlengthDirective,\n            maxlength: maxlengthDirective,\n            ngMaxlength: maxlengthDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $http: $HttpProvider,\n        $httpBackend: $HttpBackendProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $$q: $$QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $templateCache: $TemplateCacheProvider,\n        $templateRequest: $TemplateRequestProvider,\n        $$testability: $$TestabilityProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$asyncCallback: $$AsyncCallbackProvider,\n        $$jqLite: $$jqLiteProvider\n      });\n    }\n  ]);\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* global JQLitePrototype: true,\n  addEventListenerFn: true,\n  removeEventListenerFn: true,\n  BOOLEAN_ATTR: true,\n  ALIASED_ATTR: true,\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @kind function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or \"jqLite.\"\n *\n * <div class=\"alert alert-success\">jqLite is a tiny, API-compatible subset of jQuery that allows\n * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most\n * commonly needed functionality with the goal of having a very small footprint.</div>\n *\n * To use jQuery, simply load it before `DOMContentLoaded` event fired.\n *\n * <div class=\"alert\">**Note:** all element references in Angular are always wrapped with jQuery or\n * jqLite; they are never raw DOM references.</div>\n *\n * ## Angular's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/)\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/)\n * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters\n * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`\n * - [`data()`](http://api.jquery.com/data/)\n * - [`detach()`](http://api.jquery.com/detach/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/)\n * - [`removeClass()`](http://api.jquery.com/removeClass/)\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/)\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.\n * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * Angular also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to\n *   be enabled.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n *   Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nJQLite.expando = 'ng339';\n\nvar jqCache = JQLite.cache = {},\n    jqId = 1,\n    addEventListenerFn = function(element, type, fn) {\n      element.addEventListener(type, fn, false);\n    },\n    removeEventListenerFn = function(element, type, fn) {\n      element.removeEventListener(type, fn, false);\n    };\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nJQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar MOUSE_EVENT_MAP= { mouseleave: \"mouseout\", mouseenter: \"mouseover\"};\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts snake_case to camelCase.\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction camelCase(name) {\n  return name.\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    }).\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\n}\n\nvar SINGLE_TAG_REGEXP = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, \"\", \"\"]\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteAcceptsData(node) {\n  // The window object can accept data but has no nodeType\n  // Otherwise we are only interested in elements (1) and documents (9)\n  var nodeType = node.nodeType;\n  return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = tmp || fragment.appendChild(context.createElement(\"div\"));\n    tag = (TAG_NAME_REGEXP.exec(html) || [\"\", \"\"])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, \"<$1></$2>\") + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = \"\";\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = \"\";\n  fragment.innerHTML = \"\"; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n\n  var argIsString;\n\n  if (isString(element)) {\n    element = trim(element);\n    argIsString = true;\n  }\n  if (!(this instanceof JQLite)) {\n    if (argIsString && element.charAt(0) != '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (argIsString) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element, onlyDescendants) {\n  if (!onlyDescendants) jqLiteRemoveData(element);\n\n  if (element.querySelectorAll) {\n    var descendants = element.querySelectorAll('*');\n    for (var i = 0, l = descendants.length; i < l; i++) {\n      jqLiteRemoveData(descendants[i]);\n    }\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var expandoStore = jqLiteExpandoStore(element);\n  var events = expandoStore && expandoStore.events;\n  var handle = expandoStore && expandoStore.handle;\n\n  if (!handle) return; //no listeners registered\n\n  if (!type) {\n    for (type in events) {\n      if (type !== '$destroy') {\n        removeEventListenerFn(element, type, handle);\n      }\n      delete events[type];\n    }\n  } else {\n    forEach(type.split(' '), function(type) {\n      if (isDefined(fn)) {\n        var listenerFns = events[type];\n        arrayRemove(listenerFns || [], fn);\n        if (listenerFns && listenerFns.length > 0) {\n          return;\n        }\n      }\n\n      removeEventListenerFn(element, type, handle);\n      delete events[type];\n    });\n  }\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element.ng339;\n  var expandoStore = expandoId && jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete expandoStore.data[name];\n      return;\n    }\n\n    if (expandoStore.handle) {\n      if (expandoStore.events.$destroy) {\n        expandoStore.handle({}, '$destroy');\n      }\n      jqLiteOff(element);\n    }\n    delete jqCache[expandoId];\n    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it\n  }\n}\n\n\nfunction jqLiteExpandoStore(element, createIfNecessary) {\n  var expandoId = element.ng339,\n      expandoStore = expandoId && jqCache[expandoId];\n\n  if (createIfNecessary && !expandoStore) {\n    element.ng339 = expandoId = jqNextId();\n    expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};\n  }\n\n  return expandoStore;\n}\n\n\nfunction jqLiteData(element, key, value) {\n  if (jqLiteAcceptsData(element)) {\n\n    var isSimpleSetter = isDefined(value);\n    var isSimpleGetter = !isSimpleSetter && key && !isObject(key);\n    var massGetter = !key;\n    var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);\n    var data = expandoStore && expandoStore.data;\n\n    if (isSimpleSetter) { // data('key', value)\n      data[key] = value;\n    } else {\n      if (massGetter) {  // data()\n        return data;\n      } else {\n        if (isSimpleGetter) { // data('key')\n          // don't force creation of expandoStore if it doesn't exist yet\n          return data && data[key];\n        } else { // mass-setter: data({key1: val1, key2: val2})\n          extend(data, key);\n        }\n      }\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((\" \" + (element.getAttribute('class') || '') + \" \").replace(/[\\n\\t]/g, \" \").\n      indexOf(\" \" + selector + \" \") > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    forEach(cssClasses.split(' '), function(cssClass) {\n      element.setAttribute('class', trim(\n          (\" \" + (element.getAttribute('class') || '') + \" \")\n          .replace(/[\\n\\t]/g, \" \")\n          .replace(\" \" + trim(cssClass) + \" \", \" \"))\n      );\n    });\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, \" \");\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        existingClasses += cssClass + ' ';\n      }\n    });\n\n    element.setAttribute('class', trim(existingClasses));\n  }\n}\n\n\nfunction jqLiteAddNodes(root, elements) {\n  // THIS CODE IS VERY HOT. Don't make changes without benchmarking.\n\n  if (elements) {\n\n    // if a Node (the most common case)\n    if (elements.nodeType) {\n      root[root.length++] = elements;\n    } else {\n      var length = elements.length;\n\n      // if an Array or NodeList and not a Window\n      if (typeof length === 'number' && elements.window !== elements) {\n        if (length) {\n          for (var i = 0; i < length; i++) {\n            root[root.length++] = elements[i];\n          }\n        }\n      } else {\n        root[root.length++] = elements;\n      }\n    }\n  }\n}\n\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if (element.nodeType == NODE_TYPE_DOCUMENT) {\n    element = element.documentElement;\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element) {\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if ((value = jqLite.data(element, names[i])) !== undefined) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  jqLiteDealoc(element, true);\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\nfunction jqLiteRemove(element, keepData) {\n  if (!keepData) jqLiteDealoc(element);\n  var parent = element.parentNode;\n  if (parent) parent.removeChild(element);\n}\n\n\nfunction jqLiteDocumentLoaded(action, win) {\n  win = win || window;\n  if (win.document.readyState === 'complete') {\n    // Force the action to be run async for consistent behaviour\n    // from the action's point of view\n    // i.e. it will definitely not be in a $apply\n    win.setTimeout(action);\n  } else {\n    // No need to unbind this handler as load is only ever called once\n    jqLite(win).on('load', action);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: function(fn) {\n    var fired = false;\n\n    function trigger() {\n      if (fired) return;\n      fired = true;\n      fn();\n    }\n\n    // check if document is already loaded\n    if (document.readyState === 'complete') {\n      setTimeout(trigger);\n    } else {\n      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9\n      // we can not use jqLite since we are not done loading and jQuery could be loaded later.\n      // jshint -W064\n      JQLite(window).on('load', trigger); // fallback to window.onload for others\n      // jshint +W064\n    }\n  },\n  toString: function() {\n    var value = [];\n    forEach(this, function(e) { value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[value] = true;\n});\nvar ALIASED_ATTR = {\n  'ngMinlength': 'minlength',\n  'ngMaxlength': 'maxlength',\n  'ngMin': 'min',\n  'ngMax': 'max',\n  'ngPattern': 'pattern'\n};\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;\n}\n\nfunction getAliasedAttrName(element, name) {\n  var nodeName = element.nodeName;\n  return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name];\n}\n\nforEach({\n  data: jqLiteData,\n  removeData: jqLiteRemoveData\n}, function(fn, name) {\n  JQLite[name] = fn;\n});\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element, name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = camelCase(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      return element.style[name];\n    }\n  },\n\n  attr: function(element, name, value) {\n    var lowercasedName = lowercase(name);\n    if (BOOLEAN_ATTR[lowercasedName]) {\n      if (isDefined(value)) {\n        if (!!value) {\n          element[name] = true;\n          element.setAttribute(name, lowercasedName);\n        } else {\n          element[name] = false;\n          element.removeAttribute(lowercasedName);\n        }\n      } else {\n        return (element[name] ||\n                 (element.attributes.getNamedItem(name) || noop).specified)\n               ? lowercasedName\n               : undefined;\n      }\n    } else if (isDefined(value)) {\n      element.setAttribute(name, value);\n    } else if (element.getAttribute) {\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\n      // some elements (e.g. Document) don't have get attribute, so return undefined\n      var ret = element.getAttribute(name, 2);\n      // normalize non-existing attributes to undefined (as jQuery)\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      if (isUndefined(value)) {\n        var nodeType = element.nodeType;\n        return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';\n      }\n      element.textContent = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (element.multiple && nodeName_(element) === 'select') {\n        var result = [];\n        forEach(element.options, function(option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result.length === 0 ? null : result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    jqLiteDealoc(element, true);\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name) {\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n    var nodeCount = this.length;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < nodeCount; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        // TODO: do we still need this?\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < nodeCount; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function(event, type) {\n    // jQuery specific api\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented;\n    };\n\n    var eventFns = events[type || event.type];\n    var eventFnsLength = eventFns ? eventFns.length : 0;\n\n    if (!eventFnsLength) return;\n\n    if (isUndefined(event.immediatePropagationStopped)) {\n      var originalStopImmediatePropagation = event.stopImmediatePropagation;\n      event.stopImmediatePropagation = function() {\n        event.immediatePropagationStopped = true;\n\n        if (event.stopPropagation) {\n          event.stopPropagation();\n        }\n\n        if (originalStopImmediatePropagation) {\n          originalStopImmediatePropagation.call(event);\n        }\n      };\n    }\n\n    event.isImmediatePropagationStopped = function() {\n      return event.immediatePropagationStopped === true;\n    };\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    if ((eventFnsLength > 1)) {\n      eventFns = shallowCopy(eventFns);\n    }\n\n    for (var i = 0; i < eventFnsLength; i++) {\n      if (!event.isImmediatePropagationStopped()) {\n        eventFns[i].call(element, event);\n      }\n    }\n  };\n\n  // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all\n  //       events on `element`\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  on: function jqLiteOn(element, type, fn, unsupported) {\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    // Do not add event handlers to non-elements because they will not be cleaned up.\n    if (!jqLiteAcceptsData(element)) {\n      return;\n    }\n\n    var expandoStore = jqLiteExpandoStore(element, true);\n    var events = expandoStore.events;\n    var handle = expandoStore.handle;\n\n    if (!handle) {\n      handle = expandoStore.handle = createEventHandler(element, events);\n    }\n\n    // http://jsperf.com/string-indexof-vs-split\n    var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];\n    var i = types.length;\n\n    while (i--) {\n      type = types[i];\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        events[type] = [];\n\n        if (type === 'mouseenter' || type === 'mouseleave') {\n          // Refer to jQuery's implementation of mouseenter & mouseleave\n          // Read about mouseenter and mouseleave:\n          // http://www.quirksmode.org/js/events_mouse.html#link8\n\n          jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) {\n            var target = this, related = event.relatedTarget;\n            // For mousenter/leave call the handler if related is outside the target.\n            // NB: No relatedTarget if the mouse left/entered the browser window\n            if (!related || (related !== target && !target.contains(related))) {\n              handle(event, type);\n            }\n          });\n\n        } else {\n          if (type !== '$destroy') {\n            addEventListenerFn(element, type, handle);\n          }\n        }\n        eventFns = events[type];\n      }\n      eventFns.push(fn);\n    }\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node) {\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element) {\n      if (element.nodeType === NODE_TYPE_ELEMENT)\n        children.push(element);\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    var nodeType = element.nodeType;\n    if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;\n\n    node = new JQLite(node);\n\n    for (var i = 0, ii = node.length; i < ii; i++) {\n      var child = node[i];\n      element.appendChild(child);\n    }\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === NODE_TYPE_ELEMENT) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child) {\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    wrapNode = jqLite(wrapNode).eq(0).clone()[0];\n    var parent = element.parentNode;\n    if (parent) {\n      parent.replaceChild(wrapNode, element);\n    }\n    wrapNode.appendChild(element);\n  },\n\n  remove: jqLiteRemove,\n\n  detach: function(element) {\n    jqLiteRemove(element, true);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n    newElement = new JQLite(newElement);\n\n    for (var i = 0, ii = newElement.length; i < ii; i++) {\n      var node = newElement[i];\n      parent.insertBefore(node, index.nextSibling);\n      index = node;\n    }\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className) {\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;\n  },\n\n  next: function(element) {\n    return element.nextElementSibling;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, event, extraParameters) {\n\n    var dummyEvent, eventFnsCopy, handlerArgs;\n    var eventName = event.type || event;\n    var expandoStore = jqLiteExpandoStore(element);\n    var events = expandoStore && expandoStore.events;\n    var eventFns = events && events[eventName];\n\n    if (eventFns) {\n      // Create a dummy event to pass to the handlers\n      dummyEvent = {\n        preventDefault: function() { this.defaultPrevented = true; },\n        isDefaultPrevented: function() { return this.defaultPrevented === true; },\n        stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },\n        isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },\n        stopPropagation: noop,\n        type: eventName,\n        target: element\n      };\n\n      // If a custom event was provided then extend our dummy event with it\n      if (event.type) {\n        dummyEvent = extend(dummyEvent, event);\n      }\n\n      // Copy event handlers in case event handlers array is modified during execution.\n      eventFnsCopy = shallowCopy(eventFns);\n      handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];\n\n      forEach(eventFnsCopy, function(fn) {\n        if (!dummyEvent.isImmediatePropagationStopped()) {\n          fn.apply(element, handlerArgs);\n        }\n      });\n    }\n  }\n}, function(fn, name) {\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n\n    for (var i = 0, ii = this.length; i < ii; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n\n  // bind legacy bind/unbind to on/off\n  JQLite.prototype.bind = JQLite.prototype.on;\n  JQLite.prototype.unbind = JQLite.prototype.off;\n});\n\n\n// Provider for private $$jqLite service\nfunction $$jqLiteProvider() {\n  this.$get = function $$jqLite() {\n    return extend(JQLite, {\n      hasClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteHasClass(node, classes);\n      },\n      addClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteAddClass(node, classes);\n      },\n      removeClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteRemoveClass(node, classes);\n      }\n    });\n  };\n}\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj, nextUidFn) {\n  var key = obj && obj.$$hashKey;\n\n  if (key) {\n    if (typeof key === 'function') {\n      key = obj.$$hashKey();\n    }\n    return key;\n  }\n\n  var objType = typeof obj;\n  if (objType == 'function' || (objType == 'object' && obj !== null)) {\n    key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();\n  } else {\n    key = objType + ':' + obj;\n  }\n\n  return key;\n}\n\n/**\n * HashMap which can use objects as keys\n */\nfunction HashMap(array, isolatedUid) {\n  if (isolatedUid) {\n    var uid = 0;\n    this.nextUid = function() {\n      return ++uid;\n    };\n  }\n  forEach(array, this.put, this);\n}\nHashMap.prototype = {\n  /**\n   * Store key value pair\n   * @param key key to store can be any type\n   * @param value value to store can be any type\n   */\n  put: function(key, value) {\n    this[hashKey(key, this.nextUid)] = value;\n  },\n\n  /**\n   * @param key\n   * @returns {Object} the value for the key\n   */\n  get: function(key) {\n    return this[hashKey(key, this.nextUid)];\n  },\n\n  /**\n   * Remove the key/value pair\n   * @param key\n   */\n  remove: function(key) {\n    var value = this[key = hashKey(key, this.nextUid)];\n    delete this[key];\n    return value;\n  }\n};\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @kind function\n *\n * @description\n * Creates an injector object that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *     {@link angular.module}. The `ng` module must be explicitly added.\n * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which\n *     disallows argument name annotation inference.\n * @returns {injector} Injector object. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document) {\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running Angular app\n * from outside Angular. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var fnText = fn.toString().replace(STRIP_COMMENTS, ''),\n      args = fnText.match(FN_ARGS);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      fnText,\n      argDecl,\n      last;\n\n  if (typeof fn === 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        fnText = fn.toString().replace(STRIP_COMMENTS, '');\n        argDecl = fnText.match(FN_ARGS);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {\n          arg.replace(FN_ARG, function(all, underscore, name) {\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector) {\n *     return $injector;\n *   })).toBe($injector);\n * ```\n *\n * # Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ## Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. This method of discovering\n * annotations is disallowed when the injector is in strict mode.\n * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the\n * argument names.\n *\n * ## `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ## Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @param {string} caller An optional string to provide the origin of the function call for error messages.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {!Function} fn The function to invoke. Function parameters are injected according to the\n *   {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} name Name of the service to query.\n * @returns {boolean} `true` if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * # Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * You can disallow this method by using strict injection mode.\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * # The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * # The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n\n\n\n\n/**\n * @ngdoc service\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An Angular **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand\n *                            for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is the service\n * constructor function that will be used to instantiate the service instance.\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function} constructor A class (constructor function) that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function.  This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an Angular\n * {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service**, such as a string, a number, an array, an object or a function,\n * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator\n * intercepts the creation of a service, allowing it to override or modify the behaviour of the\n * service. The object returned by the decorator may be the original service, or a new service\n * object which replaces or wraps and delegates to the original service.\n *\n * @param {string} name The name of the service to decorate.\n * @param {function()} decorator This function will be invoked when the service needs to be\n *    instantiated and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new HashMap([], true),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function(serviceName, caller) {\n            if (angular.isString(caller)) {\n              path.push(caller);\n            }\n            throw $injectorMinErr('unpr', \"Unknown provider: {0}\", path.join(' <- '));\n          })),\n      instanceCache = {},\n      instanceInjector = (instanceCache.$injector =\n          createInternalInjector(instanceCache, function(serviceName, caller) {\n            var provider = providerInjector.get(serviceName + providerSuffix, caller);\n            return instanceInjector.invoke(provider.$get, provider, undefined, serviceName);\n          }));\n\n\n  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', \"Provider '{0}' must define $get factory method.\", name);\n    }\n    return providerCache[name + providerSuffix] = provider_;\n  }\n\n  function enforceReturnValue(name, factory) {\n    return function enforcedReturnValue() {\n      var result = instanceInjector.invoke(factory, this);\n      if (isUndefined(result)) {\n        throw $injectorMinErr('undef', \"Provider '{0}' must return a value from $get factory method.\", name);\n      }\n      return result;\n    };\n  }\n\n  function factory(name, factoryFn, enforce) {\n    return provider(name, {\n      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn\n    });\n  }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val), false); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad) {\n    var runBlocks = [], moduleFn;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.put(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for (i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          /* jshint -W022 */\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', \"Failed to instantiate module {0} due to:\\n{1}\",\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName, caller) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}',\n                    serviceName + ' <- ' + path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          return cache[serviceName] = factory(serviceName, caller);\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n    function invoke(fn, self, locals, serviceName) {\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = [],\n          $inject = createInjector.$$annotate(fn, strictDi, serviceName),\n          length, i,\n          key;\n\n      for (i = 0, length = $inject.length; i < length; i++) {\n        key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(\n          locals && locals.hasOwnProperty(key)\n          ? locals[key]\n          : getService(key, serviceName)\n        );\n      }\n      if (isArray(fn)) {\n        fn = fn[length];\n      }\n\n      // http://jsperf.com/angularjs-invoke-apply-vs-switch\n      // #5388\n      return fn.apply(self, args);\n    }\n\n    function instantiate(Type, locals, serviceName) {\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      // Object creation: http://jsperf.com/create-constructor/2\n      var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null);\n      var returnedValue = invoke(Type, instance, locals, serviceName);\n\n      return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;\n    }\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: createInjector.$$annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc provider\n * @name $anchorScrollProvider\n *\n * @description\n * Use `$anchorScrollProvider` to disable automatic scrolling whenever\n * {@link ng.$location#hash $location.hash()} changes.\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $anchorScrollProvider#disableAutoScrolling\n   *\n   * @description\n   * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to\n   * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />\n   * Use this method to disable automatic scrolling.\n   *\n   * If automatic scrolling is disabled, one must explicitly call\n   * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the\n   * current hash.\n   */\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $anchorScroll\n   * @kind function\n   * @requires $window\n   * @requires $location\n   * @requires $rootScope\n   *\n   * @description\n   * When called, it checks the current value of {@link ng.$location#hash $location.hash()} and\n   * scrolls to the related element, according to the rules specified in the\n   * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).\n   *\n   * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to\n   * match any anchor whenever it changes. This can be disabled by calling\n   * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.\n   *\n   * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a\n   * vertical scroll-offset (either fixed or dynamic).\n   *\n   * @property {(number|function|jqLite)} yOffset\n   * If set, specifies a vertical scroll-offset. This is often useful when there are fixed\n   * positioned elements at the top of the page, such as navbars, headers etc.\n   *\n   * `yOffset` can be specified in various ways:\n   * - **number**: A fixed number of pixels to be used as offset.<br /><br />\n   * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return\n   *   a number representing the offset (in pixels).<br /><br />\n   * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from\n   *   the top of the page to the element's bottom will be used as offset.<br />\n   *   **Note**: The element will be taken into account only as long as its `position` is set to\n   *   `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust\n   *   their height and/or positioning according to the viewport's size.\n   *\n   * <br />\n   * <div class=\"alert alert-warning\">\n   * In order for `yOffset` to work properly, scrolling should take place on the document's root and\n   * not some child element.\n   * </div>\n   *\n   * @example\n     <example module=\"anchorScrollExample\">\n       <file name=\"index.html\">\n         <div id=\"scrollArea\" ng-controller=\"ScrollController\">\n           <a ng-click=\"gotoBottom()\">Go to bottom</a>\n           <a id=\"bottom\"></a> You're at the bottom!\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollExample', [])\n           .controller('ScrollController', ['$scope', '$location', '$anchorScroll',\n             function ($scope, $location, $anchorScroll) {\n               $scope.gotoBottom = function() {\n                 // set the location.hash to the id of\n                 // the element you wish to scroll to.\n                 $location.hash('bottom');\n\n                 // call $anchorScroll()\n                 $anchorScroll();\n               };\n             }]);\n       </file>\n       <file name=\"style.css\">\n         #scrollArea {\n           height: 280px;\n           overflow: auto;\n         }\n\n         #bottom {\n           display: block;\n           margin-top: 2000px;\n         }\n       </file>\n     </example>\n   *\n   * <hr />\n   * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).\n   * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.\n   *\n   * @example\n     <example module=\"anchorScrollOffsetExample\">\n       <file name=\"index.html\">\n         <div class=\"fixed-header\" ng-controller=\"headerCtrl\">\n           <a href=\"\" ng-click=\"gotoAnchor(x)\" ng-repeat=\"x in [1,2,3,4,5]\">\n             Go to anchor {{x}}\n           </a>\n         </div>\n         <div id=\"anchor{{x}}\" class=\"anchor\" ng-repeat=\"x in [1,2,3,4,5]\">\n           Anchor {{x}} of 5\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollOffsetExample', [])\n           .run(['$anchorScroll', function($anchorScroll) {\n             $anchorScroll.yOffset = 50;   // always scroll by 50 extra pixels\n           }])\n           .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',\n             function ($anchorScroll, $location, $scope) {\n               $scope.gotoAnchor = function(x) {\n                 var newHash = 'anchor' + x;\n                 if ($location.hash() !== newHash) {\n                   // set the $location.hash to `newHash` and\n                   // $anchorScroll will automatically scroll to it\n                   $location.hash('anchor' + x);\n                 } else {\n                   // call $anchorScroll() explicitly,\n                   // since $location.hash hasn't changed\n                   $anchorScroll();\n                 }\n               };\n             }\n           ]);\n       </file>\n       <file name=\"style.css\">\n         body {\n           padding-top: 50px;\n         }\n\n         .anchor {\n           border: 2px dashed DarkOrchid;\n           padding: 10px 10px 200px 10px;\n         }\n\n         .fixed-header {\n           background-color: rgba(0, 0, 0, 0.2);\n           height: 50px;\n           position: fixed;\n           top: 0; left: 0; right: 0;\n         }\n\n         .fixed-header > a {\n           display: inline-block;\n           margin: 5px 15px;\n         }\n       </file>\n     </example>\n   */\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // Helper function to get first anchor from a NodeList\n    // (using `Array#some()` instead of `angular#forEach()` since it's more performant\n    //  and working in all supported browsers.)\n    function getFirstAnchor(list) {\n      var result = null;\n      Array.prototype.some.call(list, function(element) {\n        if (nodeName_(element) === 'a') {\n          result = element;\n          return true;\n        }\n      });\n      return result;\n    }\n\n    function getYOffset() {\n\n      var offset = scroll.yOffset;\n\n      if (isFunction(offset)) {\n        offset = offset();\n      } else if (isElement(offset)) {\n        var elem = offset[0];\n        var style = $window.getComputedStyle(elem);\n        if (style.position !== 'fixed') {\n          offset = 0;\n        } else {\n          offset = elem.getBoundingClientRect().bottom;\n        }\n      } else if (!isNumber(offset)) {\n        offset = 0;\n      }\n\n      return offset;\n    }\n\n    function scrollTo(elem) {\n      if (elem) {\n        elem.scrollIntoView();\n\n        var offset = getYOffset();\n\n        if (offset) {\n          // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.\n          // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the\n          // top of the viewport.\n          //\n          // IF the number of pixels from the top of `elem` to the end of the page's content is less\n          // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some\n          // way down the page.\n          //\n          // This is often the case for elements near the bottom of the page.\n          //\n          // In such cases we do not need to scroll the whole `offset` up, just the difference between\n          // the top of the element and the offset, which is enough to align the top of `elem` at the\n          // desired position.\n          var elemTop = elem.getBoundingClientRect().top;\n          $window.scrollBy(0, elemTop - offset);\n        }\n      } else {\n        $window.scrollTo(0, 0);\n      }\n    }\n\n    function scroll() {\n      var hash = $location.hash(), elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) scrollTo(null);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) scrollTo(elm);\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);\n\n      // no element and hash == 'top', scroll to the top of the page\n      else if (hash === 'top') scrollTo(null);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction(newVal, oldVal) {\n          // skip the initial scroll if $location.hash is empty\n          if (newVal === oldVal && newVal === '') return;\n\n          jqLiteDocumentLoaded(function() {\n            $rootScope.$evalAsync(scroll);\n          });\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM\n * updates and calls done() callbacks.\n *\n * In order to enable animations the ngAnimate module has to be loaded.\n *\n * To see the functional implementation check out src/ngAnimate/animate.js\n */\nvar $AnimateProvider = ['$provide', function($provide) {\n\n\n  this.$$selectors = {};\n\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`\n   *   must be called once the element animation is complete. If a function is returned then the\n   *   animation service will use this function to cancel the animation whenever a cancel event is\n   *   triggered.\n   *\n   *\n   * ```js\n   *   return {\n     *     eventFn : function(element, done) {\n     *       //code to run the animation\n     *       //once complete, then run done()\n     *       return function cancellationFunction() {\n     *         //code to cancel the animation\n     *       }\n     *     }\n     *   }\n   * ```\n   *\n   * @param {string} name The name of the animation.\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    var key = name + '-animation';\n    if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',\n        \"Expecting class selector starting with '.' got '{0}'.\", name);\n    this.$$selectors[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element.\n   * When setting the classNameFilter value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if (arguments.length === 1) {\n      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;\n    }\n    return this.$$classNameFilter;\n  };\n\n  this.$get = ['$$q', '$$asyncCallback', '$rootScope', function($$q, $$asyncCallback, $rootScope) {\n\n    var currentDefer;\n\n    function runAnimationPostDigest(fn) {\n      var cancelFn, defer = $$q.defer();\n      defer.promise.$$cancelFn = function ngAnimateMaybeCancel() {\n        cancelFn && cancelFn();\n      };\n\n      $rootScope.$$postDigest(function ngAnimatePostDigest() {\n        cancelFn = fn(function ngAnimateNotifyComplete() {\n          defer.resolve();\n        });\n      });\n\n      return defer.promise;\n    }\n\n    function resolveElementClasses(element, classes) {\n      var toAdd = [], toRemove = [];\n\n      var hasClasses = createMap();\n      forEach((element.attr('class') || '').split(/\\s+/), function(className) {\n        hasClasses[className] = true;\n      });\n\n      forEach(classes, function(status, className) {\n        var hasClass = hasClasses[className];\n\n        // If the most recent class manipulation (via $animate) was to remove the class, and the\n        // element currently has the class, the class is scheduled for removal. Otherwise, if\n        // the most recent class manipulation (via $animate) was to add the class, and the\n        // element does not currently have the class, the class is scheduled to be added.\n        if (status === false && hasClass) {\n          toRemove.push(className);\n        } else if (status === true && !hasClass) {\n          toAdd.push(className);\n        }\n      });\n\n      return (toAdd.length + toRemove.length) > 0 &&\n        [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null];\n    }\n\n    function cachedClassManipulation(cache, classes, op) {\n      for (var i=0, ii = classes.length; i < ii; ++i) {\n        var className = classes[i];\n        cache[className] = op;\n      }\n    }\n\n    function asyncPromise() {\n      // only serve one instance of a promise in order to save CPU cycles\n      if (!currentDefer) {\n        currentDefer = $$q.defer();\n        $$asyncCallback(function() {\n          currentDefer.resolve();\n          currentDefer = null;\n        });\n      }\n      return currentDefer.promise;\n    }\n\n    function applyStyles(element, options) {\n      if (angular.isObject(options)) {\n        var styles = extend(options.from || {}, options.to || {});\n        element.css(styles);\n      }\n    }\n\n    /**\n     *\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service provides rudimentary DOM manipulation functions to\n     * insert, remove and move elements within the DOM, as well as adding and removing classes.\n     * This service is the core service used by the ngAnimate $animator service which provides\n     * high-level animation hooks for CSS and JavaScript.\n     *\n     * $animate is available in the AngularJS core, however, the ngAnimate module must be included\n     * to enable full out animation support. Otherwise, $animate will only perform simple DOM\n     * manipulation operations.\n     *\n     * To learn more about enabling animation support, click here to visit the {@link ngAnimate\n     * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service\n     * page}.\n     */\n    return {\n      animate: function(element, from, to) {\n        applyStyles(element, { from: from, to: to });\n        return asyncPromise();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @kind function\n       * @description Inserts the element into the DOM either after the `after` element or\n       * as the first child within the `parent` element. When the function is called a promise\n       * is returned that will be resolved at a later time.\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (if the after element is not present)\n       * @param {DOMElement} after the sibling element which will append the element\n       *   after itself\n       * @param {object=} options an optional collection of styles that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      enter: function(element, parent, after, options) {\n        applyStyles(element, options);\n        after ? after.after(element)\n              : parent.prepend(element);\n        return asyncPromise();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#leave\n       * @kind function\n       * @description Removes the element from the DOM. When the function is called a promise\n       * is returned that will be resolved at a later time.\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {object=} options an optional collection of options that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      leave: function(element, options) {\n        applyStyles(element, options);\n        element.remove();\n        return asyncPromise();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @kind function\n       * @description Moves the position of the provided element within the DOM to be placed\n       * either after the `after` element or inside of the `parent` element. When the function\n       * is called a promise is returned that will be resolved at a later time.\n       *\n       * @param {DOMElement} element the element which will be moved around within the\n       *   DOM\n       * @param {DOMElement} parent the parent element where the element will be\n       *   inserted into (if the after element is not present)\n       * @param {DOMElement} after the sibling element where the element will be\n       *   positioned next to\n       * @param {object=} options an optional collection of options that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      move: function(element, parent, after, options) {\n        // Do not remove element before insert. Removing will cause data associated with the\n        // element to be dropped. Insert will implicitly do the remove.\n        return this.enter(element, parent, after, options);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#addClass\n       * @kind function\n       * @description Adds the provided className CSS class value to the provided element.\n       * When the function is called a promise is returned that will be resolved at a later time.\n       * @param {DOMElement} element the element which will have the className value\n       *   added to it\n       * @param {string} className the CSS class which will be added to the element\n       * @param {object=} options an optional collection of options that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      addClass: function(element, className, options) {\n        return this.setClass(element, className, [], options);\n      },\n\n      $$addClassImmediately: function(element, className, options) {\n        element = jqLite(element);\n        className = !isString(className)\n                        ? (isArray(className) ? className.join(' ') : '')\n                        : className;\n        forEach(element, function(element) {\n          jqLiteAddClass(element, className);\n        });\n        applyStyles(element, options);\n        return asyncPromise();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @kind function\n       * @description Removes the provided className CSS class value from the provided element.\n       * When the function is called a promise is returned that will be resolved at a later time.\n       * @param {DOMElement} element the element which will have the className value\n       *   removed from it\n       * @param {string} className the CSS class which will be removed from the element\n       * @param {object=} options an optional collection of options that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      removeClass: function(element, className, options) {\n        return this.setClass(element, [], className, options);\n      },\n\n      $$removeClassImmediately: function(element, className, options) {\n        element = jqLite(element);\n        className = !isString(className)\n                        ? (isArray(className) ? className.join(' ') : '')\n                        : className;\n        forEach(element, function(element) {\n          jqLiteRemoveClass(element, className);\n        });\n        applyStyles(element, options);\n        return asyncPromise();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#setClass\n       * @kind function\n       * @description Adds and/or removes the given CSS classes to and from the element.\n       * When the function is called a promise is returned that will be resolved at a later time.\n       * @param {DOMElement} element the element which will have its CSS classes changed\n       *   removed from it\n       * @param {string} add the CSS classes which will be added to the element\n       * @param {string} remove the CSS class which will be removed from the element\n       * @param {object=} options an optional collection of options that will be applied to the element.\n       * @return {Promise} the animation callback promise\n       */\n      setClass: function(element, add, remove, options) {\n        var self = this;\n        var STORAGE_KEY = '$$animateClasses';\n        var createdCache = false;\n        element = jqLite(element);\n\n        var cache = element.data(STORAGE_KEY);\n        if (!cache) {\n          cache = {\n            classes: {},\n            options: options\n          };\n          createdCache = true;\n        } else if (options && cache.options) {\n          cache.options = angular.extend(cache.options || {}, options);\n        }\n\n        var classes = cache.classes;\n\n        add = isArray(add) ? add : add.split(' ');\n        remove = isArray(remove) ? remove : remove.split(' ');\n        cachedClassManipulation(classes, add, true);\n        cachedClassManipulation(classes, remove, false);\n\n        if (createdCache) {\n          cache.promise = runAnimationPostDigest(function(done) {\n            var cache = element.data(STORAGE_KEY);\n            element.removeData(STORAGE_KEY);\n\n            // in the event that the element is removed before postDigest\n            // is run then the cache will be undefined and there will be\n            // no need anymore to add or remove and of the element classes\n            if (cache) {\n              var classes = resolveElementClasses(element, cache.classes);\n              if (classes) {\n                self.$$setClassImmediately(element, classes[0], classes[1], cache.options);\n              }\n            }\n\n            done();\n          });\n          element.data(STORAGE_KEY, cache);\n        }\n\n        return cache.promise;\n      },\n\n      $$setClassImmediately: function(element, add, remove, options) {\n        add && this.$$addClassImmediately(element, add);\n        remove && this.$$removeClassImmediately(element, remove);\n        applyStyles(element, options);\n        return asyncPromise();\n      },\n\n      enabled: noop,\n      cancel: noop\n    };\n  }];\n}];\n\nfunction $$AsyncCallbackProvider() {\n  this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {\n    return $$rAF.supported\n      ? function(fn) { return $$rAF(fn); }\n      : function(fn) {\n        return $timeout(fn, 0, false);\n      };\n  }];\n}\n\n/* global stripHash: true */\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {object} $log window.console or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer) {\n  var self = this,\n      rawDocument = document[0],\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {};\n\n  self.isMock = false;\n\n  var outstandingRequestCount = 0;\n  var outstandingRequestCallbacks = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\n\n  /**\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\n   */\n  function completeOutstandingRequest(fn) {\n    try {\n      fn.apply(null, sliceArgs(arguments, 1));\n    } finally {\n      outstandingRequestCount--;\n      if (outstandingRequestCount === 0) {\n        while (outstandingRequestCallbacks.length) {\n          try {\n            outstandingRequestCallbacks.pop()();\n          } catch (e) {\n            $log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  function getHash(url) {\n    var index = url.indexOf('#');\n    return index === -1 ? '' : url.substr(index + 1);\n  }\n\n  /**\n   * @private\n   * Note: this method is used only by scenario runner\n   * TODO(vojta): prefix this method with $$ ?\n   * @param {function()} callback Function that will be called when no outstanding request\n   */\n  self.notifyWhenNoOutstandingRequests = function(callback) {\n    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire\n    // at some deterministic time in respect to the test runner's actions. Leaving things up to the\n    // regular poller would result in flaky tests.\n    forEach(pollFns, function(pollFn) { pollFn(); });\n\n    if (outstandingRequestCount === 0) {\n      callback();\n    } else {\n      outstandingRequestCallbacks.push(callback);\n    }\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Poll Watcher API\n  //////////////////////////////////////////////////////////////\n  var pollFns = [],\n      pollTimeout;\n\n  /**\n   * @name $browser#addPollFn\n   *\n   * @param {function()} fn Poll function to add\n   *\n   * @description\n   * Adds a function to the list of functions that poller periodically executes,\n   * and starts polling if not started yet.\n   *\n   * @returns {function()} the added function\n   */\n  self.addPollFn = function(fn) {\n    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);\n    pollFns.push(fn);\n    return fn;\n  };\n\n  /**\n   * @param {number} interval How often should browser call poll functions (ms)\n   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\n   *\n   * @description\n   * Configures the poller to run in the specified intervals, using the specified\n   * setTimeout fn and kicks it off.\n   */\n  function startPoller(interval, setTimeout) {\n    (function check() {\n      forEach(pollFns, function(pollFn) { pollFn(); });\n      pollTimeout = setTimeout(check, interval);\n    })();\n  }\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var cachedState, lastHistoryState,\n      lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      reloadLocation = null;\n\n  cacheState();\n  lastHistoryState = cachedState;\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of location.href.\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, pushState/replaceState is used, otherwise\n   * location.href/location.replace is used.\n   * Returns its own instance to allow chaining\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record?\n   * @param {object=} state object to use with pushState/replaceState\n   */\n  self.url = function(url, replace, state) {\n    // In modern browsers `history.state` is `null` by default; treating it separately\n    // from `undefined` would cause `$browser.url('/foo')` to change `history.state`\n    // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.\n    if (isUndefined(state)) {\n      state = null;\n    }\n\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      var sameState = lastHistoryState === state;\n\n      // Don't change anything if previous and current URLs and states match. This also prevents\n      // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.\n      // See https://github.com/angular/angular.js/commit/ffb2701\n      if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {\n        return self;\n      }\n      var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);\n      lastBrowserUrl = url;\n      lastHistoryState = state;\n      // Don't use history API if only the hash changed\n      // due to a bug in IE10/IE11 which leads\n      // to not firing a `hashchange` nor `popstate` event\n      // in some cases (see #9143).\n      if ($sniffer.history && (!sameBase || !sameState)) {\n        history[replace ? 'replaceState' : 'pushState'](state, '', url);\n        cacheState();\n        // Do the assignment again so that those two variables are referentially identical.\n        lastHistoryState = cachedState;\n      } else {\n        if (!sameBase) {\n          reloadLocation = url;\n        }\n        if (replace) {\n          location.replace(url);\n        } else if (!sameBase) {\n          location.href = url;\n        } else {\n          location.hash = getHash(url);\n        }\n      }\n      return self;\n    // getter\n    } else {\n      // - reloadLocation is needed as browsers don't allow to read out\n      //   the new location.href if a reload happened.\n      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\n      return reloadLocation || location.href.replace(/%27/g,\"'\");\n    }\n  };\n\n  /**\n   * @name $browser#state\n   *\n   * @description\n   * This method is a getter.\n   *\n   * Return history.state or null if history.state is undefined.\n   *\n   * @returns {object} state\n   */\n  self.state = function() {\n    return cachedState;\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function cacheStateAndFireUrlChange() {\n    cacheState();\n    fireUrlChange();\n  }\n\n  function getCurrentState() {\n    try {\n      return history.state;\n    } catch (e) {\n      // MSIE can reportedly throw when there is no state (UNCONFIRMED).\n    }\n  }\n\n  // This variable should be used *only* inside the cacheState function.\n  var lastCachedState = null;\n  function cacheState() {\n    // This should be the only place in $browser where `history.state` is read.\n    cachedState = getCurrentState();\n    cachedState = isUndefined(cachedState) ? null : cachedState;\n\n    // Prevent callbacks fo fire twice if both hashchange & popstate were fired.\n    if (equals(cachedState, lastCachedState)) {\n      cachedState = lastCachedState;\n    }\n    lastCachedState = cachedState;\n  }\n\n  function fireUrlChange() {\n    if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) {\n      return;\n    }\n\n    lastBrowserUrl = self.url();\n    lastHistoryState = cachedState;\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url(), cachedState);\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of angular:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);\n      // hashchange event\n      jqLite(window).on('hashchange', cacheStateAndFireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  /**\n   * Checks whether the url has changed outside of Angular.\n   * Needs to be exported to be able to check for changes that have been done in sync,\n   * as hashchange/popstate events fire in async.\n   */\n  self.$$checkUrlChange = fireUrlChange;\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?\\:)?\\/\\/[^\\/]*/, '') : '';\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Cookies API\n  //////////////////////////////////////////////////////////////\n  var lastCookies = {};\n  var lastCookieString = '';\n  var cookiePath = self.baseHref();\n\n  function safeDecodeURIComponent(str) {\n    try {\n      return decodeURIComponent(str);\n    } catch (e) {\n      return str;\n    }\n  }\n\n  /**\n   * @name $browser#cookies\n   *\n   * @param {string=} name Cookie name\n   * @param {string=} value Cookie value\n   *\n   * @description\n   * The cookies method provides a 'private' low level access to browser cookies.\n   * It is not meant to be used directly, use the $cookie service instead.\n   *\n   * The return values vary depending on the arguments that the method was called with as follows:\n   *\n   * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify\n   *   it\n   * - cookies(name, value) -> set name to value, if value is undefined delete the cookie\n   * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that\n   *   way)\n   *\n   * @returns {Object} Hash of all cookies (if called without any parameter)\n   */\n  self.cookies = function(name, value) {\n    var cookieLength, cookieArray, cookie, i, index;\n\n    if (name) {\n      if (value === undefined) {\n        rawDocument.cookie = encodeURIComponent(name) + \"=;path=\" + cookiePath +\n                                \";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n      } else {\n        if (isString(value)) {\n          cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) +\n                                ';path=' + cookiePath).length + 1;\n\n          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n          // - 300 cookies\n          // - 20 cookies per unique domain\n          // - 4096 bytes per cookie\n          if (cookieLength > 4096) {\n            $log.warn(\"Cookie '\" + name +\n              \"' possibly not set or overflowed because it was too large (\" +\n              cookieLength + \" > 4096 bytes)!\");\n          }\n        }\n      }\n    } else {\n      if (rawDocument.cookie !== lastCookieString) {\n        lastCookieString = rawDocument.cookie;\n        cookieArray = lastCookieString.split(\"; \");\n        lastCookies = {};\n\n        for (i = 0; i < cookieArray.length; i++) {\n          cookie = cookieArray[i];\n          index = cookie.indexOf('=');\n          if (index > 0) { //ignore nameless cookies\n            name = safeDecodeURIComponent(cookie.substring(0, index));\n            // the first value that is seen for a cookie is the most\n            // specific one.  values for the same cookie name that\n            // follow are for less specific paths.\n            if (lastCookies[name] === undefined) {\n              lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));\n            }\n          }\n        }\n      }\n      return lastCookies;\n    }\n  };\n\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay) {\n    var timeoutId;\n    outstandingRequestCount++;\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      completeOutstandingRequest(fn);\n    }, delay || 0);\n    pendingDeferIds[timeoutId] = true;\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds[deferId]) {\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      completeOutstandingRequest(noop);\n      return true;\n    }\n    return false;\n  };\n\n}\n\nfunction $BrowserProvider() {\n  this.$get = ['$window', '$log', '$sniffer', '$document',\n      function($window, $log, $sniffer, $document) {\n        return new Browser($window, $document, $log, $sniffer);\n      }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\">\n     <file name=\"index.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             if ($scope.cache.get(key) === undefined) {\n               $scope.keys.push(key);\n             }\n             $scope.cache.put(key, value === undefined ? null : value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', \"CacheId '{0}' is already taken!\", cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = {},\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = {},\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $http $http} and the {@link ng.directive:script script} directive to cache\n       * templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @kind function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (isUndefined(value)) return;\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @kind function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @kind function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry == freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry == staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @kind function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = {};\n          size = 0;\n          lruHash = {};\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @kind function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @kind function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      };\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry != freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd == entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry != prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n *\n * @description\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, or by consuming the\n * `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,\n * element with ng-app attribute), otherwise the template will be ignored.\n *\n * Adding via the `$templateCache` service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your HTML:\n * ```html\n * <div ng-include=\" 'templateId.html' \"></div>\n * ```\n *\n * or get it via Javascript:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n * See {@link ng.$cacheFactory $cacheFactory}.\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @kind function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a \"Directive Definition Object\" (see below) that defines the directive properties,\n * or just the `postLink` function (all other properties will have the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       priority: 0,\n *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       transclude: false,\n *       restrict: 'A',\n *       templateNamespace: 'html',\n *       scope: false,\n *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       controllerAs: 'stringAlias',\n *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       compile: function compile(tElement, tAttrs, transclude) {\n *         return {\n *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *           post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // link: {\n *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // link: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `multiElement`\n * When this property is set to true, the HTML compiler will collect DOM nodes between\n * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them\n * together as the directive elements. It is recommended that this feature be used on directives\n * which are not strictly behavioural (such as {@link ngClick}), and which\n * do not manipulate or replace child nodes (such as {@link ngInclude}).\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined). Note that expressions\n * and other directives used in the directive's template will also be excluded from execution.\n *\n * #### `scope`\n * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the\n * same element request a new scope, only one new scope is created. The new scope rule does not\n * apply for the root of the template since the root of the template always gets a new scope.\n *\n * **If set to `{}` (object hash),** then a new \"isolate\" scope is created. The 'isolate' scope differs from\n * normal scope in that it does not prototypically inherit from the parent scope. This is useful\n * when creating reusable components, which should not accidentally read or modify data in the\n * parent scope.\n *\n * The 'isolate' scope takes an object hash which defines a set of local scope properties\n * derived from the parent scope. These local properties are useful for aliasing values for\n * templates. Locals definition is a hash of local scope property to its source:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified  then the\n *   attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"hello {{name}}\">` and widget definition\n *   of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect\n *   the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the\n *   `localName` property on the widget scope. The `name` is read from the parent scope (not\n *   component scope).\n *\n * * `=` or `=attr` - set up bi-directional binding between a local scope property and the\n *   parent scope property of name defined via the value of the `attr` attribute. If no `attr`\n *   name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"parentModel\">` and widget definition of\n *   `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent\n *   scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You\n *   can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If\n *   you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use\n *   `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional).\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name. Given `<widget my-attr=\"count = count + value\">` and widget definition of\n *   `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to\n *   a function wrapper for the `count = count + value` expression. Often it's desirable to\n *   pass data from the isolated scope via an expression to the parent scope, this can be\n *   done by passing a map of local variable names and values into the expression wrapper fn.\n *   For example, if the expression is `increment(amount)` then we can specify the amount value\n *   by calling the `localFn` as `localFn({amount: 22})`.\n *\n *\n * #### `bindToController`\n * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will\n * allow a component to have its properties bound to the controller, rather than to scope. When the controller\n * is instantiated, the initial values of the isolate scope bindings are already available.\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and it is shared with other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:\n *   `function([scope], cloneLinkingFn, futureParentElement)`.\n *    * `scope`: optional argument to override the scope.\n *    * `cloneLinkingFn`: optional argument to create clones of the original transcluded content.\n *    * `futureParentElement`:\n *        * defines the parent to which the `cloneLinkingFn` will add the cloned elements.\n *        * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.\n *        * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)\n *          and when the `cloneLinkinFn` is passed,\n *          as those elements need to created and cloned in a special way when they are defined outside their\n *          usual containers (e.g. like `<svg>`).\n *        * See also the `directive.templateNamespace` property.\n *\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the\n * injected argument will be an array in corresponding order. If no such directive can be\n * found, or if the directive does not have a controller, then an error is raised (unless no link function\n * is specified, in which case error checking is skipped). The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.\n * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass\n *   `null` to the `link` fn if not found.\n * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass\n *   `null` to the `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Controller alias at the directive scope. An alias for the controller so it\n * can be referenced at the directive template. The directive needs to define a scope for this\n * configuration to be used. Useful in the case when directive is used as component.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the defaults (elements and attributes) are used.\n *\n * * `E` - Element name (default): `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `templateNamespace`\n * String representing the document type used by the markup in the template.\n * AngularJS needs this information as those elements need to be created and cloned\n * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.\n *\n * * `html` - All root nodes in the template are HTML. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).\n * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).\n *\n * If no `templateNamespace` is specified, then the namespace is considered to be `html`.\n *\n * #### `template`\n * HTML markup that may:\n * * Replace the contents of the directive's element (default).\n * * Replace the directive's element itself (if `replace` is true - DEPRECATED).\n * * Wrap the contents of the directive's element (if `transclude` is true).\n *\n * Value may be:\n *\n * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.\n * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`\n *   function api below) and returns a string value.\n *\n *\n * #### `templateUrl`\n * This is similar to `template` but the template is loaded from the specified URL, asynchronously.\n *\n * Because template loading is asynchronous the compiler will suspend compilation of directives on that element\n * for later when the template has been resolved.  In the meantime it will continue to compile and link\n * sibling and parent elements as though this element had not contained any directives.\n *\n * The compiler does not suspend the entire compilation to wait for templates to be loaded because this\n * would result in the whole app \"stalling\" until all templates are loaded asynchronously - even in the\n * case when only one deeply nested directive has `templateUrl`.\n *\n * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)\n * specify what the template should replace. Defaults to `false`.\n *\n * * `true` - the template will replace the directive's element.\n * * `false` - the template will replace the contents of the directive's element.\n *\n * The replacement process migrates all of the attributes / classes from the old element to the new\n * one. See the {@link guide/directive#template-expanding-directive\n * Directives Guide} for an example.\n *\n * There are very few scenarios where element replacement is required for the application function,\n * the main one being reusable custom components that are used within SVG contexts\n * (because SVG doesn't work with custom elements in the DOM tree).\n *\n * #### `transclude`\n * Extract the contents of the element where the directive appears and make it available to the directive.\n * The contents are compiled and provided to the directive as a **transclusion function**. See the\n * {@link $compile#transclusion Transclusion} section below.\n *\n * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the\n * directive's element or the entire element:\n *\n * * `true` - transclude the content (i.e. the child nodes) of the directive's element.\n * * `'element'` - transclude the whole of the directive's element including any directives on this\n *   element that defined at a lower priority than this directive. When used, the `template`\n *   property is ignored.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and a\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-error\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - a controller instance - A controller instance if at least one directive on the\n *     element defines a controller. The controller is shared among all the directives, which allows\n *     the directives to use the controllers as a communication channel.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     This is the same as the `$transclude`\n *     parameter of directive controllers, see there for details.\n *     `function([scope], cloneLinkingFn, futureParentElement)`.\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked.\n *\n * Note that child elements that contain `templateUrl` directives will not have been compiled\n * and linked since they are waiting for their template to load asynchronously and their own\n * compilation and linking has been suspended until that occurs.\n *\n * It is safe to do DOM transformation in the post-linking function on elements that are not waiting\n * for their async templates to be resolved.\n *\n *\n * ### Transclusion\n *\n * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and\n * copying them to another part of the DOM, while maintaining their connection to the original AngularJS\n * scope from where they were taken.\n *\n * Transclusion is used (often with {@link ngTransclude}) to insert the\n * original contents of a directive's element into a specified place in the template of the directive.\n * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded\n * content has access to the properties on the scope from which it was taken, even if the directive\n * has isolated scope.\n * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.\n *\n * This makes it possible for the widget to have private state for its template, while the transcluded\n * content has access to its originating scope.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** When testing an element transclude directive you must not place the directive at the root of the\n * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives\n * Testing Transclusion Directives}.\n * </div>\n *\n * #### Transclusion Functions\n *\n * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion\n * function** to the directive's `link` function and `controller`. This transclusion function is a special\n * **linking function** that will return the compiled contents linked to a new transclusion scope.\n *\n * <div class=\"alert alert-info\">\n * If you are just using {@link ngTransclude} then you don't need to worry about this function, since\n * ngTransclude will deal with it for us.\n * </div>\n *\n * If you want to manually control the insertion and removal of the transcluded content in your directive\n * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery\n * object that contains the compiled DOM, which is linked to the correct transclusion scope.\n *\n * When you call a transclusion function you can pass in a **clone attach function**. This function accepts\n * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded\n * content and the `scope` is the newly created transclusion scope, to which the clone is bound.\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function\n * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.\n * </div>\n *\n * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone\n * attach function**:\n *\n * ```js\n * var transcludedContent, transclusionScope;\n *\n * $transclude(function(clone, scope) {\n *   element.append(clone);\n *   transcludedContent = clone;\n *   transclusionScope = scope;\n * });\n * ```\n *\n * Later, if you want to remove the transcluded content from your DOM then you should also destroy the\n * associated transclusion scope:\n *\n * ```js\n * transcludedContent.remove();\n * transclusionScope.$destroy();\n * ```\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: if you intend to add and remove transcluded content manually in your directive\n * (by calling the transclude function to get the DOM and and calling `element.remove()` to remove it),\n * then you are also responsible for calling `$destroy` on the transclusion scope.\n * </div>\n *\n * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}\n * automatically destroy their transluded clones as necessary so you do not need to worry about this if\n * you are simply using {@link ngTransclude} to inject the transclusion into your directive.\n *\n *\n * #### Transclusion Scopes\n *\n * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion\n * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed\n * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it\n * was taken.\n *\n * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look\n * like this:\n *\n * ```html\n * <div ng-app>\n *   <div isolate>\n *     <div transclusion>\n *     </div>\n *   </div>\n * </div>\n * ```\n *\n * The `$parent` scope hierarchy will look like this:\n *\n * ```\n * - $rootScope\n *   - isolate\n *     - transclusion\n * ```\n *\n * but the scopes will inherit prototypically from different scopes to their `$parent`.\n *\n * ```\n * - $rootScope\n *   - transclusion\n * - isolate\n * ```\n *\n *\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * accessing *Normalized attribute names:*\n * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.\n * the attributes object allows for normalized access to\n *   the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * ## Example\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compileExample\">\n   <file name=\"index.html\">\n    <script>\n      angular.module('compileExample', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        });\n      })\n      .controller('GreeterController', ['$scope', function($scope) {\n        $scope.name = 'Angular';\n        $scope.html = 'Hello {{name}}';\n      }]);\n    </script>\n    <div ng-controller=\"GreeterController\">\n      <input ng-model=\"name\"> <br>\n      <textarea ng-model=\"html\"></textarea> <br>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello Angular'.\n       expect(output.getText()).toBe('Hello Angular');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('Angular!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED.\n *\n * <div class=\"alert alert-error\">\n * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it\n *   e.g. will not use the right outer scope. Please pass the transclude function as a\n *   `parentBoundTranscludeFn` to the link function instead.\n * </div>\n *\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n *  * `options` - An optional object hash with linking options. If `options` is provided, then the following\n *  keys may be used to control linking behavior:\n *\n *      * `parentBoundTranscludeFn` - the transclude function made available to\n *        directives; if given, it will be passed through to the link functions of\n *        directives found in `element` during compilation.\n *      * `transcludeControllers` - an object hash with keys that map controller names\n *        to controller instances; if given, it will make the controllers\n *        available to directives.\n *      * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add\n *        the cloned elements; only needed for transcludes that are allowed to contain non html\n *        elements (e.g. SVG elements). See also the directive.controller property.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * Angular automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\n */\n\nvar $compileMinErr = minErr('$compile');\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\w\\-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\w\\-]+)(?:\\:([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),\n      REQUIRE_PREFIX_REGEXP = /^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/;\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n\n  function parseIsolateBindings(scope, directiveName) {\n    var LOCAL_REGEXP = /^\\s*([@&]|=(\\*?))(\\??)\\s*(\\w*)\\s*$/;\n\n    var bindings = {};\n\n    forEach(scope, function(definition, scopeName) {\n      var match = definition.match(LOCAL_REGEXP);\n\n      if (!match) {\n        throw $compileMinErr('iscp',\n            \"Invalid isolate scope definition for directive '{0}'.\" +\n            \" Definition: {... {1}: '{2}' ...}\",\n            directiveName, scopeName, definition);\n      }\n\n      bindings[scopeName] = {\n        mode: match[1][0],\n        collection: match[2] === '*',\n        optional: match[3] === '?',\n        attrName: match[4] || scopeName\n      };\n    });\n\n    return bindings;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @kind function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See\n   *    {@link guide/directive} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n   this.directive = function registerDirective(name, directiveFactory) {\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = directive.require || (directive.controller && directive.name);\n                directive.restrict = directive.restrict || 'EA';\n                if (isObject(directive.scope)) {\n                  directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name);\n                }\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at preventing XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#debugInfoEnabled\n   *\n   * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the\n   * current debugInfoEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable various debug runtime information in the compiler such as adding\n   * binding information and a reference to the current scope on to DOM elements.\n   * If enabled, the compiler will add the following to DOM elements that have been bound to the scope\n   * * `ng-binding` CSS class\n   * * `$binding` data property containing an array of the binding expressions\n   *\n   * You may want to disable this in production for a significant performance boost. See\n   * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.\n   *\n   * The default value is true.\n   */\n  var debugInfoEnabled = true;\n  this.debugInfoEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      debugInfoEnabled = enabled;\n      return this;\n    }\n    return debugInfoEnabled;\n  };\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',\n            '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',\n    function($injector,   $interpolate,   $exceptionHandler,   $templateRequest,   $parse,\n             $controller,   $rootScope,   $document,   $sce,   $animate,   $$sanitizeUri) {\n\n    var Attributes = function(element, attributesToCopy) {\n      if (attributesToCopy) {\n        var keys = Object.keys(attributesToCopy);\n        var i, l, key;\n\n        for (i = 0, l = keys.length; i < l; i++) {\n          key = keys[i];\n          this[key] = attributesToCopy[key];\n        }\n      } else {\n        this.$attr = {};\n      }\n\n      this.$$element = element;\n    };\n\n    Attributes.prototype = {\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$normalize\n       * @kind function\n       *\n       * @description\n       * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or\n       * `data-`) to its normalized, camelCase form.\n       *\n       * Also there is special case for Moz prefix starting with upper case letter.\n       *\n       * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n       *\n       * @param {string} name Name to normalize\n       */\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @kind function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @kind function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @kind function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass: function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        if (toAdd && toAdd.length) {\n          $animate.addClass(this.$$element, toAdd);\n        }\n\n        var toRemove = tokenDifference(oldClasses, newClasses);\n        if (toRemove && toRemove.length) {\n          $animate.removeClass(this.$$element, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        //is set through this function since it may cause $updateClass to\n        //become unstable.\n\n        var node = this.$$element[0],\n            booleanKey = getBooleanAttrName(node, key),\n            aliasedKey = getAliasedAttrName(node, key),\n            observer = key,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        } else if (aliasedKey) {\n          this[aliasedKey] = value;\n          observer = aliasedKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        if ((nodeName === 'a' && key === 'href') ||\n            (nodeName === 'img' && key === 'src')) {\n          // sanitize a[href] and img[src] values\n          this[key] = value = $$sanitizeUri(value, key === 'src');\n        } else if (nodeName === 'img' && key === 'srcset') {\n          // sanitize img[srcset] values\n          var result = \"\";\n\n          // first check if there are spaces because it's not the same pattern\n          var trimmedSrcset = trim(value);\n          //                (   999x   ,|   999w   ,|   ,|,   )\n          var srcPattern = /(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/;\n          var pattern = /\\s/.test(trimmedSrcset) ? srcPattern : /(,)/;\n\n          // split srcset into tuple of uri and descriptor except for the last item\n          var rawUris = trimmedSrcset.split(pattern);\n\n          // for each tuples\n          var nbrUrisWith2parts = Math.floor(rawUris.length / 2);\n          for (var i = 0; i < nbrUrisWith2parts; i++) {\n            var innerIdx = i * 2;\n            // sanitize the uri\n            result += $$sanitizeUri(trim(rawUris[innerIdx]), true);\n            // add the descriptor\n            result += (\" \" + trim(rawUris[innerIdx + 1]));\n          }\n\n          // split the last item into uri and descriptor\n          var lastTuple = trim(rawUris[i * 2]).split(/\\s/);\n\n          // sanitize the last uri\n          result += $$sanitizeUri(trim(lastTuple[0]), true);\n\n          // and add the last descriptor if any\n          if (lastTuple.length === 2) {\n            result += (\" \" + trim(lastTuple[1]));\n          }\n          this[key] = value = result;\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || value === undefined) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            this.$$element.attr(attrName, value);\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        $$observers && forEach($$observers[observer], function(fn) {\n          try {\n            fn(value);\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        });\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @kind function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter && attrs.hasOwnProperty(key)) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch (e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol == '{{' || endSymbol  == '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_ATTR_BINDING = /^ngAttr[A-Z]/;\n\n    compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {\n      var bindings = $element.data('$binding') || [];\n\n      if (isArray(binding)) {\n        bindings = bindings.concat(binding);\n      } else {\n        bindings.push(binding);\n      }\n\n      $element.data('$binding', bindings);\n    } : noop;\n\n    compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {\n      safeAddClass($element, 'ng-binding');\n    } : noop;\n\n    compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {\n      var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';\n      $element.data(dataName, scope);\n    } : noop;\n\n    compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {\n      safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');\n    } : noop;\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n      // We can not compile top level text elements since text nodes can be merged and we will\n      // not be able to attach scope data to them, so we will wrap them in <span>\n      forEach($compileNodes, function(node, index) {\n        if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\\S+/) /* non-empty */ ) {\n          $compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0];\n        }\n      });\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      compile.$$addScopeClass($compileNodes);\n      var namespace = null;\n      return function publicLinkFn(scope, cloneConnectFn, options) {\n        assertArg(scope, 'scope');\n\n        options = options || {};\n        var parentBoundTranscludeFn = options.parentBoundTranscludeFn,\n          transcludeControllers = options.transcludeControllers,\n          futureParentElement = options.futureParentElement;\n\n        // When `parentBoundTranscludeFn` is passed, it is a\n        // `controllersBoundTransclude` function (it was previously passed\n        // as `transclude` to directive.link) so we must unwrap it to get\n        // its `boundTranscludeFn`\n        if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) {\n          parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude;\n        }\n\n        if (!namespace) {\n          namespace = detectNamespaceForChildElements(futureParentElement);\n        }\n        var $linkNode;\n        if (namespace !== 'html') {\n          // When using a directive with replace:true and templateUrl the $compileNodes\n          // (or a child element inside of them)\n          // might change, so we need to recreate the namespace adapted compileNodes\n          // for call to the link function.\n          // Note: This will already clone the nodes...\n          $linkNode = jqLite(\n            wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())\n          );\n        } else if (cloneConnectFn) {\n          // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n          // and sometimes changes the structure of the DOM.\n          $linkNode = JQLitePrototype.clone.call($compileNodes);\n        } else {\n          $linkNode = $compileNodes;\n        }\n\n        if (transcludeControllers) {\n          for (var controllerName in transcludeControllers) {\n            $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);\n          }\n        }\n\n        compile.$$addScopeInfo($linkNode, scope);\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);\n        return $linkNode;\n      };\n    }\n\n    function detectNamespaceForChildElements(parentElement) {\n      // TODO: Make this detect MathML as well...\n      var node = parentElement && parentElement[0];\n      if (!node) {\n        return 'html';\n      } else {\n        return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html';\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          compile.$$addScopeClass(attrs.$$element);\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? (\n                  (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)\n                     && nodeLinkFn.transclude) : transcludeFn);\n\n        if (nodeLinkFn || childLinkFn) {\n          linkFns.push(i, nodeLinkFn, childLinkFn);\n          linkFnFound = true;\n          nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;\n        }\n\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;\n        var stableNodeList;\n\n\n        if (nodeLinkFnFound) {\n          // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our\n          // offsets don't get screwed up\n          var nodeListLength = nodeList.length;\n          stableNodeList = new Array(nodeListLength);\n\n          // create a sparse array by only copying the elements which have a linkFn\n          for (i = 0; i < linkFns.length; i+=3) {\n            idx = linkFns[i];\n            stableNodeList[idx] = nodeList[idx];\n          }\n        } else {\n          stableNodeList = nodeList;\n        }\n\n        for (i = 0, ii = linkFns.length; i < ii;) {\n          node = stableNodeList[linkFns[i++]];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              compile.$$addScopeInfo(jqLite(node), childScope);\n            } else {\n              childScope = scope;\n            }\n\n            if (nodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(\n                  scope, nodeLinkFn.transclude, parentBoundTranscludeFn,\n                  nodeLinkFn.elementTranscludeOnThisElement);\n\n            } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {\n              childBoundTranscludeFn = parentBoundTranscludeFn;\n\n            } else if (!parentBoundTranscludeFn && transcludeFn) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);\n\n            } else {\n              childBoundTranscludeFn = null;\n            }\n\n            nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);\n\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn, elementTransclusion) {\n\n      var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new(false, containingScope);\n          transcludedScope.$$transcluded = true;\n        }\n\n        return transcludeFn(transcludedScope, cloneFn, {\n          parentBoundTranscludeFn: previousBoundTranscludeFn,\n          transcludeControllers: controllers,\n          futureParentElement: futureParentElement\n        });\n      };\n\n      return boundTranscludeFn;\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          className;\n\n      switch (nodeType) {\n        case NODE_TYPE_ELEMENT: /* Element */\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            attr = nAttrs[j];\n            name = attr.name;\n            value = trim(attr.value);\n\n            // support ngAttr attribute binding\n            ngAttrName = directiveNormalize(name);\n            if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {\n              name = name.replace(PREFIX_REGEXP, '')\n                .substr(8).replace(/_(.)/g, function(match, letter) {\n                  return letter.toUpperCase();\n                });\n            }\n\n            var directiveNName = ngAttrName.replace(/(Start|End)$/, '');\n            if (directiveIsMultiElement(directiveNName)) {\n              if (ngAttrName === directiveNName + 'Start') {\n                attrStartName = name;\n                attrEndName = name.substr(0, name.length - 5) + 'end';\n                name = name.substr(0, name.length - 6);\n              }\n            }\n\n            nName = directiveNormalize(name.toLowerCase());\n            attrsMap[nName] = name;\n            if (isNgAttr || !attrs.hasOwnProperty(nName)) {\n                attrs[nName] = value;\n                if (getBooleanAttrName(node, nName)) {\n                  attrs[nName] = true; // presence means true\n                }\n            }\n            addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);\n            addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                          attrEndName);\n          }\n\n          // use class as directive\n          className = node.className;\n          if (isObject(className)) {\n              // Maybe SVGAnimatedString\n              className = className.animVal;\n          }\n          if (isString(className) && className !== '') {\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case NODE_TYPE_TEXT: /* Text Node */\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case NODE_TYPE_COMMENT: /* Comment */\n          try {\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n            if (match) {\n              nName = directiveNormalize(match[1]);\n              if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[2]);\n              }\n            }\n          } catch (e) {\n            // turns out that under some circumstances IE9 throws errors when one attempts to read\n            // comment's node value.\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\n          }\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    /**\n     * Given a node with an directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType == NODE_TYPE_ELEMENT) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          controllers,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasTemplate = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          directiveValue;\n\n      // executes all directives on the current element\n      for (var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        if (directiveValue = directive.scope) {\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            if (isObject(directiveValue)) {\n              // This directive is trying to add an isolated scope.\n              // Check that there is no scope of any kind already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,\n                                directive, $compileNode);\n              newIsolateScopeDirective = directive;\n            } else {\n              // This directive is trying to add a child scope.\n              // Check that there is no isolated scope already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                                $compileNode);\n            }\n          }\n\n          newScopeDirective = newScopeDirective || directive;\n        }\n\n        directiveName = directive.name;\n\n        if (!directive.templateUrl && directive.controller) {\n          directiveValue = directive.controller;\n          controllerDirectives = controllerDirectives || {};\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        if (directiveValue = directive.transclude) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue == 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = $compileNode;\n            $compileNode = templateAttrs.$$element =\n                jqLite(document.createComment(' ' + directiveName + ': ' +\n                                              templateAttrs[directiveName] + ' '));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, sliceArgs($template), compileNode);\n\n            childTranscludeFn = compile($template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n            $template = jqLite(jqLiteClone(compileNode)).contents();\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compile($template, transcludeFn);\n          }\n        }\n\n        if (directive.template) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n              templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            if (isFunction(linkFn)) {\n              addLinkFns(null, linkFn, attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;\n      nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective;\n      nodeLinkFn.templateOnThisElement = hasTemplate;\n      nodeLinkFn.transclude = childTranscludeFn;\n\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n\n      function getControllers(directiveName, require, $element, elementControllers) {\n        var value, retrievalMethod = 'data', optional = false;\n        var $searchElement = $element;\n        var match;\n        if (isString(require)) {\n          match = require.match(REQUIRE_PREFIX_REGEXP);\n          require = require.substring(match[0].length);\n\n          if (match[3]) {\n            if (match[1]) match[3] = null;\n            else match[1] = match[3];\n          }\n          if (match[1] === '^') {\n            retrievalMethod = 'inheritedData';\n          } else if (match[1] === '^^') {\n            retrievalMethod = 'inheritedData';\n            $searchElement = $element.parent();\n          }\n          if (match[2] === '?') {\n            optional = true;\n          }\n\n          value = null;\n\n          if (elementControllers && retrievalMethod === 'data') {\n            if (value = elementControllers[require]) {\n              value = value.instance;\n            }\n          }\n          value = value || $searchElement[retrievalMethod]('$' + require + 'Controller');\n\n          if (!value && !optional) {\n            throw $compileMinErr('ctreq',\n                \"Controller '{0}', required by directive '{1}', can't be found!\",\n                require, directiveName);\n          }\n          return value || null;\n        } else if (isArray(require)) {\n          value = [];\n          forEach(require, function(require) {\n            value.push(getControllers(directiveName, require, $element, elementControllers));\n          });\n        }\n        return value;\n      }\n\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element,\n            attrs;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n          $element = templateAttrs.$$element;\n        } else {\n          $element = jqLite(linkNode);\n          attrs = new Attributes($element, templateAttrs);\n        }\n\n        if (newIsolateScopeDirective) {\n          isolateScope = scope.$new(true);\n        }\n\n        if (boundTranscludeFn) {\n          // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn`\n          // is later passed as `parentBoundTranscludeFn` to `publicLinkFn`\n          transcludeFn = controllersBoundTransclude;\n          transcludeFn.$$boundTransclude = boundTranscludeFn;\n        }\n\n        if (controllerDirectives) {\n          // TODO: merge `controllers` and `elementControllers` into single object.\n          controllers = {};\n          elementControllers = {};\n          forEach(controllerDirectives, function(directive) {\n            var locals = {\n              $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n              $element: $element,\n              $attrs: attrs,\n              $transclude: transcludeFn\n            }, controllerInstance;\n\n            controller = directive.controller;\n            if (controller == '@') {\n              controller = attrs[directive.name];\n            }\n\n            controllerInstance = $controller(controller, locals, true, directive.controllerAs);\n\n            // For directives with element transclusion the element is a comment,\n            // but jQuery .data doesn't support attaching data to comment nodes as it's hard to\n            // clean up (http://bugs.jquery.com/ticket/8335).\n            // Instead, we save the controllers for the element in a local hash and attach to .data\n            // later, once we have the actual element.\n            elementControllers[directive.name] = controllerInstance;\n            if (!hasElementTranscludeDirective) {\n              $element.data('$' + directive.name + 'Controller', controllerInstance.instance);\n            }\n\n            controllers[directive.name] = controllerInstance;\n          });\n        }\n\n        if (newIsolateScopeDirective) {\n          compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)));\n          compile.$$addScopeClass($element, true);\n\n          var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name];\n          var isolateBindingContext = isolateScope;\n          if (isolateScopeController && isolateScopeController.identifier &&\n              newIsolateScopeDirective.bindToController === true) {\n            isolateBindingContext = isolateScopeController.instance;\n          }\n\n          forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) {\n            var attrName = definition.attrName,\n                optional = definition.optional,\n                mode = definition.mode, // @, =, or &\n                lastValue,\n                parentGet, parentSet, compare;\n\n            switch (mode) {\n\n              case '@':\n                attrs.$observe(attrName, function(value) {\n                  isolateBindingContext[scopeName] = value;\n                });\n                attrs.$$observers[attrName].$$scope = scope;\n                if (attrs[attrName]) {\n                  // If the attribute has been provided then we trigger an interpolation to ensure\n                  // the value is there for use in the link fn\n                  isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope);\n                }\n                break;\n\n              case '=':\n                if (optional && !attrs[attrName]) {\n                  return;\n                }\n                parentGet = $parse(attrs[attrName]);\n                if (parentGet.literal) {\n                  compare = equals;\n                } else {\n                  compare = function(a, b) { return a === b || (a !== a && b !== b); };\n                }\n                parentSet = parentGet.assign || function() {\n                  // reset the change, or we will throw this exception on every $digest\n                  lastValue = isolateBindingContext[scopeName] = parentGet(scope);\n                  throw $compileMinErr('nonassign',\n                      \"Expression '{0}' used with directive '{1}' is non-assignable!\",\n                      attrs[attrName], newIsolateScopeDirective.name);\n                };\n                lastValue = isolateBindingContext[scopeName] = parentGet(scope);\n                var parentValueWatch = function parentValueWatch(parentValue) {\n                  if (!compare(parentValue, isolateBindingContext[scopeName])) {\n                    // we are out of sync and need to copy\n                    if (!compare(parentValue, lastValue)) {\n                      // parent changed and it has precedence\n                      isolateBindingContext[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(scope, parentValue = isolateBindingContext[scopeName]);\n                    }\n                  }\n                  return lastValue = parentValue;\n                };\n                parentValueWatch.$stateful = true;\n                var unwatch;\n                if (definition.collection) {\n                  unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch);\n                } else {\n                  unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);\n                }\n                isolateScope.$on('$destroy', unwatch);\n                break;\n\n              case '&':\n                parentGet = $parse(attrs[attrName]);\n                isolateBindingContext[scopeName] = function(locals) {\n                  return parentGet(scope, locals);\n                };\n                break;\n            }\n          });\n        }\n        if (controllers) {\n          forEach(controllers, function(controller) {\n            controller();\n          });\n          controllers = null;\n        }\n\n        // PRELINKING\n        for (i = 0, ii = preLinkFns.length; i < ii; i++) {\n          linkFn = preLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n\n        // POSTLINKING\n        for (i = postLinkFns.length - 1; i >= 0; i--) {\n          linkFn = postLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // This is the function that is injected as `$transclude`.\n        // Note: all arguments are optional!\n        function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) {\n          var transcludeControllers;\n\n          // No scope passed in:\n          if (!isScope(scope)) {\n            futureParentElement = cloneAttachFn;\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n          if (!futureParentElement) {\n            futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;\n          }\n          return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n        }\n      }\n    }\n\n    function markDirectivesAsIsolate(directives) {\n      // mark all directives as needing isolate scope.\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: true});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          try {\n            directive = directives[i];\n            if ((maxPriority === undefined || maxPriority > directive.priority) &&\n                 directive.restrict.indexOf(location) != -1) {\n              if (startAttrName) {\n                directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n              }\n              tDirectives.push(directive);\n              match = directive;\n            }\n          } catch (e) { $exceptionHandler(e); }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * looks up the directive and returns true if it is a multi-element directive,\n     * and therefore requires DOM nodes between -start and -end markers to be grouped\n     * together.\n     *\n     * @param {string} name name of the directive to look up.\n     * @returns true if directive was registered as multi-element.\n     */\n    function directiveIsMultiElement(name) {\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if (directive.multiElement) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr,\n          $element = dst.$$element;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) != '$') {\n          if (src[key] && src[key] !== value) {\n            value += (key === 'style' ? ';' : ' ') + src[key];\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        if (key == 'class') {\n          safeAddClass($element, value);\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\n        } else if (key == 'style') {\n          $element.attr('style', $element.attr('style') + ';' + value);\n          dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;\n          // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n          // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n          // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\n          dst[key] = value;\n          dstAttr[key] = srcAttr[key];\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          derivedSyncDirective = inherit(origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          templateNamespace = origAsyncDirective.templateNamespace;\n\n      $compileNode.empty();\n\n      $templateRequest($sce.getTrustedResourceUrl(templateUrl))\n        .then(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(templateNamespace, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node == compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n          while (linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (scope.$$destroyed) continue;\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        var childBoundTranscludeFn = boundTranscludeFn;\n        if (scope.$$destroyed) return;\n        if (linkQueue) {\n          linkQueue.push(scope,\n                         node,\n                         rootElement,\n                         childBoundTranscludeFn);\n        } else {\n          if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n            childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n          }\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',\n            previousDirective.name, directive.name, what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: function textInterpolateCompileFn(templateNode) {\n            var templateNodeParent = templateNode.parent(),\n                hasCompileParent = !!templateNodeParent.length;\n\n            // When transcluding a template that has bindings in the root\n            // we don't have a parent and thus need to add the class during linking fn.\n            if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);\n\n            return function textInterpolateLinkFn(scope, node) {\n              var parent = node.parent();\n              if (!hasCompileParent) compile.$$addBindingClass(parent);\n              compile.$$addBindingInfo(parent, interpolateFn.expressions);\n              scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n                node[0].nodeValue = value;\n              });\n            };\n          }\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch (type) {\n      case 'svg':\n      case 'math':\n        var wrapper = document.createElement('div');\n        wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedContext(node, attrNormalizedName) {\n      if (attrNormalizedName == \"srcdoc\") {\n        return $sce.HTML;\n      }\n      var tag = nodeName_(node);\n      // maction[xlink:href] can source SVG.  It's not limited to <maction>.\n      if (attrNormalizedName == \"xlinkHref\" ||\n          (tag == \"form\" && attrNormalizedName == \"action\") ||\n          (tag != \"img\" && (attrNormalizedName == \"src\" ||\n                            attrNormalizedName == \"ngSrc\"))) {\n        return $sce.RESOURCE_URL;\n      }\n    }\n\n\n    function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {\n      var trustedContext = getTrustedContext(node, name);\n      allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing;\n\n      var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n\n      if (name === \"multiple\" && nodeName_(node) === \"select\") {\n        throw $compileMinErr(\"selmulti\",\n            \"Binding to the 'multiple' attribute is not supported. Element: {0}\",\n            startingTag(node));\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = {}));\n\n                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n                  throw $compileMinErr('nodomevents',\n                      \"Interpolations for HTML DOM event attributes are disallowed.  Please use the \" +\n                          \"ng- versions (such as ng-click instead of onclick) instead.\");\n                }\n\n                // If the attribute has changed since last $interpolate()ed\n                var newValue = attr[name];\n                if (newValue !== value) {\n                  // we need to interpolate again since the attribute value has been updated\n                  // (e.g. by another directive's compile function)\n                  // ensure unset/empty values make interpolateFn falsy\n                  interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);\n                  value = newValue;\n                }\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if (name === 'class' && newValue != oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for (i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] == firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n\n            // If the replaced element is also the jQuery .context then replace it\n            // .context is a deprecated jQuery api, so we should set it only when jQuery set it\n            // http://api.jquery.com/context/\n            if ($rootElement.context === firstElementToRemove) {\n              $rootElement.context = newNode;\n            }\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n\n      // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it?\n      var fragment = document.createDocumentFragment();\n      fragment.appendChild(firstElementToRemove);\n\n      // Copy over user data (that includes Angular's $scope etc.). Don't copy private\n      // data here because there's no public interface in jQuery to do that and copying over\n      // event listeners (which is the main use of private data) wouldn't work anyway.\n      jqLite(newNode).data(jqLite(firstElementToRemove).data());\n\n      // Remove data of the replaced element. We cannot just call .remove()\n      // on the element it since that would deallocate scope that is needed\n      // for the new node. Instead, remove the data \"manually\".\n      if (!jQuery) {\n        delete jqLite.cache[firstElementToRemove[jqLite.expando]];\n      } else {\n        // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after\n        // the replaced element. The cleanData version monkey-patched by Angular would cause\n        // the scope to be trashed and we do need the very same scope to work with the new\n        // element. However, we cannot just cache the non-patched version and use it here as\n        // that would break if another library patches the method after Angular does (one\n        // example is jQuery UI). Instead, set a flag indicating scope destroying should be\n        // skipped this one time.\n        skipDestroyOnNextJQueryCleanData = true;\n        jQuery.cleanData([firstElementToRemove]);\n      }\n\n      for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {\n        var element = elementsToRemove[k];\n        jqLite(element).remove(); // must do this way to clean up expando\n        fragment.appendChild(element);\n        delete elementsToRemove[k];\n      }\n\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n\n\n    function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {\n      try {\n        linkFn(scope, $element, attrs, controllers, transcludeFn);\n      } catch (e) {\n        $exceptionHandler(e, startingTag($element));\n      }\n    }\n  }];\n}\n\nvar PREFIX_REGEXP = /^((?:x|data)[\\:\\-_])/i;\n/**\n * Converts all accepted directives format into proper directive name.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in Angular:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n *\n * @description\n * A map of DOM element attribute names to the normalized name. This is\n * needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @kind function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for (var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for (var j = 0; j < tokens2.length; j++) {\n      if (token == tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\nfunction removeComments(jqNodes) {\n  jqNodes = jqLite(jqNodes);\n  var i = jqNodes.length;\n\n  if (i <= 1) {\n    return jqNodes;\n  }\n\n  while (i--) {\n    var node = jqNodes[i];\n    if (node.nodeType === NODE_TYPE_COMMENT) {\n      splice.call(jqNodes, i, 1);\n    }\n  }\n  return jqNodes;\n}\n\nvar $controllerMinErr = minErr('$controller');\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @description\n * The {@link ng.$controller $controller service} is used by Angular to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {},\n      globals = false,\n      CNTRL_REG = /^(\\S+)(\\s+as\\s+(\\w+))?$/;\n\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#allowGlobals\n   * @description If called, allows `$controller` to find controller constructors on `window`\n   */\n  this.allowGlobals = function() {\n    globals = true;\n  };\n\n\n  this.$get = ['$injector', '$window', function($injector, $window) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global\n     *      `window` object (not recommended)\n     *\n     *    The string can use the `controller as property` syntax, where the controller instance is published\n     *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n     *    to work correctly.\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function(expression, locals, later, ident) {\n      // PRIVATE API:\n      //   param `later` --- indicates that the controller's constructor is invoked at a later time.\n      //                     If true, $controller will allocate the object with the correct\n      //                     prototype chain, but will not invoke the controller until a returned\n      //                     callback is invoked.\n      //   param `ident` --- An optional label which overrides the label parsed from the controller\n      //                     expression, if any.\n      var instance, match, constructor, identifier;\n      later = later === true;\n      if (ident && isString(ident)) {\n        identifier = ident;\n      }\n\n      if (isString(expression)) {\n        match = expression.match(CNTRL_REG);\n        if (!match) {\n          throw $controllerMinErr('ctrlfmt',\n            \"Badly formed controller string '{0}'. \" +\n            \"Must match `__name__ as __id__` or `__name__`.\", expression);\n        }\n        constructor = match[1],\n        identifier = identifier || match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true) ||\n                (globals ? getter($window, constructor, true) : undefined);\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      if (later) {\n        // Instantiate controller later:\n        // This machinery is used to create an instance of the object before calling the\n        // controller's constructor itself.\n        //\n        // This allows properties to be added to the controller before the constructor is\n        // invoked. Primarily, this is used for isolate scope bindings in $compile.\n        //\n        // This feature is not intended for use by applications, and is thus not documented\n        // publicly.\n        // Object creation: http://jsperf.com/create-constructor/2\n        var controllerPrototype = (isArray(expression) ?\n          expression[expression.length - 1] : expression).prototype;\n        instance = Object.create(controllerPrototype || null);\n\n        if (identifier) {\n          addIdentifier(locals, identifier, instance, constructor || expression.name);\n        }\n\n        return extend(function() {\n          $injector.invoke(expression, instance, locals, constructor);\n          return instance;\n        }, {\n          instance: instance,\n          identifier: identifier\n        });\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        addIdentifier(locals, identifier, instance, constructor || expression.name);\n      }\n\n      return instance;\n    };\n\n    function addIdentifier(locals, identifier, instance, name) {\n      if (!(locals && isObject(locals.$scope))) {\n        throw minErr('$controller')('noscp',\n          \"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\n          name, identifier);\n      }\n\n      locals.$scope[identifier] = instance;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example module=\"documentExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('documentExample', [])\n         .controller('ExampleController', ['$scope', '$document', function($scope, $document) {\n           $scope.title = $document[0].title;\n           $scope.windowTitle = angular.element(window.document)[0].title;\n         }]);\n     </file>\n   </example>\n */\nfunction $DocumentProvider() {\n  this.$get = ['$window', function(window) {\n    return jqLite(window.document);\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n *\n * @description\n * Any uncaught exception in angular expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * ```js\n *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function() {\n *     return function(exception, cause) {\n *       exception.message += ' (caused by \"' + cause + '\")';\n *       throw exception;\n *     };\n *   });\n * ```\n *\n * This example will override the normal action of `$exceptionHandler`, to make angular\n * exceptions fail hard when they happen, instead of just logging to the console.\n *\n * <hr />\n * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`\n * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}\n * (unless executed during a digest).\n *\n * If you wish, you can manually delegate exceptions, e.g.\n * `try { ... } catch(e) { $exceptionHandler(e); }`\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\nvar APPLICATION_JSON = 'application/json';\nvar CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};\nvar JSON_START = /^\\[|^\\{(?!\\{)/;\nvar JSON_ENDS = {\n  '[': /]$/,\n  '{': /}$/\n};\nvar JSON_PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/;\n\nfunction defaultHttpResponseTransform(data, headers) {\n  if (isString(data)) {\n    // Strip json vulnerability protection prefix and trim whitespace\n    var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();\n\n    if (tempData) {\n      var contentType = headers('Content-Type');\n      if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {\n        data = fromJson(tempData);\n      }\n    }\n  }\n\n  return data;\n}\n\nfunction isJsonLike(str) {\n    var jsonStart = str.match(JSON_START);\n    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = createMap(), key, val, i;\n\n  if (!headers) return parsed;\n\n  forEach(headers.split('\\n'), function(line) {\n    i = line.indexOf(':');\n    key = lowercase(trim(line.substr(0, i)));\n    val = trim(line.substr(i + 1));\n\n    if (key) {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  });\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with single an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj = isObject(headers) ? headers : undefined;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      var value = headersObj[lowercase(name)];\n      if (value === void 0) {\n        value = null;\n      }\n      return value;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers HTTP headers getter fn.\n * @param {number} status HTTP status code of the response.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, status, fns) {\n  if (isFunction(fns))\n    return fns(data, headers, status);\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers, status);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\n/**\n * @ngdoc provider\n * @name $httpProvider\n * @description\n * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.\n * */\nfunction $HttpProvider() {\n  /**\n   * @ngdoc property\n   * @name $httpProvider#defaults\n   * @description\n   *\n   * Object containing default values for all {@link ng.$http $http} requests.\n   *\n   * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`}\n   * that will provide the cache for all requests who set their `cache` property to `true`.\n   * If you set the `default.cache = false` then only requests that specify their own custom\n   * cache object will be cached. See {@link $http#caching $http Caching} for more information.\n   *\n   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.\n   * Defaults value is `'XSRF-TOKEN'`.\n   *\n   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the\n   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.\n   *\n   * - **`defaults.headers`** - {Object} - Default headers for all $http requests.\n   * Refer to {@link ng.$http#setting-http-headers $http} for documentation on\n   * setting default headers.\n   *     - **`defaults.headers.common`**\n   *     - **`defaults.headers.post`**\n   *     - **`defaults.headers.put`**\n   *     - **`defaults.headers.patch`**\n   *\n   **/\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [defaultHttpResponseTransform],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  shallowCopy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN'\n  };\n\n  var useApplyAsync = false;\n  /**\n   * @ngdoc method\n   * @name $httpProvider#useApplyAsync\n   * @description\n   *\n   * Configure $http service to combine processing of multiple http responses received at around\n   * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in\n   * significant performance improvement for bigger applications that make many HTTP requests\n   * concurrently (common during application bootstrap).\n   *\n   * Defaults to false. If no value is specifed, returns the current configured value.\n   *\n   * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred\n   *    \"apply\" on the next tick, giving time for subsequent requests in a roughly ~10ms window\n   *    to load and share the same digest cycle.\n   *\n   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.\n   *    otherwise, returns the current configured value.\n   **/\n  this.useApplyAsync = function(value) {\n    if (isDefined(value)) {\n      useApplyAsync = !!value;\n      return this;\n    }\n    return useApplyAsync;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $httpProvider#interceptors\n   * @description\n   *\n   * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http}\n   * pre-processing of request or postprocessing of responses.\n   *\n   * These service factories are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   *\n   * {@link ng.$http#interceptors Interceptors detailed info}\n   **/\n  var interceptorFactories = this.interceptors = [];\n\n  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\n      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core Angular service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * ## General usage\n     * The `$http` service is a function which takes a single argument — a configuration object —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}\n     * with two $http specific methods: `success` and `error`.\n     *\n     * ```js\n     *   // Simple GET request example :\n     *   $http.get('/someUrl').\n     *     success(function(data, status, headers, config) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }).\n     *     error(function(data, status, headers, config) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     * ```js\n     *   // Simple POST request example (passing data) :\n     *   $http.post('/someUrl', {msg:'hello word!'}).\n     *     success(function(data, status, headers, config) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }).\n     *     error(function(data, status, headers, config) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     *\n     * Since the returned value of calling the $http function is a `promise`, you can also use\n     * the `then` method to register callbacks, and these callbacks will receive a single argument –\n     * an object representing the response. See the API signature and type info below for more\n     * details.\n     *\n     * A response status code between 200 and 299 is considered a success status and\n     * will result in the success callback being called. Note that if the response is a redirect,\n     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be\n     * called for such responses.\n     *\n     * ## Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * ## Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests.\n     *\n     * ```js\n     *   $http.get('/someUrl').success(successCallback);\n     *   $http.post('/someUrl', data).success(successCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     * - {@link ng.$http#patch $http.patch}\n     *\n     *\n     * ## Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - `Accept: application/json, text/plain, * / *`\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,\n     * Use the `headers` property, setting the desired header to `undefined`. For example:\n     *\n     * ```js\n     * var req = {\n     *  method: 'POST',\n     *  url: 'http://example.com',\n     *  headers: {\n     *    'Content-Type': undefined\n     *  },\n     *  data: { test: 'test' },\n     * }\n     *\n     * $http(req).success(function(){...}).error(function(){...});\n     * ```\n     *\n     * ## Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transformation functions: `transformRequest`\n     * and `transformResponse`. These properties can be a single function that returns\n     * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions,\n     * which allows you to `push` or `unshift` a new transformation function into the transformation chain.\n     *\n     * ### Default Transformations\n     *\n     * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and\n     * `defaults.transformResponse` properties. If a request does not provide its own transformations\n     * then these will be applied.\n     *\n     * You can augment or replace the default transformations by modifying these properties by adding to or\n     * replacing the array.\n     *\n     * Angular provides the following default transformations:\n     *\n     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If JSON response is detected, deserialize it using a JSON parser.\n     *\n     *\n     * ### Overriding the Default Transformations Per Request\n     *\n     * If you wish override the request/response transformations only for a single request then provide\n     * `transformRequest` and/or `transformResponse` properties on the configuration object passed\n     * into `$http`.\n     *\n     * Note that if you provide these properties on the config object the default transformations will be\n     * overwritten. If you wish to augment the default transformations then you must include them in your\n     * local transformation array.\n     *\n     * The following code demonstrates adding a new response transformation to be run after the default response\n     * transformations have been run.\n     *\n     * ```js\n     * function appendTransform(defaults, transform) {\n     *\n     *   // We can't guarantee that the default transformation is an array\n     *   defaults = angular.isArray(defaults) ? defaults : [defaults];\n     *\n     *   // Append the new transformation to the defaults\n     *   return defaults.concat(transform);\n     * }\n     *\n     * $http({\n     *   url: '...',\n     *   method: 'GET',\n     *   transformResponse: appendTransform($http.defaults.transformResponse, function(value) {\n     *     return doTransform(value);\n     *   })\n     * });\n     * ```\n     *\n     *\n     * ## Caching\n     *\n     * To enable caching, set the request configuration `cache` property to `true` (to use default\n     * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).\n     * When the cache is enabled, `$http` stores the response from the server in the specified\n     * cache. The next time the same request is made, the response is served from the cache without\n     * sending a request to the server.\n     *\n     * Note that even if the response is served from cache, delivery of the data is asynchronous in\n     * the same way that real requests are.\n     *\n     * If there are multiple GET requests for the same URL that should be cached using the same\n     * cache, but the cache is not populated yet, only one request to the server will be made and\n     * the remaining requests will be fulfilled using the response from the first request.\n     *\n     * You can change the default cache to a new object (built with\n     * {@link ng.$cacheFactory `$cacheFactory`}) by updating the\n     * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set\n     * their `cache` property to `true` will now use this cache object.\n     *\n     * If you set the default cache to `false` then only requests that specify their own custom\n     * cache object will be cached.\n     *\n     * ## Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http `config` object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * ## Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ### JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * Angular will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * Angular will strip the prefix, before processing the JSON.\n     *\n     *\n     * ### Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which\n     * an unauthorized site can gain your user's private data. Angular provides a mechanism\n     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\n     * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only\n     * JavaScript that runs on your domain could read the cookie, your server can be assured that\n     * the XHR came from JavaScript running on your domain. The header will not be set for\n     * cross-domain requests.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\n     * that only JavaScript running on your domain could have sent the request. The token must be\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)\n     * for added security.\n     *\n     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\n     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\n     * or the per-request config object.\n     *\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned\n     *      to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be\n     *      JSONified.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body, headers and status and returns its transformed (typically deserialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\n     *      GET request, otherwise if a cache instance built with\n     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\n     *      caching.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *    - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\n     *\n     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\n     *   standard `then` method and two http specific methods: `success` and `error`. The `then`\n     *   method takes two arguments a success and an error callback which will be called with a\n     *   response object. The `success` and `error` methods take a single argument - a function that\n     *   will be called when the request succeeds or fails respectively. The arguments passed into\n     *   these functions are destructured representation of the response object passed into the\n     *   `then` method. The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with the transform\n     *     functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example module=\"httpExample\">\n<file name=\"index.html\">\n  <div ng-controller=\"FetchController\">\n    <select ng-model=\"method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\"/>\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  angular.module('httpExample', [])\n    .controller('FetchController', ['$scope', '$http', '$templateCache',\n      function($scope, $http, $templateCache) {\n        $scope.method = 'GET';\n        $scope.url = 'http-hello.html';\n\n        $scope.fetch = function() {\n          $scope.code = null;\n          $scope.response = null;\n\n          $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n            success(function(data, status) {\n              $scope.status = status;\n              $scope.data = data;\n            }).\n            error(function(data, status) {\n              $scope.data = data || \"Request failed\";\n              $scope.status = status;\n          });\n        };\n\n        $scope.updateModel = function(method, url) {\n          $scope.method = method;\n          $scope.url = url;\n        };\n      }]);\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185\n// it('should make a JSONP request to angularjs.org', function() {\n//   sampleJsonpBtn.click();\n//   fetchBtn.click();\n//   expect(status.getText()).toMatch('200');\n//   expect(data.getText()).toMatch(/Super Hero!/);\n// });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n\n      if (!angular.isObject(requestConfig)) {\n        throw minErr('$http')('badreq', 'Http request configuration must be an object.  Received: {0}', requestConfig);\n      }\n\n      var config = extend({\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse\n      }, requestConfig);\n\n      config.headers = mergeHeaders(requestConfig);\n      config.method = uppercase(config.method);\n\n      var serverRequest = function(config) {\n        var headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(reqData)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n                delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData).then(transformResponse, transformResponse);\n      };\n\n      var chain = [serverRequest, undefined];\n      var promise = $q.when(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          chain.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          chain.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      while (chain.length) {\n        var thenFn = chain.shift();\n        var rejectFn = chain.shift();\n\n        promise = promise.then(thenFn, rejectFn);\n      }\n\n      promise.success = function(fn) {\n        promise.then(function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      promise.error = function(fn) {\n        promise.then(null, function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      return promise;\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response);\n        if (!response.data) {\n          resp.data = response.data;\n        } else {\n          resp.data = transformData(response.data, response.headers, response.status, config.transformResponse);\n        }\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n\n      function executeHeaderFns(headers) {\n        var headerContent, processedHeaders = {};\n\n        forEach(headers, function(headerFn, header) {\n          if (isFunction(headerFn)) {\n            headerContent = headerFn();\n            if (headerContent != null) {\n              processedHeaders[header] = headerContent;\n            }\n          } else {\n            processedHeaders[header] = headerFn;\n          }\n        });\n\n        return processedHeaders;\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // using for-in instead of forEach to avoid unecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        // execute if header value is a function for merged headers\n        return executeHeaderFns(reqHeaders);\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\n     *                     The name of the callback should be the string `JSON_CALLBACK`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n     /**\n      * @ngdoc method\n      * @name $http#patch\n      *\n      * @description\n      * Shortcut method to perform `PATCH` request.\n      *\n      * @param {string} url Relative or absolute URL specifying the destination of the request\n      * @param {*} data Request content\n      * @param {Object=} config Optional configuration object\n      * @returns {HttpPromise} Future object\n      */\n    createShortMethodsWithData('post', 'put', 'patch');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          reqHeaders = config.headers,\n          url = buildUrl(config.url, config.params);\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n\n      if ((config.cache || defaults.cache) && config.cache !== false &&\n          (config.method === 'GET' || config.method === 'JSONP')) {\n        cache = isObject(config.cache) ? config.cache\n              : isObject(defaults.cache) ? defaults.cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (isPromiseLike(cachedResp)) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n\n      // if we won't have the response in cache, set the xsrf headers and\n      // send the request to the backend\n      if (isUndefined(cachedResp)) {\n        var xsrfValue = urlIsSameOrigin(config.url)\n            ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]\n            : undefined;\n        if (xsrfValue) {\n          reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n        }\n\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType);\n      }\n\n      return promise;\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        function resolveHttpPromise() {\n          resolvePromise(response, status, headersString, statusText);\n        }\n\n        if (useApplyAsync) {\n          $rootScope.$applyAsync(resolveHttpPromise);\n        } else {\n          resolveHttpPromise();\n          if (!$rootScope.$$phase) $rootScope.$apply();\n        }\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText) {\n        // normalize internal statuses to 0\n        status = Math.max(status, 0);\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText: statusText\n        });\n      }\n\n      function resolvePromiseWithResult(result) {\n        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);\n      }\n\n      function removePendingReq() {\n        var idx = $http.pendingRequests.indexOf(config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, params) {\n      if (!params) return url;\n      var parts = [];\n      forEachSorted(params, function(value, key) {\n        if (value === null || isUndefined(value)) return;\n        if (!isArray(value)) value = [value];\n\n        forEach(value, function(v) {\n          if (isObject(v)) {\n            if (isDate(v)) {\n              v = v.toISOString();\n            } else {\n              v = toJson(v);\n            }\n          }\n          parts.push(encodeUriQuery(key) + '=' +\n                     encodeUriQuery(v));\n        });\n      });\n      if (parts.length > 0) {\n        url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\n      }\n      return url;\n    }\n  }];\n}\n\nfunction createXhr() {\n    return new window.XMLHttpRequest();\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $window\n * @requires $document\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {\n    return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {\n    $browser.$$incOutstandingRequestCount();\n    url = url || $browser.url();\n\n    if (lowercase(method) == 'jsonp') {\n      var callbackId = '_' + (callbacks.counter++).toString(36);\n      callbacks[callbackId] = function(data) {\n        callbacks[callbackId].data = data;\n        callbacks[callbackId].called = true;\n      };\n\n      var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\n          callbackId, function(status, text) {\n        completeRequest(callback, status, callbacks[callbackId].data, \"\", text);\n        callbacks[callbackId] = noop;\n      });\n    } else {\n\n      var xhr = createXhr();\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      xhr.onload = function requestLoaded() {\n        var statusText = xhr.statusText || '';\n\n        // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n        // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n        var response = ('response' in xhr) ? xhr.response : xhr.responseText;\n\n        // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n        var status = xhr.status === 1223 ? 204 : xhr.status;\n\n        // fix status code when it is 0 (0 status is undocumented).\n        // Occurs when accessing file resources or on Android 4.1 stock browser\n        // while retrieving files from application cache.\n        if (status === 0) {\n          status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;\n        }\n\n        completeRequest(callback,\n            status,\n            response,\n            xhr.getAllResponseHeaders(),\n            statusText);\n      };\n\n      var requestError = function() {\n        // The response is always empty\n        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error\n        completeRequest(callback, -1, null, null, '');\n      };\n\n      xhr.onerror = requestError;\n      xhr.onabort = requestError;\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(post || null);\n    }\n\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(timeoutRequest, timeout);\n    } else if (isPromiseLike(timeout)) {\n      timeout.then(timeoutRequest);\n    }\n\n\n    function timeoutRequest() {\n      jsonpDone && jsonpDone();\n      xhr && xhr.abort();\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText) {\n      // cancel timeout and subsequent timeout promise resolution\n      if (timeoutId !== undefined) {\n        $browserDefer.cancel(timeoutId);\n      }\n      jsonpDone = xhr = null;\n\n      callback(status, response, headersString, statusText);\n      $browser.$$completeOutstandingRequest(noop);\n    }\n  };\n\n  function jsonpReq(url, callbackId, done) {\n    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = \"text/javascript\";\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      removeEventListenerFn(script, \"load\", callback);\n      removeEventListenerFn(script, \"error\", callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = \"unknown\";\n\n      if (event) {\n        if (event.type === \"load\" && !callbacks[callbackId].called) {\n          event = { type: \"error\" };\n        }\n        text = event.type;\n        status = event.type === \"error\" ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    addEventListenerFn(script, \"load\", callback);\n    addEventListenerFn(script, \"error\", callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = minErr('$interpolate');\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * @example\n<example module=\"customInterpolationApp\">\n<file name=\"index.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-app=\"App\" ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value) {\n    if (value) {\n      startSymbol = value;\n      return this;\n    } else {\n      return startSymbol;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value) {\n    if (value) {\n      endSymbol = value;\n      return this;\n    } else {\n      return endSymbol;\n    }\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @kind function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context)).toBeUndefined();\n     *   context.name = 'Angular';\n     *   expect(exp(context)).toEqual('Hello Angular!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * ####Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example>\n     *  <file name=\"index.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          expressions = [],\n          parseFns = [],\n          textLength = text.length,\n          exp,\n          concat = [],\n          expressionPositions = [];\n\n      while (index < textLength) {\n        if (((startIndex = text.indexOf(startSymbol, index)) != -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) {\n          if (index !== startIndex) {\n            concat.push(unescapeText(text.substring(index, startIndex)));\n          }\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          parseFns.push($parse(exp, parseStringifyInterceptor));\n          index = endIndex + endSymbolLength;\n          expressionPositions.push(concat.length);\n          concat.push('');\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            concat.push(unescapeText(text.substring(index)));\n          }\n          break;\n        }\n      }\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for iframe[src], object[src], etc., we ensure that the value\n      // that's used is assigned or constructed by some JS code somewhere that is more testable or\n      // make it obvious that you bound the value to some user controlled value.  This helps reduce\n      // the load when auditing for XSS issues.\n      if (trustedContext && concat.length > 1) {\n          throw $interpolateMinErr('noconcat',\n              \"Error while interpolating: {0}\\nStrict Contextual Escaping disallows \" +\n              \"interpolations that concatenate multiple expressions when a trusted value is \" +\n              \"required.  See http://docs.angularjs.org/api/ng.$sce\", text);\n      }\n\n      if (!mustHaveExpression || expressions.length) {\n        var compute = function(values) {\n          for (var i = 0, ii = expressions.length; i < ii; i++) {\n            if (allOrNothing && isUndefined(values[i])) return;\n            concat[expressionPositions[i]] = values[i];\n          }\n          return concat.join('');\n        };\n\n        var getValue = function(value) {\n          return trustedContext ?\n            $sce.getTrusted(trustedContext, value) :\n            $sce.valueOf(value);\n        };\n\n        var stringify = function(value) {\n          if (value == null) { // null || undefined\n            return '';\n          }\n          switch (typeof value) {\n            case 'string':\n              break;\n            case 'number':\n              value = '' + value;\n              break;\n            default:\n              value = toJson(value);\n          }\n\n          return value;\n        };\n\n        return extend(function interpolationFn(context) {\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n\n            try {\n              for (; i < ii; i++) {\n                values[i] = parseFns[i](context);\n              }\n\n              return compute(values);\n            } catch (err) {\n              var newErr = $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text,\n                  err.toString());\n              $exceptionHandler(newErr);\n            }\n\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          expressions: expressions,\n          $$watchDelegate: function(scope, listener, objectEquality) {\n            var lastValue;\n            return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) {\n              var currValue = compute(values);\n              if (isFunction(listener)) {\n                listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);\n              }\n              lastValue = currValue;\n            }, objectEquality);\n          }\n        });\n      }\n\n      function unescapeText(text) {\n        return text.replace(escapedStartRegexp, startSymbol).\n          replace(escapedEndRegexp, endSymbol);\n      }\n\n      function parseStringifyInterceptor(value) {\n        try {\n          value = getValue(value);\n          return allOrNothing && !isDefined(value) ? value : stringify(value);\n        } catch (err) {\n          var newErr = $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text,\n            err.toString());\n          $exceptionHandler(newErr);\n        }\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\nfunction $IntervalProvider() {\n  this.$get = ['$rootScope', '$window', '$q', '$$q',\n       function($rootScope,   $window,   $q,   $$q) {\n    var intervals = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $interval\n      *\n      * @description\n      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n      * milliseconds.\n      *\n      * The return value of registering an interval function is a promise. This promise will be\n      * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n      * run indefinitely if `count` is not defined. The value of the notification will be the\n      * number of iterations that have run.\n      * To cancel an interval, call `$interval.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n      * time.\n      *\n      * <div class=\"alert alert-warning\">\n      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n      * with them.  In particular they are not automatically destroyed when a controller's scope or a\n      * directive's element are destroyed.\n      * You should take this into consideration and make sure to always cancel the interval at the\n      * appropriate moment.  See the example below for more details on how and when to do this.\n      * </div>\n      *\n      * @param {function()} fn A function that should be called repeatedly.\n      * @param {number} delay Number of milliseconds between each function call.\n      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n      *   indefinitely.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {promise} A promise which will be notified on each iteration.\n      *\n      * @example\n      * <example module=\"intervalExample\">\n      * <file name=\"index.html\">\n      *   <script>\n      *     angular.module('intervalExample', [])\n      *       .controller('ExampleController', ['$scope', '$interval',\n      *         function($scope, $interval) {\n      *           $scope.format = 'M/d/yy h:mm:ss a';\n      *           $scope.blood_1 = 100;\n      *           $scope.blood_2 = 120;\n      *\n      *           var stop;\n      *           $scope.fight = function() {\n      *             // Don't start a new fight if we are already fighting\n      *             if ( angular.isDefined(stop) ) return;\n      *\n      *             stop = $interval(function() {\n      *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n      *                 $scope.blood_1 = $scope.blood_1 - 3;\n      *                 $scope.blood_2 = $scope.blood_2 - 4;\n      *               } else {\n      *                 $scope.stopFight();\n      *               }\n      *             }, 100);\n      *           };\n      *\n      *           $scope.stopFight = function() {\n      *             if (angular.isDefined(stop)) {\n      *               $interval.cancel(stop);\n      *               stop = undefined;\n      *             }\n      *           };\n      *\n      *           $scope.resetFight = function() {\n      *             $scope.blood_1 = 100;\n      *             $scope.blood_2 = 120;\n      *           };\n      *\n      *           $scope.$on('$destroy', function() {\n      *             // Make sure that the interval is destroyed too\n      *             $scope.stopFight();\n      *           });\n      *         }])\n      *       // Register the 'myCurrentTime' directive factory method.\n      *       // We inject $interval and dateFilter service since the factory method is DI.\n      *       .directive('myCurrentTime', ['$interval', 'dateFilter',\n      *         function($interval, dateFilter) {\n      *           // return the directive link function. (compile function not needed)\n      *           return function(scope, element, attrs) {\n      *             var format,  // date format\n      *                 stopTime; // so that we can cancel the time updates\n      *\n      *             // used to update the UI\n      *             function updateTime() {\n      *               element.text(dateFilter(new Date(), format));\n      *             }\n      *\n      *             // watch the expression, and update the UI on change.\n      *             scope.$watch(attrs.myCurrentTime, function(value) {\n      *               format = value;\n      *               updateTime();\n      *             });\n      *\n      *             stopTime = $interval(updateTime, 1000);\n      *\n      *             // listen on DOM destroy (removal) event, and cancel the next UI update\n      *             // to prevent updating time after the DOM element was removed.\n      *             element.on('$destroy', function() {\n      *               $interval.cancel(stopTime);\n      *             });\n      *           }\n      *         }]);\n      *   </script>\n      *\n      *   <div>\n      *     <div ng-controller=\"ExampleController\">\n      *       Date format: <input ng-model=\"format\"> <hr/>\n      *       Current time is: <span my-current-time=\"format\"></span>\n      *       <hr/>\n      *       Blood 1 : <font color='red'>{{blood_1}}</font>\n      *       Blood 2 : <font color='red'>{{blood_2}}</font>\n      *       <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n      *       <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n      *       <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n      *     </div>\n      *   </div>\n      *\n      * </file>\n      * </example>\n      */\n    function interval(fn, delay, count, invokeApply) {\n      var setInterval = $window.setInterval,\n          clearInterval = $window.clearInterval,\n          iteration = 0,\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise;\n\n      count = isDefined(count) ? count : 0;\n\n      promise.then(null, null, fn);\n\n      promise.$$intervalId = setInterval(function tick() {\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          deferred.resolve(iteration);\n          clearInterval(promise.$$intervalId);\n          delete intervals[promise.$$intervalId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n\n      }, delay);\n\n      intervals[promise.$$intervalId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $interval#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`.\n      *\n      * @param {promise} promise returned by the `$interval` function.\n      * @returns {boolean} Returns `true` if the task was successfully canceled.\n      */\n    interval.cancel = function(promise) {\n      if (promise && promise.$$intervalId in intervals) {\n        intervals[promise.$$intervalId].reject('canceled');\n        $window.clearInterval(promise.$$intervalId);\n        delete intervals[promise.$$intervalId];\n        return true;\n      }\n      return false;\n    };\n\n    return interval;\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various Angular components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\nfunction $LocaleProvider() {\n  this.$get = function() {\n    return {\n      id: 'en-us',\n\n      NUMBER_FORMATS: {\n        DECIMAL_SEP: '.',\n        GROUP_SEP: ',',\n        PATTERNS: [\n          { // Decimal Pattern\n            minInt: 1,\n            minFrac: 0,\n            maxFrac: 3,\n            posPre: '',\n            posSuf: '',\n            negPre: '-',\n            negSuf: '',\n            gSize: 3,\n            lgSize: 3\n          },{ //Currency Pattern\n            minInt: 1,\n            minFrac: 2,\n            maxFrac: 2,\n            posPre: '\\u00A4',\n            posSuf: '',\n            negPre: '(\\u00A4',\n            negSuf: ')',\n            gSize: 3,\n            lgSize: 3\n          }\n        ],\n        CURRENCY_SYM: '$'\n      },\n\n      DATETIME_FORMATS: {\n        MONTH:\n            'January,February,March,April,May,June,July,August,September,October,November,December'\n            .split(','),\n        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\n        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\n        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\n        AMPMS: ['AM','PM'],\n        medium: 'MMM d, y h:mm:ss a',\n        'short': 'M/d/yy h:mm a',\n        fullDate: 'EEEE, MMMM d, y',\n        longDate: 'MMMM d, y',\n        mediumDate: 'MMM d, y',\n        shortDate: 'M/d/yy',\n        mediumTime: 'h:mm:ss a',\n        shortTime: 'h:mm a',\n        ERANAMES: [\n          \"Before Christ\",\n          \"Anno Domini\"\n        ],\n        ERAS: [\n          \"BC\",\n          \"AD\"\n        ]\n      },\n\n      pluralCat: function(num) {\n        if (num === 1) {\n          return 'one';\n        }\n        return 'other';\n      }\n    };\n  };\n}\n\nvar PATH_MATCH = /^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = encodeUriSegment(segments[i]);\n  }\n\n  return segments.join('/');\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj) {\n  var parsedUrl = urlResolve(absoluteUrl);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\n\nfunction parseAppUrl(relativeUrl, locationObj) {\n  var prefixed = (relativeUrl.charAt(0) !== '/');\n  if (prefixed) {\n    relativeUrl = '/' + relativeUrl;\n  }\n  var match = urlResolve(relativeUrl);\n  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\n      match.pathname.substring(1) : match.pathname);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\n\n/**\n *\n * @param {string} begin\n * @param {string} whole\n * @returns {string} returns text from whole after begin or undefined if it does not begin with\n *                   expected string.\n */\nfunction beginsWith(begin, whole) {\n  if (whole.indexOf(begin) === 0) {\n    return whole.substr(begin.length);\n  }\n}\n\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index == -1 ? url : url.substr(0, index);\n}\n\nfunction trimEmptyHash(url) {\n  return url.replace(/(#.+)|#$/, '$1');\n}\n\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents an url\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} basePrefix url path prefix\n */\nfunction LocationHtml5Url(appBase, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  var appBaseNoFile = stripFile(appBase);\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given html5 (regular) url string into properties\n   * @param {string} url HTML5 url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = beginsWith(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  /**\n   * Compose url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n    var appUrl, prevAppUrl;\n    var rewrittenUrl;\n\n    if ((appUrl = beginsWith(appBase, url)) !== undefined) {\n      prevAppUrl = appUrl;\n      if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) {\n        rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);\n      } else {\n        rewrittenUrl = appBase + prevAppUrl;\n      }\n    } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) {\n      rewrittenUrl = appBaseNoFile + appUrl;\n    } else if (appBaseNoFile == url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, hashPrefix) {\n  var appBaseNoFile = stripFile(appBase);\n\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given hashbang url into properties\n   * @param {string} url Hashbang url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);\n    var withoutHashUrl;\n\n    if (withoutBaseUrl.charAt(0) === '#') {\n\n      // The rest of the url starts with a hash so we have\n      // got either a hashbang path or a plain hash fragment\n      withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl);\n      if (isUndefined(withoutHashUrl)) {\n        // There was no hashbang prefix so we just have a hash fragment\n        withoutHashUrl = withoutBaseUrl;\n      }\n\n    } else {\n      // There was no hashbang path nor hash fragment:\n      // If we are in HTML5 mode we use what is left as the path;\n      // Otherwise we ignore what is left\n      withoutHashUrl = this.$$html5 ? withoutBaseUrl : '';\n    }\n\n    parseAppUrl(withoutHashUrl, this);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of Angular, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName(path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (url.indexOf(base) === 0) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  /**\n   * Compose hashbang url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (stripHash(appBase) == stripHash(url)) {\n      this.$$parse(url);\n      return true;\n    }\n    return false;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  var appBaseNoFile = stripFile(appBase);\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n\n    var rewrittenUrl;\n    var appUrl;\n\n    if (appBase == stripHash(url)) {\n      rewrittenUrl = url;\n    } else if ((appUrl = beginsWith(appBaseNoFile, url))) {\n      rewrittenUrl = appBase + hashPrefix + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'\n    this.$$absUrl = appBase + hashPrefix + this.$$url;\n  };\n\n}\n\n\nvar locationPrototype = {\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full url representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var absUrl = $location.absUrl();\n   * // => \"http://example.com/#/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @return {string} full url\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var url = $location.url();\n   * // => \"/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\n   * @return {string} url\n   */\n  url: function(url) {\n    if (isUndefined(url))\n      return this.$$url;\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1] || url === '') this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1] || url === '') this.search(match[3] || '');\n    this.hash(match[5] || '');\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current url.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var protocol = $location.protocol();\n   * // => \"http\"\n   * ```\n   *\n   * @return {string} protocol of current url\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current url.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var host = $location.host();\n   * // => \"example.com\"\n   * ```\n   *\n   * @return {string} host of current url.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current url.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var port = $location.port();\n   * // => 80\n   * ```\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current url when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var path = $location.path();\n   * // => \"/some/path\"\n   * ```\n   *\n   * @param {(string|number)=} path New path\n   * @return {string} path\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    path = path !== null ? path.toString() : '';\n    return path.charAt(0) == '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current url when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // $location.search() => {foo: 'yipee', baz: 'xoxo'}\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the url.\n   *\n   * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`\n   * will override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * If `paramValue` is `true`, the property specified via the first argument will be added with no\n   * value nor trailing equal sign.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search) || isNumber(search)) {\n          search = search.toString();\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          search = copy(search, {});\n          // remove object undefined or null properties\n          forEach(search, function(value, key) {\n            if (value == null) delete search[key];\n          });\n\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return hash fragment when called without any parameter.\n   *\n   * Change hash fragment when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue\n   * var hash = $location.hash();\n   * // => \"hashValue\"\n   * ```\n   *\n   * @param {(string|number)=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', function(hash) {\n    return hash !== null ? hash.toString() : '';\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during current `$digest` will be replacing current history\n   * record, instead of adding new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nforEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) {\n  Location.prototype = Object.create(locationPrototype);\n\n  /**\n   * @ngdoc method\n   * @name $location#state\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return the history state object when called without any parameter.\n   *\n   * Change the history state object when called with one parameter and return `$location`.\n   * The state object is later passed to `pushState` or `replaceState`.\n   *\n   * NOTE: This method is supported only in HTML5 mode and only in browsers supporting\n   * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support\n   * older browsers (like IE9 or Android < 4.0), don't use this method.\n   *\n   * @param {object=} state State object for pushState or replaceState\n   * @return {object} state\n   */\n  Location.prototype.state = function(state) {\n    if (!arguments.length)\n      return this.$$state;\n\n    if (Location !== LocationHtml5Url || !this.$$html5) {\n      throw $locationMinErr('nostate', 'History API state support is available only ' +\n        'in HTML5 mode and only in browsers supporting HTML5 History API');\n    }\n    // The user might modify `stateObject` after invoking `$location.state(stateObject)`\n    // but we're changing the $$state reference to $browser.state() during the $digest\n    // so the modification window is narrow.\n    this.$$state = isUndefined(state) ? null : state;\n\n    return this;\n  };\n});\n\n\nfunction locationGetter(property) {\n  return function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return function(value) {\n    if (isUndefined(value))\n      return this[property];\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider() {\n  var hashPrefix = '',\n      html5Mode = {\n        enabled: false,\n        requireBase: true,\n        rewriteLinks: true\n      };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#hashPrefix\n   * @description\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.\n   *   If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported\n   *   properties:\n   *   - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to\n   *     change urls where supported. Will fall back to hash-prefixed paths in browsers that do not\n   *     support `pushState`.\n   *   - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies\n   *     whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are\n   *     true, and a base tag is not present, an error will be thrown when `$location` is injected.\n   *     See the {@link guide/$location $location guide for more information}\n   *   - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled,\n   *     enables/disables url rewriting for relative links.\n   *\n   * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isBoolean(mode)) {\n      html5Mode.enabled = mode;\n      return this;\n    } else if (isObject(mode)) {\n\n      if (isBoolean(mode.enabled)) {\n        html5Mode.enabled = mode.enabled;\n      }\n\n      if (isBoolean(mode.requireBase)) {\n        html5Mode.requireBase = mode.requireBase;\n      }\n\n      if (isBoolean(mode.rewriteLinks)) {\n        html5Mode.rewriteLinks = mode.rewriteLinks;\n      }\n\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change.\n   *\n   * This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',\n      function($rootScope, $browser, $sniffer, $rootElement, $window) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode.enabled) {\n      if (!baseHref && html5Mode.requireBase) {\n        throw $locationMinErr('nobase',\n          \"$location in HTML5 mode requires a <base> tag to be present!\");\n      }\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    $location = new LocationMode(appBase, '#' + hashPrefix);\n    $location.$$parseLinkUrl(initialUrl, initialUrl);\n\n    $location.$$state = $browser.state();\n\n    var IGNORE_URI_REGEXP = /^\\s*(javascript|mailto):/i;\n\n    function setBrowserUrlWithFallback(url, replace, state) {\n      var oldUrl = $location.url();\n      var oldState = $location.$$state;\n      try {\n        $browser.url(url, replace, state);\n\n        // Make sure $location.state() returns referentially identical (not just deeply equal)\n        // state object; this makes possible quick checking if the state changed in the digest\n        // loop. Checking deep equality would be too expensive.\n        $location.$$state = $browser.state();\n      } catch (e) {\n        // Restore old values if pushState fails\n        $location.url(oldUrl);\n        $location.$$state = oldState;\n\n        throw e;\n      }\n    }\n\n    $rootElement.on('click', function(event) {\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (nodeName_(elm[0]) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      var absHref = elm.prop('href');\n      // get the actual href attribute - see\n      // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n      var relHref = elm.attr('href') || elm.attr('xlink:href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Ignore when url is started with javascript: or mailto:\n      if (IGNORE_URI_REGEXP.test(absHref)) return;\n\n      if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {\n        if ($location.$$parseLinkUrl(absHref, relHref)) {\n          // We do a preventDefault for all urls that are part of the angular application,\n          // in html5mode and also without, so that we are able to abort navigation without\n          // getting double entries in the location history.\n          event.preventDefault();\n          // update location manually\n          if ($location.absUrl() != $browser.url()) {\n            $rootScope.$apply();\n            // hack to work around FF6 bug 684208 when scenario runner clicks on links\n            $window.angular['ff-684208-preventDefault'] = true;\n          }\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    var initializing = true;\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl, newState) {\n      $rootScope.$evalAsync(function() {\n        var oldUrl = $location.absUrl();\n        var oldState = $location.$$state;\n        var defaultPrevented;\n\n        $location.$$parse(newUrl);\n        $location.$$state = newState;\n\n        defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n            newState, oldState).defaultPrevented;\n\n        // if the location was changed by a `$locationChangeStart` handler then stop\n        // processing this location change\n        if ($location.absUrl() !== newUrl) return;\n\n        if (defaultPrevented) {\n          $location.$$parse(oldUrl);\n          $location.$$state = oldState;\n          setBrowserUrlWithFallback(oldUrl, false, oldState);\n        } else {\n          initializing = false;\n          afterLocationChange(oldUrl, oldState);\n        }\n      });\n      if (!$rootScope.$$phase) $rootScope.$digest();\n    });\n\n    // update browser\n    $rootScope.$watch(function $locationWatch() {\n      var oldUrl = trimEmptyHash($browser.url());\n      var newUrl = trimEmptyHash($location.absUrl());\n      var oldState = $browser.state();\n      var currentReplace = $location.$$replace;\n      var urlOrStateChanged = oldUrl !== newUrl ||\n        ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);\n\n      if (initializing || urlOrStateChanged) {\n        initializing = false;\n\n        $rootScope.$evalAsync(function() {\n          var newUrl = $location.absUrl();\n          var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n              $location.$$state, oldState).defaultPrevented;\n\n          // if the location was changed by a `$locationChangeStart` handler then stop\n          // processing this location change\n          if ($location.absUrl() !== newUrl) return;\n\n          if (defaultPrevented) {\n            $location.$$parse(oldUrl);\n            $location.$$state = oldState;\n          } else {\n            if (urlOrStateChanged) {\n              setBrowserUrlWithFallback(newUrl, currentReplace,\n                                        oldState === $location.$$state ? null : $location.$$state);\n            }\n            afterLocationChange(oldUrl, oldState);\n          }\n        });\n      }\n\n      $location.$$replace = false;\n\n      // we don't need to return anything because $evalAsync will make the digest loop dirty when\n      // there is a change\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl, oldState) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,\n        $location.$$state, oldState);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example module=\"logExample\">\n     <file name=\"script.js\">\n       angular.module('logExample', [])\n         .controller('LogController', ['$scope', '$log', function($scope, $log) {\n           $scope.$log = $log;\n           $scope.message = 'Hello World!';\n         }]);\n     </file>\n     <file name=\"index.html\">\n       <div ng-controller=\"LogController\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         Message:\n         <input type=\"text\" ng-model=\"message\"/>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n         <button ng-click=\"$log.debug(message)\">debug</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider() {\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc method\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n    return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window) {\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function() {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      }())\n    };\n\n    function formatError(arg) {\n      if (arg instanceof Error) {\n        if (arg.stack) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop,\n          hasApply = false;\n\n      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\n      // The reason behind this is that console.log has type \"object\" in IE8...\n      try {\n        hasApply = !!logFn.apply;\n      } catch (e) {}\n\n      if (hasApply) {\n        return function() {\n          var args = [];\n          forEach(arguments, function(arg) {\n            args.push(formatError(arg));\n          });\n          return logFn.apply(console, args);\n        };\n      }\n\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\n      return function(arg1, arg2) {\n        logFn(arg1, arg2 == null ? '' : arg2);\n      };\n    }\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $parseMinErr = minErr('$parse');\n\n// Sandboxing Angular Expressions\n// ------------------------------\n// Angular expressions are generally considered safe because these expressions only have direct\n// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by\n// obtaining a reference to native JS functions such as the Function constructor.\n//\n// As an example, consider the following Angular expression:\n//\n//   {}.toString.constructor('alert(\"evil JS code\")')\n//\n// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits\n// against the expression language, but not to prevent exploits that were enabled by exposing\n// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good\n// practice and therefore we are not even trying to protect against interaction with an object\n// explicitly exposed in this way.\n//\n// In general, it is not possible to access a Window object from an angular expression unless a\n// window or some DOM object that has a reference to window is published onto a Scope.\n// Similarly we prevent invocations of function known to be dangerous, as well as assignments to\n// native objects.\n//\n// See https://docs.angularjs.org/guide/security\n\n\nfunction ensureSafeMemberName(name, fullExpression) {\n  if (name === \"__defineGetter__\" || name === \"__defineSetter__\"\n      || name === \"__lookupGetter__\" || name === \"__lookupSetter__\"\n      || name === \"__proto__\") {\n    throw $parseMinErr('isecfld',\n        'Attempting to access a disallowed field in Angular expressions! '\n        + 'Expression: {0}', fullExpression);\n  }\n  return name;\n}\n\nfunction ensureSafeObject(obj, fullExpression) {\n  // nifty check if obj is Function that is fast and works across iframes and other contexts\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n          'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isWindow(obj)\n        obj.window === obj) {\n      throw $parseMinErr('isecwindow',\n          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isElement(obj)\n        obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {\n      throw $parseMinErr('isecdom',\n          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// block Object so that we can't get hold of dangerous Object.* methods\n        obj === Object) {\n      throw $parseMinErr('isecobj',\n          'Referencing Object in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    }\n  }\n  return obj;\n}\n\nvar CALL = Function.prototype.call;\nvar APPLY = Function.prototype.apply;\nvar BIND = Function.prototype.bind;\n\nfunction ensureSafeFunction(obj, fullExpression) {\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n        'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n    } else if (obj === CALL || obj === APPLY || obj === BIND) {\n      throw $parseMinErr('isecff',\n        'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n    }\n  }\n}\n\n//Keyword constants\nvar CONSTANTS = createMap();\nforEach({\n  'null': function() { return null; },\n  'true': function() { return true; },\n  'false': function() { return false; },\n  'undefined': function() {}\n}, function(constantGetter, name) {\n  constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = true;\n  CONSTANTS[name] = constantGetter;\n});\n\n//Not quite a constant, but can be lex/parsed the same\nCONSTANTS['this'] = function(self) { return self; };\nCONSTANTS['this'].sharedGetter = true;\n\n\n//Operators - will be wrapped by binaryFn/unaryFn/assignment/filter\nvar OPERATORS = extend(createMap(), {\n    '+':function(self, locals, a, b) {\n      a=a(self, locals); b=b(self, locals);\n      if (isDefined(a)) {\n        if (isDefined(b)) {\n          return a + b;\n        }\n        return a;\n      }\n      return isDefined(b) ? b : undefined;},\n    '-':function(self, locals, a, b) {\n          a=a(self, locals); b=b(self, locals);\n          return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);\n        },\n    '*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);},\n    '/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);},\n    '%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);},\n    '===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);},\n    '!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);},\n    '==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);},\n    '!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);},\n    '<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);},\n    '>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);},\n    '<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);},\n    '>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);},\n    '&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);},\n    '||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);},\n    '!':function(self, locals, a) {return !a(self, locals);},\n\n    //Tokenized as operators but parsed as assignment/filters\n    '=':true,\n    '|':true\n});\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function(options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function(text) {\n    this.text = text;\n    this.index = 0;\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      if (ch === '\"' || ch === \"'\") {\n        this.readString(ch);\n      } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdent(ch)) {\n        this.readIdent();\n      } else if (this.is(ch, '(){}[].,;:?')) {\n        this.tokens.push({index: this.index, text: ch});\n        this.index++;\n      } else if (this.isWhitespace(ch)) {\n        this.index++;\n      } else {\n        var ch2 = ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var op1 = OPERATORS[ch];\n        var op2 = OPERATORS[ch2];\n        var op3 = OPERATORS[ch3];\n        if (op1 || op2 || op3) {\n          var token = op3 ? ch3 : (op2 ? ch2 : ch);\n          this.tokens.push({index: this.index, text: token, operator: true});\n          this.index += token.length;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n    }\n    return this.tokens;\n  },\n\n  is: function(ch, chars) {\n    return chars.indexOf(ch) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9') && typeof ch === \"string\";\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdent: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch == '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch == 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) == 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) == 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    this.tokens.push({\n      index: start,\n      text: number,\n      constant: true,\n      value: Number(number)\n    });\n  },\n\n  readIdent: function() {\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      if (!(this.isIdent(ch) || this.isNumber(ch))) {\n        break;\n      }\n      this.index++;\n    }\n    this.tokens.push({\n      index: start,\n      text: this.text.slice(start, this.index),\n      identifier: true\n    });\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i))\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          string = string + (rep || ch);\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          constant: true,\n          value: string\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\n\nfunction isConstant(exp) {\n  return exp.constant;\n}\n\n/**\n * @constructor\n */\nvar Parser = function(lexer, $filter, options) {\n  this.lexer = lexer;\n  this.$filter = $filter;\n  this.options = options;\n};\n\nParser.ZERO = extend(function() {\n  return 0;\n}, {\n  sharedGetter: true,\n  constant: true\n});\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function(text) {\n    this.text = text;\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.statements();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    value.literal = !!value.literal;\n    value.constant = !!value.constant;\n\n    return value;\n  },\n\n  primary: function() {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else if (this.peek().identifier && this.peek().text in CONSTANTS) {\n      primary = CONSTANTS[this.consume().text];\n    } else if (this.peek().identifier) {\n      primary = this.identifier();\n    } else if (this.peek().constant) {\n      primary = this.constant();\n    } else {\n      this.throwError('not a primary expression', this.peek());\n    }\n\n    var next, context;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = this.functionCall(primary, context);\n        context = null;\n      } else if (next.text === '[') {\n        context = primary;\n        primary = this.objectIndex(primary);\n      } else if (next.text === '.') {\n        context = primary;\n        primary = this.fieldAccess(primary);\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0)\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    return this.peekAhead(0, e1, e2, e3, e4);\n  },\n  peekAhead: function(i, e1, e2, e3, e4) {\n    if (this.tokens.length > i) {\n      var token = this.tokens[i];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4) {\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  consume: function(e1) {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n\n    var token = this.expect(e1);\n    if (!token) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n    return token;\n  },\n\n  unaryFn: function(op, right) {\n    var fn = OPERATORS[op];\n    return extend(function $parseUnaryFn(self, locals) {\n      return fn(self, locals, right);\n    }, {\n      constant:right.constant,\n      inputs: [right]\n    });\n  },\n\n  binaryFn: function(left, op, right, isBranching) {\n    var fn = OPERATORS[op];\n    return extend(function $parseBinaryFn(self, locals) {\n      return fn(self, locals, left, right);\n    }, {\n      constant: left.constant && right.constant,\n      inputs: !isBranching && [left, right]\n    });\n  },\n\n  identifier: function() {\n    var id = this.consume().text;\n\n    //Continue reading each `.identifier` unless it is a method invocation\n    while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) {\n      id += this.consume().text + this.consume().text;\n    }\n\n    return getterFn(id, this.options, this.text);\n  },\n\n  constant: function() {\n    var value = this.consume().value;\n\n    return extend(function $parseConstant() {\n      return value;\n    }, {\n      constant: true,\n      literal: true\n    });\n  },\n\n  statements: function() {\n    var statements = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        statements.push(this.filterChain());\n      if (!this.expect(';')) {\n        // optimize for the common case where there is only one statement.\n        // TODO(size): maybe we should not support multiple statements?\n        return (statements.length === 1)\n            ? statements[0]\n            : function $parseStatements(self, locals) {\n                var value;\n                for (var i = 0, ii = statements.length; i < ii; i++) {\n                  value = statements[i](self, locals);\n                }\n                return value;\n              };\n      }\n    }\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    var token;\n    while ((token = this.expect('|'))) {\n      left = this.filter(left);\n    }\n    return left;\n  },\n\n  filter: function(inputFn) {\n    var fn = this.$filter(this.consume().text);\n    var argsFn;\n    var args;\n\n    if (this.peek(':')) {\n      argsFn = [];\n      args = []; // we can safely reuse the array\n      while (this.expect(':')) {\n        argsFn.push(this.expression());\n      }\n    }\n\n    var inputs = [inputFn].concat(argsFn || []);\n\n    return extend(function $parseFilter(self, locals) {\n      var input = inputFn(self, locals);\n      if (args) {\n        args[0] = input;\n\n        var i = argsFn.length;\n        while (i--) {\n          args[i + 1] = argsFn[i](self, locals);\n        }\n\n        return fn.apply(undefined, args);\n      }\n\n      return fn(input);\n    }, {\n      constant: !fn.$stateful && inputs.every(isConstant),\n      inputs: !fn.$stateful && inputs\n    });\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var left = this.ternary();\n    var right;\n    var token;\n    if ((token = this.expect('='))) {\n      if (!left.assign) {\n        this.throwError('implies assignment but [' +\n            this.text.substring(0, token.index) + '] can not be assigned to', token);\n      }\n      right = this.ternary();\n      return extend(function $parseAssignment(scope, locals) {\n        return left.assign(scope, right(scope, locals), locals);\n      }, {\n        inputs: [left, right]\n      });\n    }\n    return left;\n  },\n\n  ternary: function() {\n    var left = this.logicalOR();\n    var middle;\n    var token;\n    if ((token = this.expect('?'))) {\n      middle = this.assignment();\n      if (this.consume(':')) {\n        var right = this.assignment();\n\n        return extend(function $parseTernary(self, locals) {\n          return left(self, locals) ? middle(self, locals) : right(self, locals);\n        }, {\n          constant: left.constant && middle.constant && right.constant\n        });\n      }\n    }\n\n    return left;\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    var token;\n    while ((token = this.expect('||'))) {\n      left = this.binaryFn(left, token.text, this.logicalAND(), true);\n    }\n    return left;\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    var token;\n    while ((token = this.expect('&&'))) {\n      left = this.binaryFn(left, token.text, this.equality(), true);\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    while ((token = this.expect('==','!=','===','!=='))) {\n      left = this.binaryFn(left, token.text, this.relational());\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    while ((token = this.expect('<', '>', '<=', '>='))) {\n      left = this.binaryFn(left, token.text, this.additive());\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = this.binaryFn(left, token.text, this.multiplicative());\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = this.binaryFn(left, token.text, this.unary());\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if (this.expect('+')) {\n      return this.primary();\n    } else if ((token = this.expect('-'))) {\n      return this.binaryFn(Parser.ZERO, token.text, this.unary());\n    } else if ((token = this.expect('!'))) {\n      return this.unaryFn(token.text, this.unary());\n    } else {\n      return this.primary();\n    }\n  },\n\n  fieldAccess: function(object) {\n    var getter = this.identifier();\n\n    return extend(function $parseFieldAccess(scope, locals, self) {\n      var o = self || object(scope, locals);\n      return (o == null) ? undefined : getter(o);\n    }, {\n      assign: function(scope, value, locals) {\n        var o = object(scope, locals);\n        if (!o) object.assign(scope, o = {}, locals);\n        return getter.assign(o, value);\n      }\n    });\n  },\n\n  objectIndex: function(obj) {\n    var expression = this.text;\n\n    var indexFn = this.expression();\n    this.consume(']');\n\n    return extend(function $parseObjectIndex(self, locals) {\n      var o = obj(self, locals),\n          i = indexFn(self, locals),\n          v;\n\n      ensureSafeMemberName(i, expression);\n      if (!o) return undefined;\n      v = ensureSafeObject(o[i], expression);\n      return v;\n    }, {\n      assign: function(self, value, locals) {\n        var key = ensureSafeMemberName(indexFn(self, locals), expression);\n        // prevent overwriting of Function.constructor which would break ensureSafeObject check\n        var o = ensureSafeObject(obj(self, locals), expression);\n        if (!o) obj.assign(self, o = {}, locals);\n        return o[key] = value;\n      }\n    });\n  },\n\n  functionCall: function(fnGetter, contextGetter) {\n    var argsFn = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        argsFn.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(')');\n\n    var expressionText = this.text;\n    // we can safely reuse the array across invocations\n    var args = argsFn.length ? [] : null;\n\n    return function $parseFunctionCall(scope, locals) {\n      var context = contextGetter ? contextGetter(scope, locals) : isDefined(contextGetter) ? undefined : scope;\n      var fn = fnGetter(scope, locals, context) || noop;\n\n      if (args) {\n        var i = argsFn.length;\n        while (i--) {\n          args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText);\n        }\n      }\n\n      ensureSafeObject(context, expressionText);\n      ensureSafeFunction(fn, expressionText);\n\n      // IE doesn't have apply for some native functions\n      var v = fn.apply\n            ? fn.apply(context, args)\n            : fn(args[0], args[1], args[2], args[3], args[4]);\n\n      if (args) {\n        // Free-up the memory (arguments of the last function call).\n        args.length = 0;\n      }\n\n      return ensureSafeObject(v, expressionText);\n      };\n  },\n\n  // This is used with json array declaration\n  arrayDeclaration: function() {\n    var elementFns = [];\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        elementFns.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return extend(function $parseArrayLiteral(self, locals) {\n      var array = [];\n      for (var i = 0, ii = elementFns.length; i < ii; i++) {\n        array.push(elementFns[i](self, locals));\n      }\n      return array;\n    }, {\n      literal: true,\n      constant: elementFns.every(isConstant),\n      inputs: elementFns\n    });\n  },\n\n  object: function() {\n    var keys = [], valueFns = [];\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        var token = this.consume();\n        if (token.constant) {\n          keys.push(token.value);\n        } else if (token.identifier) {\n          keys.push(token.text);\n        } else {\n          this.throwError(\"invalid key\", token);\n        }\n        this.consume(':');\n        valueFns.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return extend(function $parseObjectLiteral(self, locals) {\n      var object = {};\n      for (var i = 0, ii = valueFns.length; i < ii; i++) {\n        object[keys[i]] = valueFns[i](self, locals);\n      }\n      return object;\n    }, {\n      literal: true,\n      constant: valueFns.every(isConstant),\n      inputs: valueFns\n    });\n  }\n};\n\n\n//////////////////////////////////////////////////\n// Parser helper functions\n//////////////////////////////////////////////////\n\nfunction setter(obj, locals, path, setValue, fullExp) {\n  ensureSafeObject(obj, fullExp);\n  ensureSafeObject(locals, fullExp);\n\n  var element = path.split('.'), key;\n  for (var i = 0; element.length > 1; i++) {\n    key = ensureSafeMemberName(element.shift(), fullExp);\n    var propertyObj = (i === 0 && locals && locals[key]) || obj[key];\n    if (!propertyObj) {\n      propertyObj = {};\n      obj[key] = propertyObj;\n    }\n    obj = ensureSafeObject(propertyObj, fullExp);\n  }\n  key = ensureSafeMemberName(element.shift(), fullExp);\n  ensureSafeObject(obj[key], fullExp);\n  obj[key] = setValue;\n  return setValue;\n}\n\nvar getterFnCacheDefault = createMap();\nvar getterFnCacheExpensive = createMap();\n\nfunction isPossiblyDangerousMemberName(name) {\n  return name == 'constructor';\n}\n\n/**\n * Implementation of the \"Black Hole\" variant from:\n * - http://jsperf.com/angularjs-parse-getter/4\n * - http://jsperf.com/path-evaluation-simplified/7\n */\nfunction cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiveChecks) {\n  ensureSafeMemberName(key0, fullExp);\n  ensureSafeMemberName(key1, fullExp);\n  ensureSafeMemberName(key2, fullExp);\n  ensureSafeMemberName(key3, fullExp);\n  ensureSafeMemberName(key4, fullExp);\n  var eso = function(o) {\n    return ensureSafeObject(o, fullExp);\n  };\n  var eso0 = (expensiveChecks || isPossiblyDangerousMemberName(key0)) ? eso : identity;\n  var eso1 = (expensiveChecks || isPossiblyDangerousMemberName(key1)) ? eso : identity;\n  var eso2 = (expensiveChecks || isPossiblyDangerousMemberName(key2)) ? eso : identity;\n  var eso3 = (expensiveChecks || isPossiblyDangerousMemberName(key3)) ? eso : identity;\n  var eso4 = (expensiveChecks || isPossiblyDangerousMemberName(key4)) ? eso : identity;\n\n  return function cspSafeGetter(scope, locals) {\n    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;\n\n    if (pathVal == null) return pathVal;\n    pathVal = eso0(pathVal[key0]);\n\n    if (!key1) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = eso1(pathVal[key1]);\n\n    if (!key2) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = eso2(pathVal[key2]);\n\n    if (!key3) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = eso3(pathVal[key3]);\n\n    if (!key4) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = eso4(pathVal[key4]);\n\n    return pathVal;\n  };\n}\n\nfunction getterFnWithEnsureSafeObject(fn, fullExpression) {\n  return function(s, l) {\n    return fn(s, l, ensureSafeObject, fullExpression);\n  };\n}\n\nfunction getterFn(path, options, fullExp) {\n  var expensiveChecks = options.expensiveChecks;\n  var getterFnCache = (expensiveChecks ? getterFnCacheExpensive : getterFnCacheDefault);\n  var fn = getterFnCache[path];\n  if (fn) return fn;\n\n\n  var pathKeys = path.split('.'),\n      pathKeysLength = pathKeys.length;\n\n  // http://jsperf.com/angularjs-parse-getter/6\n  if (options.csp) {\n    if (pathKeysLength < 6) {\n      fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, expensiveChecks);\n    } else {\n      fn = function cspSafeGetter(scope, locals) {\n        var i = 0, val;\n        do {\n          val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],\n                                pathKeys[i++], fullExp, expensiveChecks)(scope, locals);\n\n          locals = undefined; // clear after first iteration\n          scope = val;\n        } while (i < pathKeysLength);\n        return val;\n      };\n    }\n  } else {\n    var code = '';\n    if (expensiveChecks) {\n      code += 's = eso(s, fe);\\nl = eso(l, fe);\\n';\n    }\n    var needsEnsureSafeObject = expensiveChecks;\n    forEach(pathKeys, function(key, index) {\n      ensureSafeMemberName(key, fullExp);\n      var lookupJs = (index\n                      // we simply dereference 's' on any .dot notation\n                      ? 's'\n                      // but if we are first then we check locals first, and if so read it first\n                      : '((l&&l.hasOwnProperty(\"' + key + '\"))?l:s)') + '.' + key;\n      if (expensiveChecks || isPossiblyDangerousMemberName(key)) {\n        lookupJs = 'eso(' + lookupJs + ', fe)';\n        needsEnsureSafeObject = true;\n      }\n      code += 'if(s == null) return undefined;\\n' +\n              's=' + lookupJs + ';\\n';\n    });\n    code += 'return s;';\n\n    /* jshint -W054 */\n    var evaledFnGetter = new Function('s', 'l', 'eso', 'fe', code); // s=scope, l=locals, eso=ensureSafeObject\n    /* jshint +W054 */\n    evaledFnGetter.toString = valueFn(code);\n    if (needsEnsureSafeObject) {\n      evaledFnGetter = getterFnWithEnsureSafeObject(evaledFnGetter, fullExp);\n    }\n    fn = evaledFnGetter;\n  }\n\n  fn.sharedGetter = true;\n  fn.assign = function(self, value, locals) {\n    return setter(self, locals, path, value, path);\n  };\n  getterFnCache[path] = fn;\n  return fn;\n}\n\nvar objectValueOf = Object.prototype.valueOf;\n\nfunction getValueOf(value) {\n  return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts Angular {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'angular'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('angular');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cacheDefault = createMap();\n  var cacheExpensive = createMap();\n\n\n\n  this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {\n    var $parseOptions = {\n          csp: $sniffer.csp,\n          expensiveChecks: false\n        },\n        $parseOptionsExpensive = {\n          csp: $sniffer.csp,\n          expensiveChecks: true\n        };\n\n    function wrapSharedExpression(exp) {\n      var wrapped = exp;\n\n      if (exp.sharedGetter) {\n        wrapped = function $parseWrapper(self, locals) {\n          return exp(self, locals);\n        };\n        wrapped.literal = exp.literal;\n        wrapped.constant = exp.constant;\n        wrapped.assign = exp.assign;\n      }\n\n      return wrapped;\n    }\n\n    return function $parse(exp, interceptorFn, expensiveChecks) {\n      var parsedExpression, oneTime, cacheKey;\n\n      switch (typeof exp) {\n        case 'string':\n          cacheKey = exp = exp.trim();\n\n          var cache = (expensiveChecks ? cacheExpensive : cacheDefault);\n          parsedExpression = cache[cacheKey];\n\n          if (!parsedExpression) {\n            if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n              oneTime = true;\n              exp = exp.substring(2);\n            }\n\n            var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions;\n            var lexer = new Lexer(parseOptions);\n            var parser = new Parser(lexer, $filter, parseOptions);\n            parsedExpression = parser.parse(exp);\n\n            if (parsedExpression.constant) {\n              parsedExpression.$$watchDelegate = constantWatchDelegate;\n            } else if (oneTime) {\n              //oneTime is not part of the exp passed to the Parser so we may have to\n              //wrap the parsedExpression before adding a $$watchDelegate\n              parsedExpression = wrapSharedExpression(parsedExpression);\n              parsedExpression.$$watchDelegate = parsedExpression.literal ?\n                oneTimeLiteralWatchDelegate : oneTimeWatchDelegate;\n            } else if (parsedExpression.inputs) {\n              parsedExpression.$$watchDelegate = inputsWatchDelegate;\n            }\n\n            cache[cacheKey] = parsedExpression;\n          }\n          return addInterceptor(parsedExpression, interceptorFn);\n\n        case 'function':\n          return addInterceptor(exp, interceptorFn);\n\n        default:\n          return addInterceptor(noop, interceptorFn);\n      }\n    };\n\n    function collectExpressionInputs(inputs, list) {\n      for (var i = 0, ii = inputs.length; i < ii; i++) {\n        var input = inputs[i];\n        if (!input.constant) {\n          if (input.inputs) {\n            collectExpressionInputs(input.inputs, list);\n          } else if (list.indexOf(input) === -1) { // TODO(perf) can we do better?\n            list.push(input);\n          }\n        }\n      }\n\n      return list;\n    }\n\n    function expressionInputDirtyCheck(newValue, oldValueOfValue) {\n\n      if (newValue == null || oldValueOfValue == null) { // null/undefined\n        return newValue === oldValueOfValue;\n      }\n\n      if (typeof newValue === 'object') {\n\n        // attempt to convert the value to a primitive type\n        // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can\n        //             be cheaply dirty-checked\n        newValue = getValueOf(newValue);\n\n        if (typeof newValue === 'object') {\n          // objects/arrays are not supported - deep-watching them would be too expensive\n          return false;\n        }\n\n        // fall-through to the primitive equality check\n      }\n\n      //Primitive or NaN\n      return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);\n    }\n\n    function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var inputExpressions = parsedExpression.$$inputs ||\n                    (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, []));\n\n      var lastResult;\n\n      if (inputExpressions.length === 1) {\n        var oldInputValue = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        inputExpressions = inputExpressions[0];\n        return scope.$watch(function expressionInputWatch(scope) {\n          var newInputValue = inputExpressions(scope);\n          if (!expressionInputDirtyCheck(newInputValue, oldInputValue)) {\n            lastResult = parsedExpression(scope);\n            oldInputValue = newInputValue && getValueOf(newInputValue);\n          }\n          return lastResult;\n        }, listener, objectEquality);\n      }\n\n      var oldInputValueOfValues = [];\n      for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n        oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails\n      }\n\n      return scope.$watch(function expressionInputsWatch(scope) {\n        var changed = false;\n\n        for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n          var newInputValue = inputExpressions[i](scope);\n          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {\n            oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);\n          }\n        }\n\n        if (changed) {\n          lastResult = parsedExpression(scope);\n        }\n\n        return lastResult;\n      }, listener, objectEquality);\n    }\n\n    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch, lastValue;\n      return unwatch = scope.$watch(function oneTimeWatch(scope) {\n        return parsedExpression(scope);\n      }, function oneTimeListener(value, old, scope) {\n        lastValue = value;\n        if (isFunction(listener)) {\n          listener.apply(this, arguments);\n        }\n        if (isDefined(value)) {\n          scope.$$postDigest(function() {\n            if (isDefined(lastValue)) {\n              unwatch();\n            }\n          });\n        }\n      }, objectEquality);\n    }\n\n    function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch, lastValue;\n      return unwatch = scope.$watch(function oneTimeWatch(scope) {\n        return parsedExpression(scope);\n      }, function oneTimeListener(value, old, scope) {\n        lastValue = value;\n        if (isFunction(listener)) {\n          listener.call(this, value, old, scope);\n        }\n        if (isAllDefined(value)) {\n          scope.$$postDigest(function() {\n            if (isAllDefined(lastValue)) unwatch();\n          });\n        }\n      }, objectEquality);\n\n      function isAllDefined(value) {\n        var allDefined = true;\n        forEach(value, function(val) {\n          if (!isDefined(val)) allDefined = false;\n        });\n        return allDefined;\n      }\n    }\n\n    function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch;\n      return unwatch = scope.$watch(function constantWatch(scope) {\n        return parsedExpression(scope);\n      }, function constantListener(value, old, scope) {\n        if (isFunction(listener)) {\n          listener.apply(this, arguments);\n        }\n        unwatch();\n      }, objectEquality);\n    }\n\n    function addInterceptor(parsedExpression, interceptorFn) {\n      if (!interceptorFn) return parsedExpression;\n      var watchDelegate = parsedExpression.$$watchDelegate;\n\n      var regularWatch =\n          watchDelegate !== oneTimeLiteralWatchDelegate &&\n          watchDelegate !== oneTimeWatchDelegate;\n\n      var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {\n        var value = parsedExpression(scope, locals);\n        return interceptorFn(value, scope, locals);\n      } : function oneTimeInterceptedExpression(scope, locals) {\n        var value = parsedExpression(scope, locals);\n        var result = interceptorFn(value, scope, locals);\n        // we only return the interceptor's result if the\n        // initial value is defined (for bind-once)\n        return isDefined(value) ? result : value;\n      };\n\n      // Propagate $$watchDelegates other then inputsWatchDelegate\n      if (parsedExpression.$$watchDelegate &&\n          parsedExpression.$$watchDelegate !== inputsWatchDelegate) {\n        fn.$$watchDelegate = parsedExpression.$$watchDelegate;\n      } else if (!interceptorFn.$stateful) {\n        // If there is an interceptor, but no watchDelegate then treat the interceptor like\n        // we treat filters - it is assumed to be a pure function unless flagged with $stateful\n        fn.$$watchDelegate = inputsWatchDelegate;\n        fn.inputs = [parsedExpression];\n      }\n\n      return fn;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A service that helps you run functions asynchronously, and use their return values (or exceptions)\n * when they are done processing.\n *\n * This is an implementation of promises/deferred objects inspired by\n * [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred\n * implementations, and the other which resembles ES6 promises to some degree.\n *\n * # $q constructor\n *\n * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`\n * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony,\n * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are\n * available yet.\n *\n * It can be used like so:\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     // perform some asynchronous operation, resolve or reject the promise when appropriate.\n *     return $q(function(resolve, reject) {\n *       setTimeout(function() {\n *         if (okToGreet(name)) {\n *           resolve('Hello, ' + name + '!');\n *         } else {\n *           reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       }, 1000);\n *     });\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   });\n * ```\n *\n * Note: progress/notify callbacks are not currently supported via the ES6-style interface.\n *\n * However, the more traditional CommonJS-style usage is still available, and documented below.\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       deferred.notify('About to greet ' + name + '.');\n *\n *       if (okToGreet(name)) {\n *         deferred.resolve('Hello, ' + name + '!');\n *       } else {\n *         deferred.reject('Greeting ' + name + ' is not allowed.');\n *       }\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n * # The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * # The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback`. It also notifies via the return value of the\n *   `notifyCallback` method. The promise cannot be resolved or rejected from the notifyCallback\n *   method.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n * # Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * # Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n *  # Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n *\n * @param {function(function, function)} resolver Function which is responsible for resolving or\n *   rejecting the newly created promise. The first parameter is a function which resolves the\n *   promise, the second parameter is a function which rejects the promise.\n *\n * @returns {Promise} The newly created promise.\n */\nfunction $QProvider() {\n\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler);\n  }];\n}\n\nfunction $$QProvider() {\n  this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $browser.defer(callback);\n    }, $exceptionHandler);\n  }];\n}\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler) {\n  var $qMinErr = minErr('$q', TypeError);\n  function callOnce(self, resolveFn, rejectFn) {\n    var called = false;\n    function wrap(fn) {\n      return function(value) {\n        if (called) return;\n        called = true;\n        fn.call(self, value);\n      };\n    }\n\n    return [wrap(resolveFn), wrap(rejectFn)];\n  }\n\n  /**\n   * @ngdoc method\n   * @name ng.$q#defer\n   * @kind function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  var defer = function() {\n    return new Deferred();\n  };\n\n  function Promise() {\n    this.$$state = { status: 0 };\n  }\n\n  Promise.prototype = {\n    then: function(onFulfilled, onRejected, progressBack) {\n      var result = new Deferred();\n\n      this.$$state.pending = this.$$state.pending || [];\n      this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);\n      if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);\n\n      return result.promise;\n    },\n\n    \"catch\": function(callback) {\n      return this.then(null, callback);\n    },\n\n    \"finally\": function(callback, progressBack) {\n      return this.then(function(value) {\n        return handleCallback(value, true, callback);\n      }, function(error) {\n        return handleCallback(error, false, callback);\n      }, progressBack);\n    }\n  };\n\n  //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native\n  function simpleBind(context, fn) {\n    return function(value) {\n      fn.call(context, value);\n    };\n  }\n\n  function processQueue(state) {\n    var fn, promise, pending;\n\n    pending = state.pending;\n    state.processScheduled = false;\n    state.pending = undefined;\n    for (var i = 0, ii = pending.length; i < ii; ++i) {\n      promise = pending[i][0];\n      fn = pending[i][state.status];\n      try {\n        if (isFunction(fn)) {\n          promise.resolve(fn(state.value));\n        } else if (state.status === 1) {\n          promise.resolve(state.value);\n        } else {\n          promise.reject(state.value);\n        }\n      } catch (e) {\n        promise.reject(e);\n        exceptionHandler(e);\n      }\n    }\n  }\n\n  function scheduleProcessQueue(state) {\n    if (state.processScheduled || !state.pending) return;\n    state.processScheduled = true;\n    nextTick(function() { processQueue(state); });\n  }\n\n  function Deferred() {\n    this.promise = new Promise();\n    //Necessary to support unbound execution :/\n    this.resolve = simpleBind(this, this.resolve);\n    this.reject = simpleBind(this, this.reject);\n    this.notify = simpleBind(this, this.notify);\n  }\n\n  Deferred.prototype = {\n    resolve: function(val) {\n      if (this.promise.$$state.status) return;\n      if (val === this.promise) {\n        this.$$reject($qMinErr(\n          'qcycle',\n          \"Expected promise to be resolved with value other than itself '{0}'\",\n          val));\n      } else {\n        this.$$resolve(val);\n      }\n\n    },\n\n    $$resolve: function(val) {\n      var then, fns;\n\n      fns = callOnce(this, this.$$resolve, this.$$reject);\n      try {\n        if ((isObject(val) || isFunction(val))) then = val && val.then;\n        if (isFunction(then)) {\n          this.promise.$$state.status = -1;\n          then.call(val, fns[0], fns[1], this.notify);\n        } else {\n          this.promise.$$state.value = val;\n          this.promise.$$state.status = 1;\n          scheduleProcessQueue(this.promise.$$state);\n        }\n      } catch (e) {\n        fns[1](e);\n        exceptionHandler(e);\n      }\n    },\n\n    reject: function(reason) {\n      if (this.promise.$$state.status) return;\n      this.$$reject(reason);\n    },\n\n    $$reject: function(reason) {\n      this.promise.$$state.value = reason;\n      this.promise.$$state.status = 2;\n      scheduleProcessQueue(this.promise.$$state);\n    },\n\n    notify: function(progress) {\n      var callbacks = this.promise.$$state.pending;\n\n      if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) {\n        nextTick(function() {\n          var callback, result;\n          for (var i = 0, ii = callbacks.length; i < ii; i++) {\n            result = callbacks[i][0];\n            callback = callbacks[i][3];\n            try {\n              result.notify(isFunction(callback) ? callback(progress) : progress);\n            } catch (e) {\n              exceptionHandler(e);\n            }\n          }\n        });\n      }\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @kind function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  var reject = function(reason) {\n    var result = new Deferred();\n    result.reject(reason);\n    return result.promise;\n  };\n\n  var makePromise = function makePromise(value, resolved) {\n    var result = new Deferred();\n    if (resolved) {\n      result.resolve(value);\n    } else {\n      result.reject(value);\n    }\n    return result.promise;\n  };\n\n  var handleCallback = function handleCallback(value, isResolved, callback) {\n    var callbackOutput = null;\n    try {\n      if (isFunction(callback)) callbackOutput = callback();\n    } catch (e) {\n      return makePromise(e, false);\n    }\n    if (isPromiseLike(callbackOutput)) {\n      return callbackOutput.then(function() {\n        return makePromise(value, isResolved);\n      }, function(error) {\n        return makePromise(error, false);\n      });\n    } else {\n      return makePromise(value, isResolved);\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @kind function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n\n\n  var when = function(value, callback, errback, progressBack) {\n    var result = new Deferred();\n    result.resolve(value);\n    return result.promise.then(callback, errback, progressBack);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @kind function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n\n  function all(promises) {\n    var deferred = new Deferred(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      when(promise).then(function(value) {\n        if (results.hasOwnProperty(key)) return;\n        results[key] = value;\n        if (!(--counter)) deferred.resolve(results);\n      }, function(reason) {\n        if (results.hasOwnProperty(key)) return;\n        deferred.reject(reason);\n      });\n    });\n\n    if (counter === 0) {\n      deferred.resolve(results);\n    }\n\n    return deferred.promise;\n  }\n\n  var $Q = function Q(resolver) {\n    if (!isFunction(resolver)) {\n      throw $qMinErr('norslvr', \"Expected resolverFn, got '{0}'\", resolver);\n    }\n\n    if (!(this instanceof Q)) {\n      // More useful when $Q is the Promise itself.\n      return new Q(resolver);\n    }\n\n    var deferred = new Deferred();\n\n    function resolveFn(value) {\n      deferred.resolve(value);\n    }\n\n    function rejectFn(reason) {\n      deferred.reject(reason);\n    }\n\n    resolver(resolveFn, rejectFn);\n\n    return deferred.promise;\n  };\n\n  $Q.defer = defer;\n  $Q.reject = reject;\n  $Q.when = when;\n  $Q.all = all;\n\n  return $Q;\n}\n\nfunction $$RAFProvider() { //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - this means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in middle are expensive so we use linked list\n *\n * There are few watches then a lot of observers. This is why you don't want the observer to be\n * implemented in the same way as watch. Watch requires return of initialization function which\n * are expensive to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide an event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider() {\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n  var applyAsyncId = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  function createChildScopeClass(parent) {\n    function ChildScope() {\n      this.$$watchers = this.$$nextSibling =\n          this.$$childHead = this.$$childTail = null;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$id = nextUid();\n      this.$$ChildScope = null;\n    }\n    ChildScope.prototype = parent;\n    return ChildScope;\n  }\n\n  this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',\n      function($injector, $exceptionHandler, $parse, $browser) {\n\n    function destroyChildScope($event) {\n        $event.currentScope.$$destroyed = true;\n    }\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.)\n     *\n     * Here is a simple scope snippet to show how you can interact with the scope.\n     * ```html\n     * <file src=\"./test/ng/rootScopeSpec.js\" tag=\"docs1\" />\n     * ```\n     *\n     * # Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     * When interacting with `Scope` in tests, additional helper methods are available on the\n     * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional\n     * details.\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this.$root = this;\n      this.$$destroyed = false;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$isolateBindings = null;\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     *\n     * @description\n     * Unique scope ID (monotonically increasing) useful for debugging.\n     */\n\n     /**\n      * @ngdoc property\n      * @name $rootScope.Scope#$parent\n      *\n      * @description\n      * Reference to the parent scope.\n      */\n\n      /**\n       * @ngdoc property\n       * @name $rootScope.Scope#$root\n       *\n       * @description\n       * Reference to the root scope.\n       */\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @kind function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.\n       * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`\n       *                              of the newly created scope. Defaults to `this` scope if not provided.\n       *                              This is used when creating a transclude scope to correctly place it\n       *                              in the scope hierarchy while maintaining the correct prototypical\n       *                              inheritance.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate, parent) {\n        var child;\n\n        parent = parent || this;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$ChildScope) {\n            this.$$ChildScope = createChildScopeClass(this);\n          }\n          child = new this.$$ChildScope();\n        }\n        child.$parent = parent;\n        child.$$prevSibling = parent.$$childTail;\n        if (parent.$$childHead) {\n          parent.$$childTail.$$nextSibling = child;\n          parent.$$childTail = child;\n        } else {\n          parent.$$childHead = parent.$$childTail = child;\n        }\n\n        // When the new scope is not isolated or we inherit from `this`, and\n        // the parent scope is destroyed, the property `$$destroyed` is inherited\n        // prototypically. In all other cases, this property needs to be set\n        // when the parent scope is destroyed.\n        // The listener needs to be added after the parent is set\n        if (isolate || parent != this) child.$on('$destroy', destroyChildScope);\n\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @kind function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (Since\n       *   {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the\n       *   `watchExpression` can execute multiple times per\n       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). Inequality is determined according to reference inequality,\n       *   [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)\n       *    via the `!==` Javascript operator, unless `objectEquality == true`\n       *   (see next point)\n       * - When `objectEquality == true`, inequality of the `watchExpression` is determined\n       *   according to the {@link angular.equals} function. To save the value of the object for\n       *   later comparison, the {@link angular.copy} function is used. This therefore means that\n       *   watching complex objects will have adverse memory and performance implications.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`\n       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a\n       * change is detected, be prepared for multiple calls to your listener.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       *\n       *\n       * # Example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n\n\n\n           // Using a function as a watchExpression\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This function returns the value being watched. It is called for each turn of the $digest loop\n             function() { return food; },\n             // This is the change listener, called when the value returned from the above function changes\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value\n       *    of `watchExpression` changes.\n       *\n       *    - `newVal` contains the current value of the `watchExpression`\n       *    - `oldVal` contains the previous value of the `watchExpression`\n       *    - `scope` refers to the current scope\n       * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality) {\n        var get = $parse(watchExp);\n\n        if (get.$$watchDelegate) {\n          return get.$$watchDelegate(this, listener, objectEquality, get);\n        }\n        var scope = this,\n            array = scope.$$watchers,\n            watcher = {\n              fn: listener,\n              last: initWatchVal,\n              get: get,\n              exp: watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        if (!isFunction(listener)) {\n          watcher.fn = noop;\n        }\n\n        if (!array) {\n          array = scope.$$watchers = [];\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n\n        return function deregisterWatch() {\n          arrayRemove(array, watcher);\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @kind function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every\n       *   call to $digest() to see if any items changes.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var self = this;\n        var changeReactionScheduled = false;\n        var firstRun = true;\n\n        if (!watchExpressions.length) {\n          // No expressions means we call the listener ASAP\n          var shouldCall = true;\n          self.$evalAsync(function() {\n            if (shouldCall) listener(newValues, newValues, self);\n          });\n          return function deregisterWatchGroup() {\n            shouldCall = false;\n          };\n        }\n\n        if (watchExpressions.length === 1) {\n          // Special case size of one\n          return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {\n            newValues[0] = value;\n            oldValues[0] = oldValue;\n            listener(newValues, (value === oldValue) ? newValues : oldValues, scope);\n          });\n        }\n\n        forEach(watchExpressions, function(expr, i) {\n          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {\n            newValues[i] = value;\n            oldValues[i] = oldValue;\n            if (!changeReactionScheduled) {\n              changeReactionScheduled = true;\n              self.$evalAsync(watchGroupAction);\n            }\n          });\n          deregisterFns.push(unwatchFn);\n        });\n\n        function watchGroupAction() {\n          changeReactionScheduled = false;\n\n          if (firstRun) {\n            firstRun = false;\n            listener(newValues, newValues, self);\n          } else {\n            listener(newValues, oldValues, self);\n          }\n        }\n\n        return function deregisterWatchGroup() {\n          while (deregisterFns.length) {\n            deregisterFns.shift()();\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @kind function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * # Example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        $watchCollectionInterceptor.$stateful = true;\n\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var changeDetector = $parse(obj, $watchCollectionInterceptor);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionInterceptor(_value) {\n          newValue = _value;\n          var newLength, key, bothNaN, newItem, oldItem;\n\n          // If the new value is undefined, then return undefined as the watch may be a one-time watch\n          if (isUndefined(newValue)) return;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              oldItem = oldValue[i];\n              newItem = newValue[i];\n\n              bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n              if (!bothNaN && (oldItem !== newItem)) {\n                changeDetected++;\n                oldValue[i] = newItem;\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (newValue.hasOwnProperty(key)) {\n                newLength++;\n                newItem = newValue[key];\n                oldItem = oldValue[key];\n\n                if (key in oldValue) {\n                  bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n                  if (!bothNaN && (oldItem !== newItem)) {\n                    changeDetected++;\n                    oldValue[key] = newItem;\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newItem;\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for (key in oldValue) {\n                if (!newValue.hasOwnProperty(key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch(changeDetector, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @kind function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * # Example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last,\n            watchers,\n            length,\n            dirty, ttl = TTL,\n            next, current, target = this,\n            watchLog = [],\n            logIdx, logMsg, asyncTask;\n\n        beginPhase('$digest');\n        // Check for changes to browser url that happened in sync before the call to $digest\n        $browser.$$checkUrlChange();\n\n        if (this === $rootScope && applyAsyncId !== null) {\n          // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then\n          // cancel the scheduled $apply and flush the queue of expressions to be evaluated.\n          $browser.defer.cancel(applyAsyncId);\n          flushApplyAsync();\n        }\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          while (asyncQueue.length) {\n            try {\n              asyncTask = asyncQueue.shift();\n              asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = current.$$watchers)) {\n              // process our watches\n              length = watchers.length;\n              while (length--) {\n                try {\n                  watch = watchers[length];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    if ((value = watch.get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (typeof value === 'number' && typeof last === 'number'\n                               && isNaN(value) && isNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value, null) : value;\n                      watch.fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        watchLog[logIdx].push({\n                          msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,\n                          newVal: value,\n                          oldVal: last\n                        });\n                      }\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            if (!(next = (current.$$childHead ||\n                (current !== target && current.$$nextSibling)))) {\n              while (current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if ((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, watchLog);\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        while (postDigestQueue.length) {\n          try {\n            postDigestQueue.shift()();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @kind function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // we can't destroy the root scope or a scope that has been already destroyed\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n        if (this === $rootScope) return;\n\n        for (var eventName in this.$$listenerCount) {\n          decrementListenerCount(this, this.$$listenerCount[eventName], eventName);\n        }\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\n        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n        // Disable listeners, watchers and apply/digest methods\n        this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n        this.$$listeners = {};\n\n        // All of the code below is bogus code that works around V8's memory leak via optimized code\n        // and inline caches.\n        //\n        // see:\n        // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n        // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n        // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n        this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =\n            this.$$childTail = this.$root = this.$$watchers = null;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @kind function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating Angular\n       * expressions.\n       *\n       * # Example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @kind function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       */\n      $evalAsync: function(expr, locals) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !asyncQueue.length) {\n          $browser.defer(function() {\n            if (asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          });\n        }\n\n        asyncQueue.push({scope: this, expression: expr, locals: locals});\n      },\n\n      $$postDigest: function(fn) {\n        postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @kind function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in angular from outside of the angular\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the angular framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * ## Life cycle\n       *\n       * # Pseudo-Code of `$apply()`\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          return this.$eval(expr);\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          clearPhase();\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$applyAsync\n       * @kind function\n       *\n       * @description\n       * Schedule the invocation of $apply to occur at a later time. The actual time difference\n       * varies across browsers, but is typically around ~10 milliseconds.\n       *\n       * This can be used to queue up multiple expressions which need to be evaluated in the same\n       * digest.\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       */\n      $applyAsync: function(expr) {\n        var scope = this;\n        expr && applyAsyncQueue.push($applyAsyncExpression);\n        scheduleApplyAsync();\n\n        function $applyAsyncExpression() {\n          scope.$eval(expr);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @kind function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          var indexOfListener = namedListeners.indexOf(listener);\n          if (indexOfListener !== -1) {\n            namedListeners[indexOfListener] = null;\n            decrementListenerCount(self, 1, name);\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i = 0, length = namedListeners.length; i < length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            event.currentScope = null;\n            return event;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            };\n\n        if (!target.$$listenerCount[name]) return event;\n\n        var listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i = 0, length = listeners.length; i < length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while (current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    //The internal queues. Expose them on the $rootScope for debugging/testing purposes.\n    var asyncQueue = $rootScope.$$asyncQueue = [];\n    var postDigestQueue = $rootScope.$$postDigestQueue = [];\n    var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n\n    function flushApplyAsync() {\n      while (applyAsyncQueue.length) {\n        try {\n          applyAsyncQueue.shift()();\n        } catch (e) {\n          $exceptionHandler(e);\n        }\n      }\n      applyAsyncId = null;\n    }\n\n    function scheduleApplyAsync() {\n      if (applyAsyncId === null) {\n        applyAsyncId = $browser.defer(function() {\n          $rootScope.$apply(flushApplyAsync);\n        });\n      }\n    }\n  }];\n}\n\n/**\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n  var aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*((https?|ftp|file|blob):|data:image\\/)/;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isImage) {\n      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal;\n      normalizedVal = urlResolve(uri).href;\n      if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n        return 'unsafe:' + normalizedVal;\n      }\n      return uri;\n    };\n  };\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  HTML: 'html',\n  CSS: 'css',\n  URL: 'url',\n  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a\n  // url.  (e.g. ng-include, script src, templateUrl)\n  RESOURCE_URL: 'resourceUrl',\n  JS: 'js'\n};\n\n// Helper functions follow.\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace('\\\\*\\\\*', '.*').\n                  replace('\\\\*', '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @kind function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing Angular templates are safe.  Refer {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n *\n * For the general details about this service in Angular, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * ```\n *  angular.module('myApp', []).config(function($sceDelegateProvider) {\n *    $sceDelegateProvider.resourceUrlWhitelist([\n *      // Allow same origin resource loads.\n *      'self',\n *      // Allow loading from our assets domain.  Notice the difference between * and **.\n *      'http://srv*.assets.example.com/**'\n *    ]);\n *\n *    // The blacklist overrides the whitelist so the open redirect here is blocked.\n *    $sceDelegateProvider.resourceUrlBlacklist([\n *      'http://myapp.example.com/clickThru**'\n *    ]);\n *  });\n * ```\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @kind function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     Note: **an empty whitelist array will block all URLs**!\n   *\n   * @return {Array} the currently set whitelist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   */\n  this.resourceUrlWhitelist = function(value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @kind function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     The typical usage for the blacklist is to **block\n   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *     these would otherwise be trusted but actually return content from the redirected domain.\n   *\n   *     Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} the currently set blacklist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   */\n\n  this.resourceUrlBlacklist = function(value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns an object that is trusted by angular for use in specified strict\n     * contextual escaping contexts (such as ng-bind-html, ng-include, any src\n     * attribute interpolation, any dom event binding attribute interpolation\n     * such as for onclick,  etc.) that uses the provided value.\n     * See {@link ng.$sce $sce} for enabling strict contextual escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resourceUrl, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || trustedValue === undefined || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *      call or anything else.\n     * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and\n     * returns the originally supplied value if the queried context type is a supertype of the\n     * created type.  If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call.\n     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n      // If we get here, then we may only take one of two actions.\n      // 1. sanitize the value for the requested type, or\n      // 2. throw an exception.\n      if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        return htmlSanitizer(maybeTrusted);\n      }\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/* jshint maxlen: false*/\n\n/**\n * @ngdoc service\n * @name $sce\n * @kind function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * # Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain\n * contexts to result in a value that is marked as safe to use for that context.  One example of\n * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer\n * to these contexts as privileged or SCE contexts.\n *\n * As of version 1.2, Angular ships with SCE enabled by default.\n *\n * Note:  When enabled (the default), IE<11 in quirks mode is not supported.  In this mode, IE<11 allow\n * one to execute arbitrary javascript by the use of the expression() syntax.  Refer\n * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.\n * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`\n * to the top of your HTML document.\n *\n * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for\n * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * Here's an example of a binding in a privileged context:\n *\n * ```\n * <input ng-model=\"userHtml\">\n * <div ng-bind-html=\"userHtml\"></div>\n * ```\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV.\n * In a more realistic example, one may be rendering user comments, blog articles, etc. via\n * bindings.  (HTML is just one example of a context where rendering user controlled input creates\n * security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, you want to ensure that any such bindings are disallowed unless you can\n * determine that something explicitly says it's safe to use a value for binding in that\n * context.  You can then audit your code (a simple grep would do) to ensure that this is only done\n * for those values that you can easily tell are safe - because they were received from your server,\n * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps\n * allowing only the files in a specific directory to do this.  Ensuring that the internal API\n * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * obtain values that will be accepted by SCE / privileged contexts.\n *\n *\n * ## How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link\n * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the\n * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * ```\n * var ngBindHtmlDirective = ['$sce', function($sce) {\n *   return function(scope, element, attr) {\n *     scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *       element.html(value || '');\n *     });\n *   };\n * }];\n * ```\n *\n * ## Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, Angular only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ## This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works.\n *\n * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\n * through {@link ng.$sce#getTrusted $sce.getTrusted}.  SCE doesn't play a role here.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ## What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |\n * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |\n *\n * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      not appropriate to use in for a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  Its usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage.).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      if they as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  e.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ## Show me an example using SCE.\n *\n * <example module=\"mySceApp\" deps=\"angular-sanitize.js\">\n * <file name=\"index.html\">\n *   <div ng-controller=\"AppController as myCtrl\">\n *     <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n *     <b>User comments</b><br>\n *     By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n *     $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n *     exploit.\n *     <div class=\"well\">\n *       <div ng-repeat=\"userComment in myCtrl.userComments\">\n *         <b>{{userComment.name}}</b>:\n *         <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n *         <br>\n *       </div>\n *     </div>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   angular.module('mySceApp', ['ngSanitize'])\n *     .controller('AppController', ['$http', '$templateCache', '$sce',\n *       function($http, $templateCache, $sce) {\n *         var self = this;\n *         $http.get(\"test_data.json\", {cache: $templateCache}).success(function(userComments) {\n *           self.userComments = userComments;\n *         });\n *         self.explicitlyTrustedHtml = $sce.trustAsHtml(\n *             '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *             'sanitization.&quot;\">Hover over this text.</span>');\n *       }]);\n * </file>\n *\n * <file name=\"test_data.json\">\n * [\n *   { \"name\": \"Alice\",\n *     \"htmlComment\":\n *         \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n *   },\n *   { \"name\": \"Bob\",\n *     \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n *   }\n * ]\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('SCE doc demo', function() {\n *     it('should sanitize untrusted values', function() {\n *       expect(element.all(by.css('.htmlComment')).first().getInnerHtml())\n *           .toBe('<span>Is <i>anyone</i> reading this?</span>');\n *     });\n *\n *     it('should NOT sanitize explicitly trusted values', function() {\n *       expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(\n *           '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *           'sanitization.&quot;\">Hover over this text.</span>');\n *     });\n *   });\n * </file>\n * </example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time.\n *\n * That said, here's how you can completely disable SCE:\n *\n * ```\n * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *   // Completely disable SCE.  For demonstration purposes only!\n *   // Do not use in new projects.\n *   $sceProvider.enabled(false);\n * });\n * ```\n *\n */\n/* jshint maxlen: 100 */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @kind function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE.\n   * @return {boolean} true if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function(value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the a value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way.  In some future, we\n   * may not use inheritance anymore.  That is OK because no code outside of\n   * sce.js and sceSpecs.js would need to be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sceDelegate', function(\n                $parse,   $sceDelegate) {\n    // Prereq: Ensure that we're not running in IE<11 quirks mode.  In that mode, IE < 11 allow\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && msie < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = shallowCopy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @kind function\n     *\n     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you\n     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function() {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAs\n     *\n     * @description\n     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The kind of SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return $parse(expr, function(value) {\n          return sce.getTrusted(type, value);\n        });\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.  As such,\n     * returns an object that is trusted by angular for use in specified strict contextual\n     * escaping contexts (such as ng-bind-html, ng-include, any src attribute\n     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)\n     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual\n     * escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resource_url, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml\n     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl\n     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl\n     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the return\n     *     value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs\n     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the\n     * originally supplied value if the queried context type is a supertype of the created type.\n     * If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}\n     *                         call.\n     * @returns {*} The value the was originally provided to\n     *              {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.\n     *              Otherwise, throws an exception.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function(enumValue, name) {\n      var lName = lowercase(name);\n      sce[camelCase(\"parse_as_\" + lName)] = function(expr) {\n        return parse(enumValue, expr);\n      };\n      sce[camelCase(\"get_trusted_\" + lName)] = function(value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[camelCase(\"trust_as_\" + lName)] = function(value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        android =\n          int((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        vendorPrefix,\n        vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/,\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false,\n        match;\n\n    if (bodyStyle) {\n      for (var prop in bodyStyle) {\n        if (match = vendorRegex.exec(prop)) {\n          vendorPrefix = match[0];\n          vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);\n          break;\n        }\n      }\n\n      if (!vendorPrefix) {\n        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';\n      }\n\n      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));\n      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));\n\n      if (android && (!transitions ||  !animations)) {\n        transitions = isString(document.body.style.webkitTransition);\n        animations = isString(document.body.style.webkitAnimation);\n      }\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      // jshint -W018\n      history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),\n      // jshint +W018\n      hasEvent: function(event) {\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        // IE10+ implements 'input' event but it erroneously fires under various situations,\n        // e.g. when placeholder changes, or a form is focused.\n        if (event === 'input' && msie <= 11) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      vendorPrefix: vendorPrefix,\n      transitions: transitions,\n      animations: animations,\n      android: android\n    };\n  }];\n}\n\nvar $compileMinErr = minErr('$compile');\n\n/**\n * @ngdoc service\n * @name $templateRequest\n *\n * @description\n * The `$templateRequest` service downloads the provided template using `$http` and, upon success,\n * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data\n * of the HTTP request is empty, a `$compile` error will be thrown (the exception can be thwarted\n * by setting the 2nd parameter of the function to true).\n *\n * @param {string} tpl The HTTP request template URL\n * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty\n *\n * @return {Promise} the HTTP Promise for the given.\n *\n * @property {number} totalPendingRequests total amount of pending template requests being downloaded.\n */\nfunction $TemplateRequestProvider() {\n  this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) {\n    function handleRequestFn(tpl, ignoreRequestError) {\n      handleRequestFn.totalPendingRequests++;\n\n      var transformResponse = $http.defaults && $http.defaults.transformResponse;\n\n      if (isArray(transformResponse)) {\n        transformResponse = transformResponse.filter(function(transformer) {\n          return transformer !== defaultHttpResponseTransform;\n        });\n      } else if (transformResponse === defaultHttpResponseTransform) {\n        transformResponse = null;\n      }\n\n      var httpOptions = {\n        cache: $templateCache,\n        transformResponse: transformResponse\n      };\n\n      return $http.get(tpl, httpOptions)\n        ['finally'](function() {\n          handleRequestFn.totalPendingRequests--;\n        })\n        .then(function(response) {\n          return response.data;\n        }, handleError);\n\n      function handleError(resp) {\n        if (!ignoreRequestError) {\n          throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);\n        }\n        return $q.reject(resp);\n      }\n    }\n\n    handleRequestFn.totalPendingRequests = 0;\n\n    return handleRequestFn;\n  }];\n}\n\nfunction $$TestabilityProvider() {\n  this.$get = ['$rootScope', '$browser', '$location',\n       function($rootScope,   $browser,   $location) {\n\n    /**\n     * @name $testability\n     *\n     * @description\n     * The private $$testability service provides a collection of methods for use when debugging\n     * or by automated test and debugging tools.\n     */\n    var testability = {};\n\n    /**\n     * @name $$testability#findBindings\n     *\n     * @description\n     * Returns an array of elements that are bound (via ng-bind or {{}})\n     * to expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The binding expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression. Filters and whitespace are ignored.\n     */\n    testability.findBindings = function(element, expression, opt_exactMatch) {\n      var bindings = element.getElementsByClassName('ng-binding');\n      var matches = [];\n      forEach(bindings, function(binding) {\n        var dataBinding = angular.element(binding).data('$binding');\n        if (dataBinding) {\n          forEach(dataBinding, function(bindingName) {\n            if (opt_exactMatch) {\n              var matcher = new RegExp('(^|\\\\s)' + escapeForRegexp(expression) + '(\\\\s|\\\\||$)');\n              if (matcher.test(bindingName)) {\n                matches.push(binding);\n              }\n            } else {\n              if (bindingName.indexOf(expression) != -1) {\n                matches.push(binding);\n              }\n            }\n          });\n        }\n      });\n      return matches;\n    };\n\n    /**\n     * @name $$testability#findModels\n     *\n     * @description\n     * Returns an array of elements that are two-way found via ng-model to\n     * expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The model expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression.\n     */\n    testability.findModels = function(element, expression, opt_exactMatch) {\n      var prefixes = ['ng-', 'data-ng-', 'ng\\\\:'];\n      for (var p = 0; p < prefixes.length; ++p) {\n        var attributeEquals = opt_exactMatch ? '=' : '*=';\n        var selector = '[' + prefixes[p] + 'model' + attributeEquals + '\"' + expression + '\"]';\n        var elements = element.querySelectorAll(selector);\n        if (elements.length) {\n          return elements;\n        }\n      }\n    };\n\n    /**\n     * @name $$testability#getLocation\n     *\n     * @description\n     * Shortcut for getting the location in a browser agnostic way. Returns\n     *     the path, search, and hash. (e.g. /path?a=b#hash)\n     */\n    testability.getLocation = function() {\n      return $location.url();\n    };\n\n    /**\n     * @name $$testability#setLocation\n     *\n     * @description\n     * Shortcut for navigating to a location without doing a full page reload.\n     *\n     * @param {string} url The location url (path, search and hash,\n     *     e.g. /path?a=b#hash) to go to.\n     */\n    testability.setLocation = function(url) {\n      if (url !== $location.url()) {\n        $location.url(url);\n        $rootScope.$digest();\n      }\n    };\n\n    /**\n     * @name $$testability#whenStable\n     *\n     * @description\n     * Calls the callback when $timeout and $http requests are completed.\n     *\n     * @param {function} callback\n     */\n    testability.whenStable = function(callback) {\n      $browser.notifyWhenNoOutstandingRequests(callback);\n    };\n\n    return testability;\n  }];\n}\n\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $$q,   $exceptionHandler) {\n    var deferreds = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $timeout\n      *\n      * @description\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n      * block and delegates any exceptions to\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\n      *\n      * The return value of registering a timeout function is a promise, which will be resolved when\n      * the timeout is reached and the timeout function is executed.\n      *\n      * To cancel a timeout request, call `$timeout.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n      * synchronously flush the queue of deferred functions.\n      *\n      * @param {function()} fn A function, whose execution should be delayed.\n      * @param {number=} [delay=0] Delay in milliseconds.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this\n      *   promise will be resolved with is the return value of the `fn` function.\n      *\n      */\n    function timeout(fn, delay, invokeApply) {\n      var skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise,\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn());\n        } catch (e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        }\n        finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay);\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $timeout#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`. As a result of this, the promise will be\n      * resolved with a rejection.\n      *\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n      *   canceled.\n      */\n    timeout.cancel = function(promise) {\n      if (promise && promise.$$timeoutId in deferreds) {\n        deferreds[promise.$$timeoutId].reject('canceled');\n        delete deferreds[promise.$$timeoutId];\n        return $browser.defer.cancel(promise.$$timeoutId);\n      }\n      return false;\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = document.createElement(\"a\");\nvar originUrl = urlResolve(window.location.href);\n\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * IE7 does not normalize the URL when assigned to an anchor node.  (Apparently, it does, if one\n * uses the inner HTML approach to assign the URL as part of an HTML snippet -\n * http://stackoverflow.com/a/472729)  However, setting img[src] does normalize the URL.\n * Unfortunately, setting img[src] to something like \"javascript:foo\" on IE throws an exception.\n * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that\n * method and IE < 8 is unsupported.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @kind function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description    |\n *   |---------------|----------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol including the trailing colon                              |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol\n *   | hostname      | The hostname\n *   | port          | The port, without \":\"\n *   | pathname      | The pathname, beginning with \"/\"\n *\n */\nfunction urlResolve(url) {\n  var href = url;\n\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute(\"href\", href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: urlParsingNode.hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n  return (parsed.protocol === originUrl.protocol &&\n          parsed.host === originUrl.host);\n}\n\n/**\n * @ngdoc service\n * @name $window\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In angular we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example module=\"windowExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('windowExample', [])\n           .controller('ExampleController', ['$scope', '$window', function($scope, $window) {\n             $scope.greeting = 'Hello, World!';\n             $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n             };\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"text\" ng-model=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider() {\n  this.$get = valueFn(window);\n}\n\n/* global currencyFilter: true,\n dateFilter: true,\n filterFilter: true,\n jsonFilter: true,\n limitToFilter: true,\n lowercaseFilter: true,\n numberFilter: true,\n orderByFilter: true,\n uppercaseFilter: true,\n */\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how angular filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the Angular Developer Guide.\n */\n\n/**\n * @ngdoc service\n * @name $filter\n * @kind function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * The general syntax in templates is as follows:\n *\n *         {{ expression [| filter_name[:parameter_value] ... ] }}\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $filterProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if (isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false,\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @kind function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is used for matching against the contents of the `array`. All strings or\n *     objects with string properties in `array` that match this string will be returned. This also\n *     applies to nested object properties.\n *     The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\n *     property of the object or its nested object properties. That's equivalent to the simple\n *     substring match with a `string` as described above. The predicate can be negated by prefixing\n *     the string with `!`.\n *     For example `{name: \"!M\"}` predicate will return an array of items which have property `name`\n *     not containing \"M\".\n *\n *     Note that a named property will match properties on the same level only, while the special\n *     `$` property will match properties on the same level or deeper. E.g. an array item like\n *     `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but\n *     **will** be matched by `{$: 'John'}`.\n *\n *   - `function(value, index)`: A predicate function can be used to write arbitrary filters. The\n *     function is called for each element of `array`. The final result is an array of those\n *     elements that the predicate returned true for.\n *\n * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in\n *     determining if the expected value (from the filter expression) and actual value (from\n *     the object in the array) should be considered a match.\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if both values should be considered equal.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.\n *     This is essentially strict comparison of expected and actual.\n *\n *   - `false|undefined`: A short hand for a function which will look for a substring match in case\n *     insensitive way.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       Search: <input ng-model=\"searchText\">\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       Any: <input ng-model=\"search.$\"> <br>\n       Name only <input ng-model=\"search.name\"><br>\n       Phone only <input ng-model=\"search.phone\"><br>\n       Equality <input type=\"checkbox\" ng-model=\"strict\"><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\nfunction filterFilter() {\n  return function(array, expression, comparator) {\n    if (!isArray(array)) return array;\n\n    var predicateFn;\n    var matchAgainstAnyProp;\n\n    switch (typeof expression) {\n      case 'function':\n        predicateFn = expression;\n        break;\n      case 'boolean':\n      case 'number':\n      case 'string':\n        matchAgainstAnyProp = true;\n        //jshint -W086\n      case 'object':\n        //jshint +W086\n        predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp);\n        break;\n      default:\n        return array;\n    }\n\n    return array.filter(predicateFn);\n  };\n}\n\n// Helper functions for `filterFilter`\nfunction createPredicateFn(expression, comparator, matchAgainstAnyProp) {\n  var shouldMatchPrimitives = isObject(expression) && ('$' in expression);\n  var predicateFn;\n\n  if (comparator === true) {\n    comparator = equals;\n  } else if (!isFunction(comparator)) {\n    comparator = function(actual, expected) {\n      if (isObject(actual) || isObject(expected)) {\n        // Prevent an object to be considered equal to a string like `'[object'`\n        return false;\n      }\n\n      actual = lowercase('' + actual);\n      expected = lowercase('' + expected);\n      return actual.indexOf(expected) !== -1;\n    };\n  }\n\n  predicateFn = function(item) {\n    if (shouldMatchPrimitives && !isObject(item)) {\n      return deepCompare(item, expression.$, comparator, false);\n    }\n    return deepCompare(item, expression, comparator, matchAgainstAnyProp);\n  };\n\n  return predicateFn;\n}\n\nfunction deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) {\n  var actualType = (actual !== null) ? typeof actual : 'null';\n  var expectedType = (expected !== null) ? typeof expected : 'null';\n\n  if ((expectedType === 'string') && (expected.charAt(0) === '!')) {\n    return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp);\n  } else if (isArray(actual)) {\n    // In case `actual` is an array, consider it a match\n    // if ANY of it's items matches `expected`\n    return actual.some(function(item) {\n      return deepCompare(item, expected, comparator, matchAgainstAnyProp);\n    });\n  }\n\n  switch (actualType) {\n    case 'object':\n      var key;\n      if (matchAgainstAnyProp) {\n        for (key in actual) {\n          if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) {\n            return true;\n          }\n        }\n        return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false);\n      } else if (expectedType === 'object') {\n        for (key in expected) {\n          var expectedVal = expected[key];\n          if (isFunction(expectedVal) || isUndefined(expectedVal)) {\n            continue;\n          }\n\n          var matchAnyProperty = key === '$';\n          var actualVal = matchAnyProperty ? actual : actual[key];\n          if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) {\n            return false;\n          }\n        }\n        return true;\n      } else {\n        return comparator(actual, expected);\n      }\n      break;\n    case 'function':\n      return false;\n    default:\n      return comparator(actual, expected);\n  }\n}\n\n/**\n * @ngdoc filter\n * @name currency\n * @kind function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example module=\"currencyExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('currencyExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.amount = 1234.56;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"number\" ng-model=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span id=\"currency-custom\">{{amount | currency:\"USD$\"}}</span>\n         no fractions (0): <span id=\"currency-no-fractions\">{{amount | currency:\"USD$\":0}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');\n       });\n       it('should update', function() {\n         if (browser.params.browser == 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');\n         expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol, fractionSize) {\n    if (isUndefined(currencySymbol)) {\n      currencySymbol = formats.CURRENCY_SYM;\n    }\n\n    if (isUndefined(fractionSize)) {\n      fractionSize = formats.PATTERNS[1].maxFrac;\n    }\n\n    // if null or undefined pass it through\n    return (amount == null)\n        ? amount\n        : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).\n            replace(/\\u00A4/g, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @kind function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is not a number an empty string is returned.\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.\n *\n * @example\n   <example module=\"numberFilterExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('numberFilterExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.val = 1234.56789;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         Enter number: <input ng-model='val'><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\n\n\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n\n    // if null or undefined pass it through\n    return (number == null)\n        ? number\n        : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n                       fractionSize);\n  };\n}\n\nvar DECIMAL_SEP = '.';\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n  if (!isFinite(number) || isObject(number)) return '';\n\n  var isNegative = number < 0;\n  number = Math.abs(number);\n  var numStr = number + '',\n      formatedText = '',\n      parts = [];\n\n  var hasExponent = false;\n  if (numStr.indexOf('e') !== -1) {\n    var match = numStr.match(/([\\d\\.]+)e(-?)(\\d+)/);\n    if (match && match[2] == '-' && match[3] > fractionSize + 1) {\n      number = 0;\n    } else {\n      formatedText = numStr;\n      hasExponent = true;\n    }\n  }\n\n  if (!hasExponent) {\n    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\n\n    // determine fractionSize if it is not specified\n    if (isUndefined(fractionSize)) {\n      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\n    }\n\n    // safely round numbers in JS without hitting imprecisions of floating-point arithmetics\n    // inspired by:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n    number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);\n\n    var fraction = ('' + number).split(DECIMAL_SEP);\n    var whole = fraction[0];\n    fraction = fraction[1] || '';\n\n    var i, pos = 0,\n        lgroup = pattern.lgSize,\n        group = pattern.gSize;\n\n    if (whole.length >= (lgroup + group)) {\n      pos = whole.length - lgroup;\n      for (i = 0; i < pos; i++) {\n        if ((pos - i) % group === 0 && i !== 0) {\n          formatedText += groupSep;\n        }\n        formatedText += whole.charAt(i);\n      }\n    }\n\n    for (i = pos; i < whole.length; i++) {\n      if ((whole.length - i) % lgroup === 0 && i !== 0) {\n        formatedText += groupSep;\n      }\n      formatedText += whole.charAt(i);\n    }\n\n    // format fraction part.\n    while (fraction.length < fractionSize) {\n      fraction += '0';\n    }\n\n    if (fractionSize && fractionSize !== \"0\") formatedText += decimalSep + fraction.substr(0, fractionSize);\n  } else {\n    if (fractionSize > 0 && number < 1) {\n      formatedText = number.toFixed(fractionSize);\n      number = parseFloat(formatedText);\n    }\n  }\n\n  if (number === 0) {\n    isNegative = false;\n  }\n\n  parts.push(isNegative ? pattern.negPre : pattern.posPre,\n             formatedText,\n             isNegative ? pattern.negSuf : pattern.posSuf);\n  return parts.join('');\n}\n\nfunction padNumber(num, digits, trim) {\n  var neg = '';\n  if (num < 0) {\n    neg =  '-';\n    num = -num;\n  }\n  num = '' + num;\n  while (num.length < digits) num = '0' + num;\n  if (trim)\n    num = num.substr(num.length - digits);\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset)\n      value += offset;\n    if (value === 0 && offset == -12) value = 12;\n    return padNumber(value, size, trim);\n  };\n}\n\nfunction dateStrGetter(name, shortForm) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var get = uppercase(shortForm ? ('SHORT' + name) : name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date) {\n  var zone = -1 * date.getTimezoneOffset();\n  var paddedZone = (zone >= 0) ? \"+\" : \"\";\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nfunction eraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1];\n}\n\nfunction longEraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4),\n    yy: dateGetter('FullYear', 2, 0, true),\n     y: dateGetter('FullYear', 1),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1),\n     G: eraGetter,\n     GG: eraGetter,\n     GGG: eraGetter,\n     GGGG: longEraGetter\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,\n    NUMBER_STRING = /^\\-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @kind function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in AM/PM, padded (01-12)\n *   * `'h'`: Hour in AM/PM, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: AM/PM marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year\n *   * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year\n *   * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD')\n *   * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini')\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 PM)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 PM)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)\n *\n *   `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @param {string=} timezone Timezone to be used for formatting. Right now, only `'UTC'` is supported.\n *    If not specified, the timezone of the browser will be used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:\"MM/dd/yyyy 'at' h:mma\"}}</span>:\n          <span>{{'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} (\\-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n         expect(element(by.binding(\"'1288323623006' | date:\\\"MM/dd/yyyy 'at' h:mma\\\"\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 at \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if (match = string.match(R_ISO8601_STR)) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = int(match[9] + match[10]);\n        tzMin = int(match[9] + match[11]);\n      }\n      dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));\n      var h = int(match[4] || 0) - tzHour;\n      var m = int(match[5] || 0) - tzMin;\n      var s = int(match[6] || 0);\n      var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format, timezone) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date);\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date)) {\n      return date;\n    }\n\n    while (format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    if (timezone && timezone === 'UTC') {\n      date = new Date(date.getTime());\n      date.setMinutes(date.getMinutes() + date.getTimezoneOffset());\n    }\n    forEach(parts, function(value) {\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS)\n                 : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @kind function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @param {number=} spacing The number of spaces to use per indentation, defaults to 2.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <pre id=\"default-spacing\">{{ {'name':'value'} | json }}</pre>\n       <pre id=\"custom-spacing\">{{ {'name':'value'} | json:4 }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.id('default-spacing')).getText()).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\n         expect(element(by.id('custom-spacing')).getText()).toMatch(/\\{\\n    \"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object, spacing) {\n    if (isUndefined(spacing)) {\n        spacing = 2;\n    }\n    return toJson(object, spacing);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @kind function\n * @description\n * Converts string to lowercase.\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @kind function\n * @description\n * Converts string to uppercase.\n * @see angular.uppercase\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @kind function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements\n * are taken from either the beginning or the end of the source array, string or number, as specified by\n * the value and sign (positive or negative) of `limit`. If a number is used as input, it is\n * converted to a string.\n *\n * @param {Array|string|number} input Source array, string or number to be limited.\n * @param {string|number} limit The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array\n *     had less than `limit` elements.\n *\n * @example\n   <example module=\"limitToExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('limitToExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.numbers = [1,2,3,4,5,6,7,8,9];\n             $scope.letters = \"abcdefghi\";\n             $scope.longNumber = 2345432342;\n             $scope.numLimit = 3;\n             $scope.letterLimit = 3;\n             $scope.longNumberLimit = 3;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         Limit {{numbers}} to: <input type=\"number\" step=\"1\" ng-model=\"numLimit\">\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         Limit {{letters}} to: <input type=\"number\" step=\"1\" ng-model=\"letterLimit\">\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n         Limit {{longNumber}} to: <input type=\"number\" step=\"1\" ng-model=\"longNumberLimit\">\n         <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var longNumberLimitInput = element(by.model('longNumberLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n       var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(longNumberLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 234');\n       });\n\n       // There is a bug in safari and protractor that doesn't like the minus key\n       // it('should update the output when -3 is entered', function() {\n       //   numLimitInput.clear();\n       //   numLimitInput.sendKeys('-3');\n       //   letterLimitInput.clear();\n       //   letterLimitInput.sendKeys('-3');\n       //   longNumberLimitInput.clear();\n       //   longNumberLimitInput.sendKeys('-3');\n       //   expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n       //   expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       //   expect(limitedLongNumber.getText()).toEqual('Output long number: 342');\n       // });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         longNumberLimitInput.clear();\n         longNumberLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');\n       });\n     </file>\n   </example>\n*/\nfunction limitToFilter() {\n  return function(input, limit) {\n    if (isNumber(input)) input = input.toString();\n    if (!isArray(input) && !isString(input)) return input;\n\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = int(limit);\n    }\n\n    //NaN check on limit\n    if (limit) {\n      return limit > 0 ? input.slice(0, limit) : input.slice(limit);\n    } else {\n      return isString(input) ? \"\" : [];\n    }\n  };\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @kind function\n *\n * @description\n * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically\n * for strings and numerically for numbers. Note: if you notice numbers are not being sorted\n * correctly, make sure they are actually being saved as numbers and not strings.\n *\n * @param {Array} array The array to sort.\n * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be\n *    used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `function`: Getter function. The result of this function will be sorted using the\n *      `<`, `=`, `>` operator.\n *    - `string`: An Angular expression. The result of this expression is used to compare elements\n *      (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by\n *      3 first characters of a property called `name`). The result of a constant expression\n *      is interpreted as a property name to be used in comparisons (for example `\"special name\"`\n *      to sort object by the value of their `special name` property). An expression can be\n *      optionally prefixed with `+` or `-` to control ascending or descending sort order\n *      (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array\n *      element itself is used to compare where sorting.\n *    - `Array`: An array of function or string predicates. The first predicate in the array\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\n *\n *    If the predicate is missing or empty then it defaults to `'+'`.\n *\n * @param {boolean=} reverse Reverse the order of the array.\n * @returns {Array} Sorted copy of the source array.\n *\n *\n * @example\n * The example below demonstrates a simple ngRepeat, where the data is sorted\n * by age in descending order (predicate is set to `'-age'`).\n * `reverse` is not set, which means it defaults to `false`.\n   <example module=\"orderByExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('orderByExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.friends =\n                 [{name:'John', phone:'555-1212', age:10},\n                  {name:'Mary', phone:'555-9876', age:19},\n                  {name:'Mike', phone:'555-4321', age:21},\n                  {name:'Adam', phone:'555-5678', age:35},\n                  {name:'Julie', phone:'555-8765', age:29}];\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <table class=\"friend\">\n           <tr>\n             <th>Name</th>\n             <th>Phone Number</th>\n             <th>Age</th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:'-age'\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n   </example>\n *\n * The predicate and reverse parameters can be controlled dynamically through scope properties,\n * as shown in the next example.\n * @example\n   <example module=\"orderByExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('orderByExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.friends =\n                 [{name:'John', phone:'555-1212', age:10},\n                  {name:'Mary', phone:'555-9876', age:19},\n                  {name:'Mike', phone:'555-4321', age:21},\n                  {name:'Adam', phone:'555-5678', age:35},\n                  {name:'Julie', phone:'555-8765', age:29}];\n             $scope.predicate = '-age';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\n         <hr/>\n         [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\n         <table class=\"friend\">\n           <tr>\n             <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\n                 (<a href=\"\" ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\n             <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\n             <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n   </example>\n *\n * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the\n * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the\n * desired parameters.\n *\n * Example:\n *\n * @example\n  <example module=\"orderByExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <table class=\"friend\">\n          <tr>\n            <th><a href=\"\" ng-click=\"reverse=false;order('name', false)\">Name</a>\n              (<a href=\"\" ng-click=\"order('-name',false)\">^</a>)</th>\n            <th><a href=\"\" ng-click=\"reverse=!reverse;order('phone', reverse)\">Phone Number</a></th>\n            <th><a href=\"\" ng-click=\"reverse=!reverse;order('age',reverse)\">Age</a></th>\n          </tr>\n          <tr ng-repeat=\"friend in friends\">\n            <td>{{friend.name}}</td>\n            <td>{{friend.phone}}</td>\n            <td>{{friend.age}}</td>\n          </tr>\n        </table>\n      </div>\n    </file>\n\n    <file name=\"script.js\">\n      angular.module('orderByExample', [])\n        .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {\n          var orderBy = $filter('orderBy');\n          $scope.friends = [\n            { name: 'John',    phone: '555-1212',    age: 10 },\n            { name: 'Mary',    phone: '555-9876',    age: 19 },\n            { name: 'Mike',    phone: '555-4321',    age: 21 },\n            { name: 'Adam',    phone: '555-5678',    age: 35 },\n            { name: 'Julie',   phone: '555-8765',    age: 29 }\n          ];\n          $scope.order = function(predicate, reverse) {\n            $scope.friends = orderBy($scope.friends, predicate, reverse);\n          };\n          $scope.order('-age',false);\n        }]);\n    </file>\n</example>\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse) {\n  return function(array, sortPredicate, reverseOrder) {\n    if (!(isArrayLike(array))) return array;\n    sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];\n    if (sortPredicate.length === 0) { sortPredicate = ['+']; }\n    sortPredicate = sortPredicate.map(function(predicate) {\n      var descending = false, get = predicate || identity;\n      if (isString(predicate)) {\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\n          descending = predicate.charAt(0) == '-';\n          predicate = predicate.substring(1);\n        }\n        if (predicate === '') {\n          // Effectively no predicate was passed so we compare identity\n          return reverseComparator(compare, descending);\n        }\n        get = $parse(predicate);\n        if (get.constant) {\n          var key = get();\n          return reverseComparator(function(a, b) {\n            return compare(a[key], b[key]);\n          }, descending);\n        }\n      }\n      return reverseComparator(function(a, b) {\n        return compare(get(a),get(b));\n      }, descending);\n    });\n    return slice.call(array).sort(reverseComparator(comparator, reverseOrder));\n\n    function comparator(o1, o2) {\n      for (var i = 0; i < sortPredicate.length; i++) {\n        var comp = sortPredicate[i](o1, o2);\n        if (comp !== 0) return comp;\n      }\n      return 0;\n    }\n    function reverseComparator(comp, descending) {\n      return descending\n          ? function(a, b) {return comp(b,a);}\n          : comp;\n    }\n\n    function isPrimitive(value) {\n      switch (typeof value) {\n        case 'number': /* falls through */\n        case 'boolean': /* falls through */\n        case 'string':\n          return true;\n        default:\n          return false;\n      }\n    }\n\n    function objectToString(value) {\n      if (value === null) return 'null';\n      if (typeof value.valueOf === 'function') {\n        value = value.valueOf();\n        if (isPrimitive(value)) return value;\n      }\n      if (typeof value.toString === 'function') {\n        value = value.toString();\n        if (isPrimitive(value)) return value;\n      }\n      return '';\n    }\n\n    function compare(v1, v2) {\n      var t1 = typeof v1;\n      var t2 = typeof v2;\n      if (t1 === t2 && t1 === \"object\") {\n        v1 = objectToString(v1);\n        v2 = objectToString(v2);\n      }\n      if (t1 === t2) {\n        if (t1 === \"string\") {\n           v1 = v1.toLowerCase();\n           v2 = v2.toLowerCase();\n        }\n        if (v1 === v2) return 0;\n        return v1 < v2 ? -1 : 1;\n      } else {\n        return t1 < t2 ? -1 : 1;\n      }\n    }\n  };\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html A tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * This change permits the easy creation of action links with the `ngClick` directive\n * without changing the location or causing page reloads, e.g.:\n * `<a href=\"\" ng-click=\"list.addItem()\">Add Item</a>`\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n    if (!attr.href && !attr.xlinkHref && !attr.name) {\n      return function(scope, element) {\n        // If the linked element is not an anchor tag anymore, do nothing\n        if (element[0].nodeName.toLowerCase() !== 'a') return;\n\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event) {\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * Angular has a chance to replace the `{{hash}}` markup with its\n * value. Until Angular replaces the markup the link will be broken\n * and will most likely return a 404 error. The `ngHref` directive\n * solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example>\n      <file name=\"index.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 5000, 'page should navigate to /123');\n        });\n\n        xit('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 5000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * This directive sets the `disabled` attribute on the element if the\n * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `disabled`\n * attribute.  The following example would make the button enabled on Chrome/Firefox\n * but not on older IEs:\n *\n * ```html\n * <!-- See below for an example of ng-disabled being used correctly -->\n * <div ng-init=\"isDisabled = false\">\n *  <button disabled=\"{{isDisabled}}\">Disabled</button>\n * </div>\n * ```\n *\n * This is because the HTML specification does not require browsers to preserve the values of\n * boolean attributes such as `disabled` (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then the `disabled` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as checked. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngChecked` directive solves this problem for the `checked` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\n          element(by.model('master')).click();\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then special attribute \"checked\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as readonly. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngReadonly` directive solves this problem for the `readonly` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as selected. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngSelected` directive solves this problem for the `selected` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\n        <select>\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as open. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngOpen` directive solves this problem for the `open` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n     <example>\n       <file name=\"index.html\">\n         Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>Show/Hide me</summary>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName == \"multiple\") return;\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      restrict: 'A',\n      priority: 100,\n      link: function(scope, element, attr) {\n        scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n          attr.$set(attrName, !!value);\n        });\n      }\n    };\n  };\n});\n\n// aliased input attrs are evaluated\nforEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {\n  ngAttributeAliasDirectives[ngAttr] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        //special case ngPattern when a literal regular expression value\n        //is used as the expression (this way we don't have to watch anything).\n        if (ngAttr === \"ngPattern\" && attr.ngPattern.charAt(0) == \"/\") {\n          var match = attr.ngPattern.match(REGEX_STRING_REGEXP);\n          if (match) {\n            attr.$set(\"ngPattern\", new RegExp(match[1], match[2]));\n            return;\n          }\n        }\n\n        scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {\n          attr.$set(ngAttr, value);\n        });\n      }\n    };\n  };\n});\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        attr.$observe(normalized, function(value) {\n          if (!value) {\n            if (attrName === 'href') {\n              attr.$set(name, null);\n            }\n            return;\n          }\n\n          attr.$set(name, value);\n\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // we use attr[attrName] value since $set can sanitize the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  };\n});\n\n/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true\n */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $$renameControl: nullFormRenameControl,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop,\n  $setSubmitted: noop\n},\nSUBMITTED_CLASS = 'ng-submitted';\n\nfunction nullFormRenameControl(control, name) {\n  control.$name = name;\n}\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n * @property {boolean} $submitted True if user has submitted the form even if its invalid.\n *\n * @property {Object} $error Is an object hash, containing references to controls or\n *  forms with failing validators, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that have a failing validator for given error name.\n *\n *  Built-in validation tokens:\n *\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *  - `date`\n *  - `datetimelocal`\n *  - `time`\n *  - `week`\n *  - `month`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];\nfunction FormController(element, attrs, $scope, $animate, $interpolate) {\n  var form = this,\n      controls = [];\n\n  var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl;\n\n  // init state\n  form.$error = {};\n  form.$$success = {};\n  form.$pending = undefined;\n  form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);\n  form.$dirty = false;\n  form.$pristine = true;\n  form.$valid = true;\n  form.$invalid = false;\n  form.$submitted = false;\n\n  parentForm.$addControl(form);\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$rollbackViewValue\n   *\n   * @description\n   * Rollback all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is typically needed by the reset button of\n   * a form that uses `ng-model-options` to pend updates.\n   */\n  form.$rollbackViewValue = function() {\n    forEach(controls, function(control) {\n      control.$rollbackViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  form.$commitViewValue = function() {\n    forEach(controls, function(control) {\n      control.$commitViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   *\n   * @description\n   * Register a control with the form.\n   *\n   * Input elements using ngModelController do this automatically when they are linked.\n   */\n  form.$addControl = function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    controls.push(control);\n\n    if (control.$name) {\n      form[control.$name] = control;\n    }\n  };\n\n  // Private API: rename a form control\n  form.$$renameControl = function(control, newName) {\n    var oldName = control.$name;\n\n    if (form[oldName] === control) {\n      delete form[oldName];\n    }\n    form[newName] = control;\n    control.$name = newName;\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   */\n  form.$removeControl = function(control) {\n    if (control.$name && form[control.$name] === control) {\n      delete form[control.$name];\n    }\n    forEach(form.$pending, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n    forEach(form.$error, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n    forEach(form.$$success, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n\n    arrayRemove(controls, control);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setValidity\n   *\n   * @description\n   * Sets the validity of a form control.\n   *\n   * This method will also propagate to parent forms.\n   */\n  addSetValidityMethod({\n    ctrl: this,\n    $element: element,\n    set: function(object, property, controller) {\n      var list = object[property];\n      if (!list) {\n        object[property] = [controller];\n      } else {\n        var index = list.indexOf(controller);\n        if (index === -1) {\n          list.push(controller);\n        }\n      }\n    },\n    unset: function(object, property, controller) {\n      var list = object[property];\n      if (!list) {\n        return;\n      }\n      arrayRemove(list, controller);\n      if (list.length === 0) {\n        delete object[property];\n      }\n    },\n    parentForm: parentForm,\n    $animate: $animate\n  });\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  form.$setDirty = function() {\n    $animate.removeClass(element, PRISTINE_CLASS);\n    $animate.addClass(element, DIRTY_CLASS);\n    form.$dirty = true;\n    form.$pristine = false;\n    parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the form to its pristine\n   * state (ng-pristine class). This method will also propagate to all the controls contained\n   * in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  form.$setPristine = function() {\n    $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);\n    form.$dirty = false;\n    form.$pristine = true;\n    form.$submitted = false;\n    forEach(controls, function(control) {\n      control.$setPristine();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setUntouched\n   *\n   * @description\n   * Sets the form to its untouched state.\n   *\n   * This method can be called to remove the 'ng-touched' class and set the form controls to their\n   * untouched state (ng-untouched class).\n   *\n   * Setting a form controls back to their untouched state is often useful when setting the form\n   * back to its pristine state.\n   */\n  form.$setUntouched = function() {\n    forEach(controls, function(control) {\n      control.$setUntouched();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setSubmitted\n   *\n   * @description\n   * Sets the form to its submitted state.\n   */\n  form.$setSubmitted = function() {\n    $animate.addClass(element, SUBMITTED_CLASS);\n    form.$submitted = true;\n    parentForm.$setSubmitted();\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\n * sub-group of controls needs to be determined.\n *\n * Note: the purpose of `ngForm` is to group controls,\n * but not to be a replacement for the `<form>` tag with all of its capabilities\n * (e.g. posting to the server, ...).\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * # Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In Angular, forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to\n * `<form>` but can be nested.  This allows you to have nested forms, which is very useful when\n * using Angular validation directives in forms that are dynamically generated using the\n * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`\n * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an\n * `ngForm` directive and nest these in an outer `form` element.\n *\n *\n * # CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *  - `ng-submitted` is set if the form was submitted.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * # Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side Angular applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, Angular prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * ## Animation Hooks\n *\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"formExample\">\n      <file name=\"index.html\">\n       <script>\n         angular.module('formExample', [])\n           .controller('FormController', ['$scope', function($scope) {\n             $scope.userType = 'guest';\n           }]);\n       </script>\n       <style>\n        .my-form {\n          -webkit-transition:all linear 0.5s;\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"FormController\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <tt>userType = {{userType}}</tt><br>\n         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\n         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', function($timeout) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      controller: FormController,\n      compile: function ngFormCompile(formElement, attr) {\n        // Setup initial state of the control\n        formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);\n\n        var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);\n\n        return {\n          pre: function ngFormPreLink(scope, formElement, attr, controller) {\n            // if `action` attr is not present on the form, prevent the default action (submission)\n            if (!('action' in attr)) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                  controller.$setSubmitted();\n                });\n\n                event.preventDefault();\n              };\n\n              addEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = controller.$$parentForm;\n\n            if (nameAttr) {\n              setter(scope, null, controller.$name, controller, controller.$name);\n              attr.$observe(nameAttr, function(newValue) {\n                if (controller.$name === newValue) return;\n                setter(scope, null, controller.$name, undefined, controller.$name);\n                parentFormCtrl.$$renameControl(controller, newValue);\n                setter(scope, null, controller.$name, controller, controller.$name);\n              });\n            }\n            formElement.on('$destroy', function() {\n              parentFormCtrl.$removeControl(controller);\n              if (nameAttr) {\n                setter(scope, null, attr[nameAttr], undefined, controller.$name);\n              }\n              extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n            });\n          }\n        };\n      }\n    };\n\n    return formDirective;\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n/* global VALID_CLASS: false,\n  INVALID_CLASS: false,\n  PRISTINE_CLASS: false,\n  DIRTY_CLASS: false,\n  UNTOUCHED_CLASS: false,\n  TOUCHED_CLASS: false,\n  $ngModelMinErr: false,\n*/\n\n// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231\nvar ISO_DATE_REGEXP = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/;\nvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\nvar EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\nvar DATE_REGEXP = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\nvar WEEK_REGEXP = /^(\\d{4})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with angular data binding, inherited by most of the `input` elements.\n   *\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match\n   *    a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object then this is used directly.\n   *    If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`\n   *    characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n   *    This parameter is ignored for input[type=password] controls, which will never trim the\n   *    input.\n   *\n   * @example\n      <example name=\"text-input-directive\" module=\"textInputExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('textInputExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 text: 'guest',\n                 word: /^\\s*\\w*\\s*$/\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           Single word: <input type=\"text\" name=\"input\" ng-model=\"example.text\"\n                               ng-pattern=\"example.word\" required ng-trim=\"false\">\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n             Single word only!</span>\n\n           <tt>text = {{example.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('example.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many\n     * modern browsers do not yet support this input type, it is important to provide cues to users on the\n     * expected input format via a placeholder or label.\n     *\n     * The model must always be a Date object, otherwise Angular will throw an error.\n     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n     *\n     * The timezone to be used to read/write the `Date` instance in the model can be defined using\n     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n     *\n     * @param {string} ngModel Assignable angular expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     * valid ISO date string (yyyy-MM-dd).\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     * a valid ISO date string (yyyy-MM-dd).\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange Angular expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\" module=\"dateInputExample\">\n     <file name=\"index.html\">\n       <script>\n          angular.module('dateInputExample', [])\n            .controller('DateController', ['$scope', function($scope) {\n              $scope.example = {\n                value: new Date(2013, 9, 22)\n              };\n            }]);\n       </script>\n       <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n          Pick a date in 2013:\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n              Not a valid date!</span>\n           <tt>value = {{example.value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('example.value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n        var input = element(by.model('example.value'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[datetime-local]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\" module=\"dateExample\">\n    <file name=\"index.html\">\n      <script>\n        angular.module('dateExample', [])\n          .controller('DateController', ['$scope', function($scope) {\n            $scope.example = {\n              value: new Date(2010, 11, 28, 14, 57)\n            };\n          }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        Pick a date between in 2013:\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"yyyy-MM-ddTHH:mm:ss\" min=\"2001-01-01T00:00:00\" max=\"2013-12-31T00:00:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n            Not a valid date!</span>\n        <tt>value = {{example.value | date: \"yyyy-MM-ddTHH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM-ddTHH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),\n      'yyyy-MM-ddTHH:mm:ss.sss'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n   * valid ISO time format (HH:mm:ss).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a\n   * valid ISO time format (HH:mm:ss).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\" module=\"timeExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('timeExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(1970, 0, 1, 14, 57, 0)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        Pick a between 8am and 5pm:\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"HH:mm:ss\" min=\"08:00:00\" max=\"17:00:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n            Not a valid date!</span>\n        <tt>value = {{example.value | date: \"HH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"HH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),\n     'HH:mm:ss.sss'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO week format (yyyy-W##).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO week format (yyyy-W##).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\" module=\"weekExample\">\n    <file name=\"index.html\">\n      <script>\n      angular.module('weekExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 0, 3)\n          };\n        }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        Pick a date between in 2013:\n        <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"YYYY-W##\" min=\"2012-W32\" max=\"2013-W52\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n            Not a valid date!</span>\n        <tt>value = {{example.value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   * If the model is not set to the first of the month, the next view to model update will set it\n   * to the first of the month.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be\n   * a valid ISO month format (yyyy-MM).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must\n   * be a valid ISO month format (yyyy-MM).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\" module=\"monthExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('monthExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 9, 1)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n       Pick a month in 2013:\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"example.value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n          Required!</span>\n       <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n          Not a valid month!</span>\n       <tt>value = {{example.value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * The model must always be a number, otherwise Angular will throw an error.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match\n   *    a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object then this is used directly.\n   *    If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`\n   *    characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\" module=\"numberExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('numberExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 value: 12\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           Number: <input type=\"number\" name=\"input\" ng-model=\"example.value\"\n                          min=\"0\" max=\"99\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n             Not valid number!</span>\n           <tt>value = {{example.value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('example.value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex\n   * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify\n   * the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match\n   *    a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object then this is used directly.\n   *    If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`\n   *    characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\" module=\"urlExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('urlExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.url = {\n                 text: 'http://google.com'\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           URL: <input type=\"url\" name=\"input\" ng-model=\"url.text\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n             Not valid url!</span>\n           <tt>text = {{url.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('url.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('url.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex\n   * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can\n   * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match\n   *    a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object then this is used directly.\n   *    If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`\n   *    characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\" module=\"emailExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('emailExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.email = {\n                 text: 'me@example.com'\n               };\n             }]);\n         </script>\n           <form name=\"myForm\" ng-controller=\"ExampleController\">\n             Email: <input type=\"email\" name=\"input\" ng-model=\"email.text\" required>\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n               Not valid email!</span>\n             <tt>text = {{email.text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('email.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('email.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string} value The value to which the expression should be set when selected.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue Angular expression which sets the value to which the expression should\n   *    be set when selected.\n   *\n   * @example\n      <example name=\"radio-input-directive\" module=\"radioExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('radioExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.color = {\n                 name: 'blue'\n               };\n               $scope.specialValue = {\n                 \"id\": \"12345\",\n                 \"value\": \"green\"\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <input type=\"radio\" ng-model=\"color.name\" value=\"red\">  Red <br/>\n           <input type=\"radio\" ng-model=\"color.name\" ng-value=\"specialValue\"> Green <br/>\n           <input type=\"radio\" ng-model=\"color.name\" value=\"blue\"> Blue <br/>\n           <tt>color = {{color.name | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var color = element(by.binding('color.name'));\n\n            expect(color.getText()).toContain('blue');\n\n            element.all(by.model('color.name')).get(0).click();\n\n            expect(color.getText()).toContain('red');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {expression=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\" module=\"checkboxExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('checkboxExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.checkboxModel = {\n                value1 : true,\n                value2 : 'YES'\n              };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           Value1: <input type=\"checkbox\" ng-model=\"checkboxModel.value1\"> <br/>\n           Value2: <input type=\"checkbox\" ng-model=\"checkboxModel.value2\"\n                          ng-true-value=\"'YES'\" ng-false-value=\"'NO'\"> <br/>\n           <tt>value1 = {{checkboxModel.value1}}</tt><br/>\n           <tt>value2 = {{checkboxModel.value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('checkboxModel.value1'));\n            var value2 = element(by.binding('checkboxModel.value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('checkboxModel.value1')).click();\n            element(by.model('checkboxModel.value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\nfunction stringBasedInputType(ctrl) {\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? value : value.toString();\n  });\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n}\n\nfunction baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var type = lowercase(element[0].type);\n\n  // In composition mode, users are still inputing intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function(data) {\n      composing = true;\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var listener = function(ev) {\n    if (timeout) {\n      $browser.defer.cancel(timeout);\n      timeout = null;\n    }\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // If input type is 'password', the value is never trimmed\n    if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {\n      value = trim(value);\n    }\n\n    // If a control is suffering from bad input (due to native validators), browsers discard its\n    // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the\n    // control's value is the same empty value twice in a row.\n    if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {\n      ctrl.$setViewValue(value, event);\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var timeout;\n\n    var deferListener = function(ev, input, origValue) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (!input || input.value !== origValue) {\n            listener(ev);\n          }\n        });\n      }\n    };\n\n    element.on('keydown', function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event, this, this.value);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  ctrl.$render = function() {\n    element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\n  };\n}\n\nfunction weekParser(isoWeek, existingDate) {\n  if (isDate(isoWeek)) {\n    return isoWeek;\n  }\n\n  if (isString(isoWeek)) {\n    WEEK_REGEXP.lastIndex = 0;\n    var parts = WEEK_REGEXP.exec(isoWeek);\n    if (parts) {\n      var year = +parts[1],\n          week = +parts[2],\n          hours = 0,\n          minutes = 0,\n          seconds = 0,\n          milliseconds = 0,\n          firstThurs = getFirstThursdayOfYear(year),\n          addDays = (week - 1) * 7;\n\n      if (existingDate) {\n        hours = existingDate.getHours();\n        minutes = existingDate.getMinutes();\n        seconds = existingDate.getSeconds();\n        milliseconds = existingDate.getMilliseconds();\n      }\n\n      return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);\n    }\n  }\n\n  return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n  return function(iso, date) {\n    var parts, map;\n\n    if (isDate(iso)) {\n      return iso;\n    }\n\n    if (isString(iso)) {\n      // When a date is JSON'ified to wraps itself inside of an extra\n      // set of double quotes. This makes the date parsing code unable\n      // to match the date string and parse it as a date.\n      if (iso.charAt(0) == '\"' && iso.charAt(iso.length - 1) == '\"') {\n        iso = iso.substring(1, iso.length - 1);\n      }\n      if (ISO_DATE_REGEXP.test(iso)) {\n        return new Date(iso);\n      }\n      regexp.lastIndex = 0;\n      parts = regexp.exec(iso);\n\n      if (parts) {\n        parts.shift();\n        if (date) {\n          map = {\n            yyyy: date.getFullYear(),\n            MM: date.getMonth() + 1,\n            dd: date.getDate(),\n            HH: date.getHours(),\n            mm: date.getMinutes(),\n            ss: date.getSeconds(),\n            sss: date.getMilliseconds() / 1000\n          };\n        } else {\n          map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };\n        }\n\n        forEach(parts, function(part, index) {\n          if (index < mapping.length) {\n            map[mapping[index]] = +part;\n          }\n        });\n        return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);\n      }\n    }\n\n    return NaN;\n  };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {\n    badInputChecker(scope, element, attr, ctrl);\n    baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n    var timezone = ctrl && ctrl.$options && ctrl.$options.timezone;\n    var previousDate;\n\n    ctrl.$$parserName = type;\n    ctrl.$parsers.push(function(value) {\n      if (ctrl.$isEmpty(value)) return null;\n      if (regexp.test(value)) {\n        // Note: We cannot read ctrl.$modelValue, as there might be a different\n        // parser/formatter in the processing chain so that the model\n        // contains some different data format!\n        var parsedDate = parseDate(value, previousDate);\n        if (timezone === 'UTC') {\n          parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset());\n        }\n        return parsedDate;\n      }\n      return undefined;\n    });\n\n    ctrl.$formatters.push(function(value) {\n      if (value && !isDate(value)) {\n        throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);\n      }\n      if (isValidDate(value)) {\n        previousDate = value;\n        if (previousDate && timezone === 'UTC') {\n          var timezoneOffset = 60000 * previousDate.getTimezoneOffset();\n          previousDate = new Date(previousDate.getTime() + timezoneOffset);\n        }\n        return $filter('date')(value, format, timezone);\n      } else {\n        previousDate = null;\n        return '';\n      }\n    });\n\n    if (isDefined(attr.min) || attr.ngMin) {\n      var minVal;\n      ctrl.$validators.min = function(value) {\n        return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;\n      };\n      attr.$observe('min', function(val) {\n        minVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    if (isDefined(attr.max) || attr.ngMax) {\n      var maxVal;\n      ctrl.$validators.max = function(value) {\n        return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;\n      };\n      attr.$observe('max', function(val) {\n        maxVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    function isValidDate(value) {\n      // Invalid Date: getTime() returns NaN\n      return value && !(value.getTime && value.getTime() !== value.getTime());\n    }\n\n    function parseObservedDateValue(val) {\n      return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined;\n    }\n  };\n}\n\nfunction badInputChecker(scope, element, attr, ctrl) {\n  var node = element[0];\n  var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);\n  if (nativeValidation) {\n    ctrl.$parsers.push(function(value) {\n      var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};\n      // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430):\n      // - also sets validity.badInput (should only be validity.typeMismatch).\n      // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email)\n      // - can ignore this case as we can still read out the erroneous email...\n      return validity.badInput && !validity.typeMismatch ? undefined : value;\n    });\n  }\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  badInputChecker(scope, element, attr, ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  ctrl.$$parserName = 'number';\n  ctrl.$parsers.push(function(value) {\n    if (ctrl.$isEmpty(value))      return null;\n    if (NUMBER_REGEXP.test(value)) return parseFloat(value);\n    return undefined;\n  });\n\n  ctrl.$formatters.push(function(value) {\n    if (!ctrl.$isEmpty(value)) {\n      if (!isNumber(value)) {\n        throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);\n      }\n      value = value.toString();\n    }\n    return value;\n  });\n\n  if (isDefined(attr.min) || attr.ngMin) {\n    var minVal;\n    ctrl.$validators.min = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;\n    };\n\n    attr.$observe('min', function(val) {\n      if (isDefined(val) && !isNumber(val)) {\n        val = parseFloat(val, 10);\n      }\n      minVal = isNumber(val) && !isNaN(val) ? val : undefined;\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n\n  if (isDefined(attr.max) || attr.ngMax) {\n    var maxVal;\n    ctrl.$validators.max = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;\n    };\n\n    attr.$observe('max', function(val) {\n      if (isDefined(val) && !isNumber(val)) {\n        val = parseFloat(val, 10);\n      }\n      maxVal = isNumber(val) && !isNaN(val) ? val : undefined;\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'url';\n  ctrl.$validators.url = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || URL_REGEXP.test(value);\n  };\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'email';\n  ctrl.$validators.email = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);\n  };\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    if (element[0].checked) {\n      ctrl.$setViewValue(attr.value, ev && ev.type);\n    }\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    element[0].checked = (value == ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction parseConstantExpr($parse, context, name, expression, fallback) {\n  var parseFn;\n  if (isDefined(expression)) {\n    parseFn = $parse(expression);\n    if (!parseFn.constant) {\n      throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' +\n                                   '`{1}`.', name, expression);\n    }\n    return parseFn(context);\n  }\n  return fallback;\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n  var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);\n  var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);\n\n  var listener = function(ev) {\n    ctrl.$setViewValue(element[0].checked, ev && ev.type);\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`\n  // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert\n  // it to a boolean.\n  ctrl.$isEmpty = function(value) {\n    return value === false;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return equals(value, trueValue);\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with angular data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding,\n * input state control, and validation.\n * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Not every feature offered is available for all input types.\n * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.\n * </div>\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n *    This parameter is ignored for input[type=password] controls, which will never trim the\n *    input.\n *\n * @example\n    <example name=\"input-directive\" module=\"inputExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('inputExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.user = {name: 'guest', last: 'visitor'};\n            }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <form name=\"myForm\">\n           User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n             Required!</span><br>\n           Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n             ng-minlength=\"3\" ng-maxlength=\"10\">\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n             Too short!</span>\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n             Too long!</span><br>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.exactBinding('user'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', '$parse',\n    function($browser, $sniffer, $filter, $parse) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        if (ctrls[0]) {\n          (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                              $browser, $filter, $parse);\n        }\n      }\n    }\n  };\n}];\n\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n *\n * @description\n * Binds the given expression to the value of `<option>` or {@link input[radio] `input[radio]`},\n * so that when the element is selected, the {@link ngModel `ngModel`} of that element is set to\n * the bound value.\n *\n * `ngValue` is useful when dynamically generating lists of radio buttons using\n * {@link ngRepeat `ngRepeat`}, as shown below.\n *\n * Likewise, `ngValue` can be used to generate `<option>` elements for\n * the {@link select `select`} element. In that case however, only strings are supported\n * for the `value `attribute, so the resulting `ngModel` will always be a string.\n * Support for `select` models with non-string values is available via `ngOptions`.\n *\n * @element input\n * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\n *   of the `input` element\n *\n * @example\n    <example name=\"ngValue-directive\" module=\"valueExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('valueExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.names = ['pizza', 'unicorns', 'robots'];\n              $scope.my = { favorite: 'unicorns' };\n            }]);\n       </script>\n        <form ng-controller=\"ExampleController\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          attr.$set('value', scope.$eval(attr.ngValue));\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            attr.$set('value', value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily\n * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example module=\"bindExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.name = 'Whirled';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         Enter name: <input type=\"text\" ng-model=\"name\"><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'AC',\n    compile: function ngBindCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBind);\n        element = element[0];\n        scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n          element.textContent = value === undefined ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example module=\"bindExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.salutation = 'Hello';\n             $scope.name = 'World';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n        Salutation: <input type=\"text\" ng-model=\"salutation\"><br>\n        Name: <input type=\"text\" ng-model=\"name\"><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {\n  return {\n    compile: function ngBindTemplateCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindTemplateLink(scope, element, attr) {\n        var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n        $compile.$$addBindingInfo(element, interpolateFn.expressions);\n        element = element[0];\n        attr.$observe('ngBindTemplate', function(value) {\n          element.textContent = value === undefined ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,\n * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.\n * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link\n * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}\n * in your module's dependencies, you need to include \"angular-sanitize.js\" in your application.\n *\n * You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n\n   <example module=\"bindHtmlExample\" deps=\"angular-sanitize.js\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('bindHtmlExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.myHTML =\n              'I am an <code>HTML</code>string with ' +\n              '<a href=\"#\">links!</a> and other <em>stuff</em>';\n         }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {\n  return {\n    restrict: 'A',\n    compile: function ngBindHtmlCompile(tElement, tAttrs) {\n      var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);\n      var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) {\n        return (value || '').toString();\n      });\n      $compile.$$addBindingClass(tElement);\n\n      return function ngBindHtmlLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBindHtml);\n\n        scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n          // we re-evaluate the expr because we want a TrustedValueHolderType\n          // for $sce, not a string\n          element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');\n        });\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngChange\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n *\n * The `ngChange` expression is only evaluated when a change in the input value causes\n * a new value to be committed to the model.\n *\n * It will not be evaluated:\n * * if the value returned from the `$parsers` transformation pipeline has not changed\n * * if the input has continued to be invalid since the model will stay `null`\n * * if the model is changed programmatically and not by a change to the input value\n *\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element input\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\" module=\"changeExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('changeExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.counter = 0;\n *           $scope.change = function() {\n *             $scope.counter++;\n *           };\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  restrict: 'A',\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var oldVal;\n\n        scope.$watch(attr[name], ngClassWatchAction, true);\n\n        attr.$observe('class', function(value) {\n          ngClassWatchAction(scope.$eval(attr[name]));\n        });\n\n\n        if (name !== 'ngClass') {\n          scope.$watch('$index', function($index, old$index) {\n            // jshint bitwise: false\n            var mod = $index & 1;\n            if (mod !== (old$index & 1)) {\n              var classes = arrayClasses(scope.$eval(attr[name]));\n              mod === selector ?\n                addClasses(classes) :\n                removeClasses(classes);\n            }\n          });\n        }\n\n        function addClasses(classes) {\n          var newClasses = digestClassCounts(classes, 1);\n          attr.$addClass(newClasses);\n        }\n\n        function removeClasses(classes) {\n          var newClasses = digestClassCounts(classes, -1);\n          attr.$removeClass(newClasses);\n        }\n\n        function digestClassCounts(classes, count) {\n          var classCounts = element.data('$classCounts') || {};\n          var classesToUpdate = [];\n          forEach(classes, function(className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n          element.data('$classCounts', classCounts);\n          return classesToUpdate.join(' ');\n        }\n\n        function updateClasses(oldClasses, newClasses) {\n          var toAdd = arrayDifference(newClasses, oldClasses);\n          var toRemove = arrayDifference(oldClasses, newClasses);\n          toAdd = digestClassCounts(toAdd, 1);\n          toRemove = digestClassCounts(toRemove, -1);\n          if (toAdd && toAdd.length) {\n            $animate.addClass(element, toAdd);\n          }\n          if (toRemove && toRemove.length) {\n            $animate.removeClass(element, toRemove);\n          }\n        }\n\n        function ngClassWatchAction(newVal) {\n          if (selector === true || scope.$index % 2 === selector) {\n            var newClasses = arrayClasses(newVal || []);\n            if (!oldVal) {\n              addClasses(newClasses);\n            } else if (!equals(newVal,oldVal)) {\n              var oldClasses = arrayClasses(oldVal);\n              updateClasses(oldClasses, newClasses);\n            }\n          }\n          oldVal = shallowCopy(newVal);\n        }\n      }\n    };\n\n    function arrayDifference(tokens1, tokens2) {\n      var values = [];\n\n      outer:\n      for (var i = 0; i < tokens1.length; i++) {\n        var token = tokens1[i];\n        for (var j = 0; j < tokens2.length; j++) {\n          if (token == tokens2[j]) continue outer;\n        }\n        values.push(token);\n      }\n      return values;\n    }\n\n    function arrayClasses(classVal) {\n      if (isArray(classVal)) {\n        return classVal;\n      } else if (isString(classVal)) {\n        return classVal.split(' ');\n      } else if (isObject(classVal)) {\n        var classes = [];\n        forEach(classVal, function(v, k) {\n          if (v) {\n            classes = classes.concat(k.split(' '));\n          }\n        });\n        return classes;\n      }\n      return classVal;\n    }\n  }];\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an array, each element of the array should be a string that is\n * one or more space-delimited class names.\n *\n * 3. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then the\n * new classes are added.\n *\n * @animations\n * **add** - happens just before the class is applied to the elements\n *\n * **remove** - happens just before the class is removed from the element\n *\n * @element ANY\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example Example that demonstrates basic bindings via ngClass directive.\n   <example>\n     <file name=\"index.html\">\n       <p ng-class=\"{strike: deleted, bold: important, red: error}\">Map Syntax Example</p>\n       <input type=\"checkbox\" ng-model=\"deleted\"> deleted (apply \"strike\" class)<br>\n       <input type=\"checkbox\" ng-model=\"important\"> important (apply \"bold\" class)<br>\n       <input type=\"checkbox\" ng-model=\"error\"> error (apply \"red\" class)\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\" placeholder=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style3\" placeholder=\"Type: bold, strike or red\"><br>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n         text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/red/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/red/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.last().getAttribute('class')).toBe('bold strike red');\n       });\n     </file>\n   </example>\n\n   ## Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n\n\n   ## ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link ng.$animate#addClass $animate.addClass} and\n   {@link ng.$animate#removeClass $animate.removeClass}.\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\n * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\n * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.\n *\n * @element ANY\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @priority 500\n * @param {expression} ngController Name of a constructor function registered with the current\n * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}\n * that on the current scope evaluates to a constructor function.\n *\n * The controller instance can be published into a scope property by specifying\n * `ng-controller=\"as propertyName\"`.\n *\n * If the current `$controllerProvider` is configured to use globals (via\n * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may\n * also be the name of a globally accessible constructor function (not recommended).\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the angular markup. Any changes to the data are automatically reflected\n * in the View without the need for a manual update.\n *\n * Two different declaration styles are included below:\n *\n * * one binds methods and properties directly onto the controller using `this`:\n * `ng-controller=\"SettingsController1 as settings\"`\n * * one injects `$scope` into the controller:\n * `ng-controller=\"SettingsController2\"`\n *\n * The second option is more common in the Angular community, and is generally used in boilerplates\n * and in this guide. However, there are advantages to binding properties directly to the controller\n * and avoiding scope.\n *\n * * Using `controller as` makes it obvious which controller you are accessing in the template when\n * multiple controllers apply to an element.\n * * If you are writing your controllers as classes you have easier access to the properties and\n * methods, which will appear on the scope, from inside the controller code.\n * * Since there is always a `.` in the bindings, you don't have to worry about prototypal\n * inheritance masking primitives.\n *\n * This example demonstrates the `controller as` syntax.\n *\n * <example name=\"ngControllerAs\" module=\"controllerAsExample\">\n *   <file name=\"index.html\">\n *    <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n *      Name: <input type=\"text\" ng-model=\"settings.name\"/>\n *      [ <a href=\"\" ng-click=\"settings.greet()\">greet</a> ]<br/>\n *      Contact:\n *      <ul>\n *        <li ng-repeat=\"contact in settings.contacts\">\n *          <select ng-model=\"contact.type\">\n *             <option>phone</option>\n *             <option>email</option>\n *          </select>\n *          <input type=\"text\" ng-model=\"contact.value\"/>\n *          [ <a href=\"\" ng-click=\"settings.clearContact(contact)\">clear</a>\n *          | <a href=\"\" ng-click=\"settings.removeContact(contact)\">X</a> ]\n *        </li>\n *        <li>[ <a href=\"\" ng-click=\"settings.addContact()\">add</a> ]</li>\n *     </ul>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('controllerAsExample', [])\n *      .controller('SettingsController1', SettingsController1);\n *\n *    function SettingsController1() {\n *      this.name = \"John Smith\";\n *      this.contacts = [\n *        {type: 'phone', value: '408 555 1212'},\n *        {type: 'email', value: 'john.smith@example.org'} ];\n *    }\n *\n *    SettingsController1.prototype.greet = function() {\n *      alert(this.name);\n *    };\n *\n *    SettingsController1.prototype.addContact = function() {\n *      this.contacts.push({type: 'email', value: 'yourname@example.org'});\n *    };\n *\n *    SettingsController1.prototype.removeContact = function(contactToRemove) {\n *     var index = this.contacts.indexOf(contactToRemove);\n *      this.contacts.splice(index, 1);\n *    };\n *\n *    SettingsController1.prototype.clearContact = function(contact) {\n *      contact.type = 'phone';\n *      contact.value = '';\n *    };\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should check controller as', function() {\n *       var container = element(by.id('ctrl-as-exmpl'));\n *         expect(container.element(by.model('settings.name'))\n *           .getAttribute('value')).toBe('John Smith');\n *\n *       var firstRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(0));\n *       var secondRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(1));\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('408 555 1212');\n *\n *       expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('john.smith@example.org');\n *\n *       firstRepeat.element(by.linkText('clear')).click();\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('');\n *\n *       container.element(by.linkText('add')).click();\n *\n *       expect(container.element(by.repeater('contact in settings.contacts').row(2))\n *           .element(by.model('contact.value'))\n *           .getAttribute('value'))\n *           .toBe('yourname@example.org');\n *     });\n *   </file>\n * </example>\n *\n * This example demonstrates the \"attach to `$scope`\" style of controller.\n *\n * <example name=\"ngController\" module=\"controllerExample\">\n *  <file name=\"index.html\">\n *   <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n *     Name: <input type=\"text\" ng-model=\"name\"/>\n *     [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\n *     Contact:\n *     <ul>\n *       <li ng-repeat=\"contact in contacts\">\n *         <select ng-model=\"contact.type\">\n *            <option>phone</option>\n *            <option>email</option>\n *         </select>\n *         <input type=\"text\" ng-model=\"contact.value\"/>\n *         [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\n *         | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\n *       </li>\n *       <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\n *    </ul>\n *   </div>\n *  </file>\n *  <file name=\"app.js\">\n *   angular.module('controllerExample', [])\n *     .controller('SettingsController2', ['$scope', SettingsController2]);\n *\n *   function SettingsController2($scope) {\n *     $scope.name = \"John Smith\";\n *     $scope.contacts = [\n *       {type:'phone', value:'408 555 1212'},\n *       {type:'email', value:'john.smith@example.org'} ];\n *\n *     $scope.greet = function() {\n *       alert($scope.name);\n *     };\n *\n *     $scope.addContact = function() {\n *       $scope.contacts.push({type:'email', value:'yourname@example.org'});\n *     };\n *\n *     $scope.removeContact = function(contactToRemove) {\n *       var index = $scope.contacts.indexOf(contactToRemove);\n *       $scope.contacts.splice(index, 1);\n *     };\n *\n *     $scope.clearContact = function(contact) {\n *       contact.type = 'phone';\n *       contact.value = '';\n *     };\n *   }\n *  </file>\n *  <file name=\"protractor.js\" type=\"protractor\">\n *    it('should check controller', function() {\n *      var container = element(by.id('ctrl-exmpl'));\n *\n *      expect(container.element(by.model('name'))\n *          .getAttribute('value')).toBe('John Smith');\n *\n *      var firstRepeat =\n *          container.element(by.repeater('contact in contacts').row(0));\n *      var secondRepeat =\n *          container.element(by.repeater('contact in contacts').row(1));\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('408 555 1212');\n *      expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('john.smith@example.org');\n *\n *      firstRepeat.element(by.linkText('clear')).click();\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('');\n *\n *      container.element(by.linkText('add')).click();\n *\n *      expect(container.element(by.repeater('contact in contacts').row(2))\n *          .element(by.model('contact.value'))\n *          .getAttribute('value'))\n *          .toBe('yourname@example.org');\n *    });\n *  </file>\n *</example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    restrict: 'A',\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @element html\n * @description\n * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\n *\n * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.\n *\n * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).\n * For Angular to be CSP compatible there are only two things that we need to do differently:\n *\n * - don't use `Function` constructor to generate optimized value getters\n * - don't inject custom stylesheet into the document\n *\n * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`\n * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will\n * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will\n * be raised.\n *\n * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically\n * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).\n * To make those directives work in CSP mode, include the `angular-csp.css` manually.\n *\n * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This\n * autodetection however triggers a CSP error to be logged in the console:\n *\n * ```\n * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of\n * script in the following Content Security Policy directive: \"default-src 'self'\". Note that\n * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.\n * ```\n *\n * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`\n * directive on the root element of the application or on the `angular.js` script tag, whichever\n * appears first in the html document.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * @example\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n  * @example\n      // Note: the suffix `.csp` in the example name triggers\n      // csp mode in our http server!\n      <example name=\"example.csp\" module=\"cspExample\" ng-csp=\"true\">\n        <file name=\"index.html\">\n          <div ng-controller=\"MainController as ctrl\">\n            <div>\n              <button ng-click=\"ctrl.inc()\" id=\"inc\">Increment</button>\n              <span id=\"counter\">\n                {{ctrl.counter}}\n              </span>\n            </div>\n\n            <div>\n              <button ng-click=\"ctrl.evil()\" id=\"evil\">Evil</button>\n              <span id=\"evilError\">\n                {{ctrl.evilError}}\n              </span>\n            </div>\n          </div>\n        </file>\n        <file name=\"script.js\">\n           angular.module('cspExample', [])\n             .controller('MainController', function() {\n                this.counter = 0;\n                this.inc = function() {\n                  this.counter++;\n                };\n                this.evil = function() {\n                  // jshint evil:true\n                  try {\n                    eval('1+2');\n                  } catch (e) {\n                    this.evilError = e.message;\n                  }\n                };\n              });\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var util, webdriver;\n\n          var incBtn = element(by.id('inc'));\n          var counter = element(by.id('counter'));\n          var evilBtn = element(by.id('evil'));\n          var evilError = element(by.id('evilError'));\n\n          function getAndClearSevereErrors() {\n            return browser.manage().logs().get('browser').then(function(browserLog) {\n              return browserLog.filter(function(logEntry) {\n                return logEntry.level.value > webdriver.logging.Level.WARNING.value;\n              });\n            });\n          }\n\n          function clearErrors() {\n            getAndClearSevereErrors();\n          }\n\n          function expectNoErrors() {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              expect(filteredLog.length).toEqual(0);\n              if (filteredLog.length) {\n                console.log('browser console errors: ' + util.inspect(filteredLog));\n              }\n            });\n          }\n\n          function expectError(regex) {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              var found = false;\n              filteredLog.forEach(function(log) {\n                if (log.message.match(regex)) {\n                  found = true;\n                }\n              });\n              if (!found) {\n                throw new Error('expected an error that matches ' + regex);\n              }\n            });\n          }\n\n          beforeEach(function() {\n            util = require('util');\n            webdriver = require('protractor/node_modules/selenium-webdriver');\n          });\n\n          // For now, we only test on Chrome,\n          // as Safari does not load the page with Protractor's injected scripts,\n          // and Firefox webdriver always disables content security policy (#6358)\n          if (browser.params.browser !== 'chrome') {\n            return;\n          }\n\n          it('should not report errors when the page is loaded', function() {\n            // clear errors so we are not dependent on previous tests\n            clearErrors();\n            // Need to reload the page as the page is already loaded when\n            // we come here\n            browser.driver.getCurrentUrl().then(function(url) {\n              browser.get(url);\n            });\n            expectNoErrors();\n          });\n\n          it('should evaluate expressions', function() {\n            expect(counter.getText()).toEqual('0');\n            incBtn.click();\n            expect(counter.getText()).toEqual('1');\n            expectNoErrors();\n          });\n\n          it('should throw and report an error when using \"eval\"', function() {\n            evilBtn.click();\n            expect(evilError.getText()).toMatch(/Content Security Policy/);\n            expectError(/Content Security Policy/);\n          });\n        </file>\n      </example>\n  */\n\n// ngCsp is not implemented as a proper directive any more, because we need it be processed while we\n// bootstrap the system (before $parse is instantiated), for this reason we just have\n// the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc\n\n/**\n * @ngdoc directive\n * @name ngClick\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      <span>\n        count: {{count}}\n      </span>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A collection of directives that allows creation of custom event handlers that are defined as\n * angular expressions and are compiled and executed within the current scope.\n */\nvar ngEventDirectives = {};\n\n// For events that might fire synchronously during DOM manipulation\n// we need to execute their event handlers asynchronously using $evalAsync,\n// so that they are not executed in an inconsistent state.\nvar forceAsyncEvents = {\n  'blur': true,\n  'focus': true\n};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(eventName) {\n    var directiveName = directiveNormalize('ng-' + eventName);\n    ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {\n      return {\n        restrict: 'A',\n        compile: function($element, attr) {\n          // We expose the powerful $event object on the scope that provides access to the Window,\n          // etc. that isn't protected by the fast paths in $parse.  We explicitly request better\n          // checks at the cost of speed since event handler expressions are not executed as\n          // frequently as regular change detection.\n          var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);\n          return function ngEventHandler(scope, element) {\n            element.on(eventName, function(event) {\n              var callback = function() {\n                fn(scope, {$event:event});\n              };\n              if (forceAsyncEvents[eventName] && $rootScope.$$phase) {\n                scope.$evalAsync(callback);\n              } else {\n                scope.$apply(callback);\n              }\n            });\n          };\n        }\n      };\n    }];\n  }\n);\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <p>Typing in the input box below updates the key count</p>\n       <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\"> key up count: {{count}}\n\n       <p>Typing in the input box below updates the keycode</p>\n       <input ng-keyup=\"event=$event\">\n       <p>event keyCode: {{ event.keyCode }}</p>\n       <p>event altKey: {{ event.altKey }}</p>\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @element ANY\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n *\n * @description\n * Enables binding angular expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * <div class=\"alert alert-warning\">\n * **Warning:** Be careful not to cause \"double-submission\" by using both the `ngClick` and\n * `ngSubmit` handlers together. See the\n * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}\n * for a detailed discussion of when `ngSubmit` may be triggered.\n * </div>\n *\n * @element form\n * @priority 0\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example module=\"submitExample\">\n     <file name=\"index.html\">\n      <script>\n        angular.module('submitExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.list = [];\n            $scope.text = 'hello';\n            $scope.submit = function() {\n              if ($scope.text) {\n                $scope.list.push(this.text);\n                $scope.text = '';\n              }\n            };\n          }]);\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"ExampleController\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.model('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * Note: As the `focus` event is executed synchronously when calling `input.focus()`\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when\n * an element has lost focus.\n *\n * Note: As the `blur` event is executed synchronously also during DOM manipulations\n * (e.g. removing a focussed input),\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * enter - happens just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container\n * leave - happens just before the `ngIf` contents are removed from the DOM\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        This is removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', function($animate) {\n  return {\n    multiElement: true,\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (value) {\n            if (!childScope) {\n              $transclude(function(clone, newScope) {\n                childScope = newScope;\n                clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if (previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if (childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if (block) {\n              previousElements = getBlockNodes(block.clone);\n              $animate.leave(previousElements).then(function() {\n                previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link $sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n *\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"includeExample\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n     <div ng-controller=\"ExampleController\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <code>{{template.url}}</code>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('includeExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.templates =\n            [ { name: 'template1.html', url: 'template1.html'},\n              { name: 'template2.html', url: 'template2.html'} ];\n          $scope.template = $scope.templates[0];\n        }]);\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentError\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted when a template HTTP request yields an erroneous response (status < 200 || status > 299)\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\nvar ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate', '$sce',\n                  function($templateRequest,   $anchorScroll,   $animate,   $sce) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if (previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            $animate.leave(currentElement).then(function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {\n          var afterAnimation = function() {\n            if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n              $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            //set the 2nd param to true to ignore the template request error so that the inner\n            //contents and scope can be cleaned up.\n            $templateRequest(src, true).then(function(response) {\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element).then(afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded', src);\n              scope.$eval(onloadExp);\n            }, function() {\n              if (thisChangeId === changeCounter) {\n                cleanupLastIncludeContent();\n                scope.$emit('$includeContentError', src);\n              }\n            });\n            scope.$emit('$includeContentRequested', src);\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        if (/SVG/.test($element[0].toString())) {\n          // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not\n          // support innerHTML, so detect this here and try to generate the contents\n          // specially.\n          $element.empty();\n          $compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope,\n              function namespaceAdaptedClone(clone) {\n            $element.append(clone);\n          }, {futureParentElement: $element});\n          return;\n        }\n\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-error\">\n * The only appropriate use of `ngInit` is for aliasing special properties of\n * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you\n * should use {@link guide/controller controllers} rather than `ngInit`\n * to initialize values on a scope.\n * </div>\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make\n * sure you have parenthesis for correct precedence:\n * <pre class=\"prettyprint\">\n * `<div ng-init=\"test1 = (data | orderBy:'name')\"></div>`\n * </pre>\n * </div>\n *\n * @priority 450\n *\n * @element ANY\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @example\n   <example module=\"initExample\">\n     <file name=\"index.html\">\n   <script>\n     angular.module('initExample', [])\n       .controller('ExampleController', ['$scope', function($scope) {\n         $scope.list = [['a', 'b'], ['c', 'd']];\n       }]);\n   </script>\n   <div ng-controller=\"ExampleController\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngList\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The default\n * delimiter is a comma followed by a space - equivalent to `ng-list=\", \"`. You can specify a custom\n * delimiter as the value of the `ngList` attribute - for example, `ng-list=\" | \"`.\n *\n * The behaviour of the directive is affected by the use of the `ngTrim` attribute.\n * * If `ngTrim` is set to `\"false\"` then whitespace around both the separator and each\n *   list item is respected. This implies that the user of the directive is responsible for\n *   dealing with whitespace but also allows you to use whitespace as a delimiter, such as a\n *   tab or newline character.\n * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected\n *   when joining the list items back together) and whitespace around each list item is stripped\n *   before it is added to the model.\n *\n * ### Example with Validation\n *\n * <example name=\"ngList-directive\" module=\"listExample\">\n *   <file name=\"app.js\">\n *      angular.module('listExample', [])\n *        .controller('ExampleController', ['$scope', function($scope) {\n *          $scope.names = ['morpheus', 'neo', 'trinity'];\n *        }]);\n *   </file>\n *   <file name=\"index.html\">\n *    <form name=\"myForm\" ng-controller=\"ExampleController\">\n *      List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\n *      <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n *        Required!</span>\n *      <br>\n *      <tt>names = {{names}}</tt><br/>\n *      <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n *      <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n *      <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n *      <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n *     </form>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var listInput = element(by.model('names'));\n *     var names = element(by.exactBinding('names'));\n *     var valid = element(by.binding('myForm.namesInput.$valid'));\n *     var error = element(by.css('span.error'));\n *\n *     it('should initialize to model', function() {\n *       expect(names.getText()).toContain('[\"morpheus\",\"neo\",\"trinity\"]');\n *       expect(valid.getText()).toContain('true');\n *       expect(error.getCssValue('display')).toBe('none');\n *     });\n *\n *     it('should be invalid if empty', function() {\n *       listInput.clear();\n *       listInput.sendKeys('');\n *\n *       expect(names.getText()).toContain('');\n *       expect(valid.getText()).toContain('false');\n *       expect(error.getCssValue('display')).not.toBe('none');\n *     });\n *   </file>\n * </example>\n *\n * ### Example - splitting on whitespace\n * <example name=\"ngList-directive-newlines\">\n *   <file name=\"index.html\">\n *    <textarea ng-model=\"list\" ng-list=\"&#10;\" ng-trim=\"false\"></textarea>\n *    <pre>{{ list | json }}</pre>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it(\"should split the text by newlines\", function() {\n *       var listInput = element(by.model('list'));\n *       var output = element(by.binding('list | json'));\n *       listInput.sendKeys('abc\\ndef\\nghi');\n *       expect(output.getText()).toContain('[\\n  \"abc\",\\n  \"def\",\\n  \"ghi\"\\n]');\n *     });\n *   </file>\n * </example>\n *\n * @element input\n * @param {string=} ngList optional delimiter that should be used to split the value.\n */\nvar ngListDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      // We want to control whitespace trimming so we use this convoluted approach\n      // to access the ngList attribute, which doesn't pre-trim the attribute\n      var ngList = element.attr(attr.$attr.ngList) || ', ';\n      var trimValues = attr.ngTrim !== 'false';\n      var separator = trimValues ? trim(ngList) : ngList;\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trimValues ? trim(value) : value);\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(ngList);\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n/* global VALID_CLASS: true,\n  INVALID_CLASS: true,\n  PRISTINE_CLASS: true,\n  DIRTY_CLASS: true,\n  UNTOUCHED_CLASS: true,\n  TOUCHED_CLASS: true,\n*/\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty',\n    UNTOUCHED_CLASS = 'ng-untouched',\n    TOUCHED_CLASS = 'ng-touched',\n    PENDING_CLASS = 'ng-pending';\n\n\nvar $ngModelMinErr = new minErr('ngModel');\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n *\n * @property {string} $viewValue Actual string value in the view.\n * @property {*} $modelValue The value in the model that the control is bound to.\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n       the control reads value from the DOM. The functions are called in array order, each passing\n       its return value through to the next. The last return value is forwarded to the\n       {@link ngModel.NgModelController#$validators `$validators`} collection.\n\nParsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue\n`$viewValue`}.\n\nReturning `undefined` from a parser means a parse error occurred. In that case,\nno {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`\nwill be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}\nis set to `true`. The parse error is stored in `ngModel.$error.parse`.\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n       the model value changes. The functions are called in reverse array order, each passing the value through to the\n       next. The last return value is used as the actual DOM value.\n       Used to format / convert values for display in the control.\n * ```js\n * function formatter(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(formatter);\n * ```\n *\n * @property {Object.<string, function>} $validators A collection of validators that are applied\n *      whenever the model value changes. The key value within the object refers to the name of the\n *      validator while the function refers to the validation operation. The validation operation is\n *      provided with the model value as an argument and must return a true or false value depending\n *      on the response of that validation.\n *\n * ```js\n * ngModel.$validators.validCharacters = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *   return /[0-9]+/.test(value) &&\n *          /[a-z]+/.test(value) &&\n *          /[A-Z]+/.test(value) &&\n *          /\\W+/.test(value);\n * };\n * ```\n *\n * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to\n *      perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided\n *      is expected to return a promise when it is run during the model validation process. Once the promise\n *      is delivered then the validation status will be set to true when fulfilled and false when rejected.\n *      When the asynchronous validators are triggered, each of the validators will run in parallel and the model\n *      value will only be updated once all validators have been fulfilled. As long as an asynchronous validator\n *      is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators\n *      will only run once all synchronous validators have passed.\n *\n * Please note that if $http is used then it is important that the server returns a success HTTP response code\n * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.\n *\n * ```js\n * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *\n *   // Lookup user by username\n *   return $http.get('/api/users/' + value).\n *      then(function resolved() {\n *        //username exists, this means validation fails\n *        return $q.reject('exists');\n *      }, function rejected() {\n *        //username does not exist, therefore this validation passes\n *        return true;\n *      });\n * };\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\n *     view value has changed. It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all failing validator ids as keys.\n * @property {Object} $pending An object hash with all pending validator ids as keys.\n *\n * @property {boolean} $untouched True if control has not lost focus yet.\n * @property {boolean} $touched True if control has lost focus.\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n * @property {string} $name The name attribute of the control.\n *\n * @description\n *\n * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.\n * The controller contains services for data-binding, validation, CSS updates, and value formatting\n * and parsing. It purposefully does not contain any logic which deals with DOM rendering or\n * listening to DOM events.\n * Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding to control elements.\n * Angular provides this DOM logic for most {@link input `input`} elements.\n * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example\n * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.\n *\n * @example\n * ### Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if (!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$evalAsync(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if ( attrs.stripBr && html == '<br>' ) {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate',\n    function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.\n  this.$validators = {};\n  this.$asyncValidators = {};\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$untouched = true;\n  this.$touched = false;\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$error = {}; // keep invalid keys here\n  this.$$success = {}; // keep valid keys here\n  this.$pending = undefined; // keep pending keys here\n  this.$name = $interpolate($attr.name || '', false)($scope);\n\n\n  var parsedNgModel = $parse($attr.ngModel),\n      parsedNgModelAssign = parsedNgModel.assign,\n      ngModelGet = parsedNgModel,\n      ngModelSet = parsedNgModelAssign,\n      pendingDebounce = null,\n      parserValid,\n      ctrl = this;\n\n  this.$$setOptions = function(options) {\n    ctrl.$options = options;\n    if (options && options.getterSetter) {\n      var invokeModelGetter = $parse($attr.ngModel + '()'),\n          invokeModelSetter = $parse($attr.ngModel + '($$$p)');\n\n      ngModelGet = function($scope) {\n        var modelValue = parsedNgModel($scope);\n        if (isFunction(modelValue)) {\n          modelValue = invokeModelGetter($scope);\n        }\n        return modelValue;\n      };\n      ngModelSet = function($scope, newValue) {\n        if (isFunction(parsedNgModel($scope))) {\n          invokeModelSetter($scope, {$$$p: ctrl.$modelValue});\n        } else {\n          parsedNgModelAssign($scope, ctrl.$modelValue);\n        }\n      };\n    } else if (!parsedNgModel.assign) {\n      throw $ngModelMinErr('nonassign', \"Expression '{0}' is non-assignable. Element: {1}\",\n          $attr.ngModel, startingTag($element));\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   *\n   * The `$render()` method is invoked in the following situations:\n   *\n   * * `$rollbackViewValue()` is called.  If we are rolling back the view value to the last\n   *   committed value then `$render()` is called to update the input control.\n   * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and\n   *   the `$viewValue` are different to last time.\n   *\n   * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of\n   * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue`\n   * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be\n   * invoked if you only change a property on the objects.\n   */\n  this.$render = noop;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of an input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   *\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different to the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value The value of the input to check for emptiness.\n   * @returns {boolean} True if `value` is \"empty\".\n   */\n  this.$isEmpty = function(value) {\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  };\n\n  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,\n      currentValidationRunId = 0;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setValidity\n   *\n   * @description\n   * Change the validity state, and notify the form.\n   *\n   * This method can be called within $parsers/$formatters or a custom validation implementation.\n   * However, in most cases it should be sufficient to use the `ngModel.$validators` and\n   * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.\n   *\n   * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned\n   *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`\n   *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\n   * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),\n   *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.\n   *                          Skipped is used by Angular when validators do not run because of parse errors and\n   *                          when `$asyncValidators` do not run because any of the `$validators` failed.\n   */\n  addSetValidityMethod({\n    ctrl: this,\n    $element: $element,\n    set: function(object, property) {\n      object[property] = true;\n    },\n    unset: function(object, property) {\n      delete object[property];\n    },\n    parentForm: parentForm,\n    $animate: $animate\n  });\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the `ng-dirty` class and set the control to its pristine\n   * state (`ng-pristine` class). A model is considered to be pristine when the control\n   * has not been changed from when first compiled.\n   */\n  this.$setPristine = function() {\n    ctrl.$dirty = false;\n    ctrl.$pristine = true;\n    $animate.removeClass($element, DIRTY_CLASS);\n    $animate.addClass($element, PRISTINE_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setDirty\n   *\n   * @description\n   * Sets the control to its dirty state.\n   *\n   * This method can be called to remove the `ng-pristine` class and set the control to its dirty\n   * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed\n   * from when first compiled.\n   */\n  this.$setDirty = function() {\n    ctrl.$dirty = true;\n    ctrl.$pristine = false;\n    $animate.removeClass($element, PRISTINE_CLASS);\n    $animate.addClass($element, DIRTY_CLASS);\n    parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setUntouched\n   *\n   * @description\n   * Sets the control to its untouched state.\n   *\n   * This method can be called to remove the `ng-touched` class and set the control to its\n   * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched\n   * by default, however this function can be used to restore that state if the model has\n   * already been touched by the user.\n   */\n  this.$setUntouched = function() {\n    ctrl.$touched = false;\n    ctrl.$untouched = true;\n    $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setTouched\n   *\n   * @description\n   * Sets the control to its touched state.\n   *\n   * This method can be called to remove the `ng-untouched` class and set the control to its\n   * touched state (`ng-touched` class). A model is considered to be touched when the user has\n   * first focused the control element and then shifted focus away from the control (blur event).\n   */\n  this.$setTouched = function() {\n    ctrl.$touched = true;\n    ctrl.$untouched = false;\n    $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for a some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced events or events such\n   * as blur you can have a situation where there is a period when the `$viewValue`\n   * is out of synch with the ngModel's `$modelValue`.\n   *\n   * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because Angular's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateController', ['$scope', function($scope) {\n   *       $scope.resetWithCancel = function(e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myForm.myInput1.$rollbackViewValue();\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *       $scope.resetWithoutCancel = function(e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *     }]);\n   *   </file>\n   *   <file name=\"index.html\">\n   *     <div ng-controller=\"CancelUpdateController\">\n   *       <p>Try typing something in each input.  See that the model only updates when you\n   *          blur off the input.\n   *        </p>\n   *        <p>Now see what happens if you start typing then press the Escape key</p>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <p>With $rollbackViewValue()</p>\n   *         <input name=\"myInput1\" ng-model=\"myValue\" ng-keydown=\"resetWithCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *\n   *         <p>Without $rollbackViewValue()</p>\n   *         <input name=\"myInput2\" ng-model=\"myValue\" ng-keydown=\"resetWithoutCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *       </form>\n   *     </div>\n   *   </file>\n   * </example>\n   */\n  this.$rollbackViewValue = function() {\n    $timeout.cancel(pendingDebounce);\n    ctrl.$viewValue = ctrl.$$lastCommittedViewValue;\n    ctrl.$render();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$validate\n   *\n   * @description\n   * Runs each of the registered validators (first synchronous validators and then\n   * asynchronous validators).\n   * If the validity changes to invalid, the model will be set to `undefined`,\n   * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.\n   * If the validity changes to valid, it will set the model to the last available valid\n   * modelValue, i.e. either the last parsed value or the last value set from the scope.\n   */\n  this.$validate = function() {\n    // ignore $validate before model is initialized\n    if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    var viewValue = ctrl.$$lastCommittedViewValue;\n    // Note: we use the $$rawModelValue as $modelValue might have been\n    // set to undefined during a view -> model update that found validation\n    // errors. We can't parse the view here, since that could change\n    // the model although neither viewValue nor the model on the scope changed\n    var modelValue = ctrl.$$rawModelValue;\n\n    var prevValid = ctrl.$valid;\n    var prevModelValue = ctrl.$modelValue;\n\n    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;\n\n    ctrl.$$runValidators(modelValue, viewValue, function(allValid) {\n      // If there was no change in validity, don't update the model\n      // This prevents changing an invalid modelValue to undefined\n      if (!allowInvalid && prevValid !== allValid) {\n        // Note: Don't check ctrl.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        ctrl.$modelValue = allValid ? modelValue : undefined;\n\n        if (ctrl.$modelValue !== prevModelValue) {\n          ctrl.$$writeModelToScope();\n        }\n      }\n    });\n\n  };\n\n  this.$$runValidators = function(modelValue, viewValue, doneCallback) {\n    currentValidationRunId++;\n    var localValidationRunId = currentValidationRunId;\n\n    // check parser error\n    if (!processParseErrors()) {\n      validationDone(false);\n      return;\n    }\n    if (!processSyncValidators()) {\n      validationDone(false);\n      return;\n    }\n    processAsyncValidators();\n\n    function processParseErrors() {\n      var errorKey = ctrl.$$parserName || 'parse';\n      if (parserValid === undefined) {\n        setValidity(errorKey, null);\n      } else {\n        if (!parserValid) {\n          forEach(ctrl.$validators, function(v, name) {\n            setValidity(name, null);\n          });\n          forEach(ctrl.$asyncValidators, function(v, name) {\n            setValidity(name, null);\n          });\n        }\n        // Set the parse error last, to prevent unsetting it, should a $validators key == parserName\n        setValidity(errorKey, parserValid);\n        return parserValid;\n      }\n      return true;\n    }\n\n    function processSyncValidators() {\n      var syncValidatorsValid = true;\n      forEach(ctrl.$validators, function(validator, name) {\n        var result = validator(modelValue, viewValue);\n        syncValidatorsValid = syncValidatorsValid && result;\n        setValidity(name, result);\n      });\n      if (!syncValidatorsValid) {\n        forEach(ctrl.$asyncValidators, function(v, name) {\n          setValidity(name, null);\n        });\n        return false;\n      }\n      return true;\n    }\n\n    function processAsyncValidators() {\n      var validatorPromises = [];\n      var allValid = true;\n      forEach(ctrl.$asyncValidators, function(validator, name) {\n        var promise = validator(modelValue, viewValue);\n        if (!isPromiseLike(promise)) {\n          throw $ngModelMinErr(\"$asyncValidators\",\n            \"Expected asynchronous validator to return a promise but got '{0}' instead.\", promise);\n        }\n        setValidity(name, undefined);\n        validatorPromises.push(promise.then(function() {\n          setValidity(name, true);\n        }, function(error) {\n          allValid = false;\n          setValidity(name, false);\n        }));\n      });\n      if (!validatorPromises.length) {\n        validationDone(true);\n      } else {\n        $q.all(validatorPromises).then(function() {\n          validationDone(allValid);\n        }, noop);\n      }\n    }\n\n    function setValidity(name, isValid) {\n      if (localValidationRunId === currentValidationRunId) {\n        ctrl.$setValidity(name, isValid);\n      }\n    }\n\n    function validationDone(allValid) {\n      if (localValidationRunId === currentValidationRunId) {\n\n        doneCallback(allValid);\n      }\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  this.$commitViewValue = function() {\n    var viewValue = ctrl.$viewValue;\n\n    $timeout.cancel(pendingDebounce);\n\n    // If the view value has not changed then we should just exit, except in the case where there is\n    // a native validator on the element. In this case the validation state may have changed even though\n    // the viewValue has stayed empty.\n    if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) {\n      return;\n    }\n    ctrl.$$lastCommittedViewValue = viewValue;\n\n    // change to dirty\n    if (ctrl.$pristine) {\n      this.$setDirty();\n    }\n    this.$$parseAndValidate();\n  };\n\n  this.$$parseAndValidate = function() {\n    var viewValue = ctrl.$$lastCommittedViewValue;\n    var modelValue = viewValue;\n    parserValid = isUndefined(modelValue) ? undefined : true;\n\n    if (parserValid) {\n      for (var i = 0; i < ctrl.$parsers.length; i++) {\n        modelValue = ctrl.$parsers[i](modelValue);\n        if (isUndefined(modelValue)) {\n          parserValid = false;\n          break;\n        }\n      }\n    }\n    if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {\n      // ctrl.$modelValue has not been touched yet...\n      ctrl.$modelValue = ngModelGet($scope);\n    }\n    var prevModelValue = ctrl.$modelValue;\n    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;\n    ctrl.$$rawModelValue = modelValue;\n\n    if (allowInvalid) {\n      ctrl.$modelValue = modelValue;\n      writeToModelIfNeeded();\n    }\n\n    // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.\n    // This can happen if e.g. $setViewValue is called from inside a parser\n    ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {\n      if (!allowInvalid) {\n        // Note: Don't check ctrl.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        ctrl.$modelValue = allValid ? modelValue : undefined;\n        writeToModelIfNeeded();\n      }\n    });\n\n    function writeToModelIfNeeded() {\n      if (ctrl.$modelValue !== prevModelValue) {\n        ctrl.$$writeModelToScope();\n      }\n    }\n  };\n\n  this.$$writeModelToScope = function() {\n    ngModelSet($scope, ctrl.$modelValue);\n    forEach(ctrl.$viewChangeListeners, function(listener) {\n      try {\n        listener();\n      } catch (e) {\n        $exceptionHandler(e);\n      }\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when an input directive want to change the view value; typically,\n   * this is done from within a DOM event handler.\n   *\n   * For example {@link ng.directive:input input} calls it when the value of the input changes and\n   * {@link ng.directive:select select} calls it when an option is selected.\n   *\n   * If the new `value` is an object (rather than a string or a number), we should make a copy of the\n   * object before passing it to `$setViewValue`.  This is because `ngModel` does not perform a deep\n   * watch of objects, it only looks for a change of identity. If you only change the property of\n   * the object then ngModel will not realise that the object has changed and will not invoke the\n   * `$parsers` and `$validators` pipelines.\n   *\n   * For this reason, you should not change properties of the copy once it has been passed to\n   * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly.\n   *\n   * When this method is called, the new `value` will be staged for committing through the `$parsers`\n   * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged\n   * value sent directly for processing, finally to be applied to `$modelValue` and then the\n   * **expression** specified in the `ng-model` attribute.\n   *\n   * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   *\n   * Note that calling this function does not trigger a `$digest`.\n   *\n   * @param {string} value Value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  this.$setViewValue = function(value, trigger) {\n    ctrl.$viewValue = value;\n    if (!ctrl.$options || ctrl.$options.updateOnDefault) {\n      ctrl.$$debounceViewValueCommit(trigger);\n    }\n  };\n\n  this.$$debounceViewValueCommit = function(trigger) {\n    var debounceDelay = 0,\n        options = ctrl.$options,\n        debounce;\n\n    if (options && isDefined(options.debounce)) {\n      debounce = options.debounce;\n      if (isNumber(debounce)) {\n        debounceDelay = debounce;\n      } else if (isNumber(debounce[trigger])) {\n        debounceDelay = debounce[trigger];\n      } else if (isNumber(debounce['default'])) {\n        debounceDelay = debounce['default'];\n      }\n    }\n\n    $timeout.cancel(pendingDebounce);\n    if (debounceDelay) {\n      pendingDebounce = $timeout(function() {\n        ctrl.$commitViewValue();\n      }, debounceDelay);\n    } else if ($rootScope.$$phase) {\n      ctrl.$commitViewValue();\n    } else {\n      $scope.$apply(function() {\n        ctrl.$commitViewValue();\n      });\n    }\n  };\n\n  // model -> value\n  // Note: we cannot use a normal scope.$watch as we want to detect the following:\n  // 1. scope value is 'a'\n  // 2. user enters 'b'\n  // 3. ng-change kicks in and reverts scope value to 'a'\n  //    -> scope value did not change since the last digest as\n  //       ng-change executes in apply phase\n  // 4. view should be changed back to 'a'\n  $scope.$watch(function ngModelWatch() {\n    var modelValue = ngModelGet($scope);\n\n    // if scope model value and ngModel value are out of sync\n    // TODO(perf): why not move this to the action fn?\n    if (modelValue !== ctrl.$modelValue) {\n      ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;\n      parserValid = undefined;\n\n      var formatters = ctrl.$formatters,\n          idx = formatters.length;\n\n      var viewValue = modelValue;\n      while (idx--) {\n        viewValue = formatters[idx](viewValue);\n      }\n      if (ctrl.$viewValue !== viewValue) {\n        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;\n        ctrl.$render();\n\n        ctrl.$$runValidators(modelValue, viewValue, noop);\n      }\n    }\n\n    return modelValue;\n  });\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n *\n * @element input\n * @priority 1\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes)\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[datetime-local] datetime-local}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * # CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid`: the model is valid\n *  - `ng-invalid`: the model is invalid\n *  - `ng-valid-[key]`: for each valid key added by `$setValidity`\n *  - `ng-invalid-[key]`: for each invalid key added by `$setValidity`\n *  - `ng-pristine`: the control hasn't been interacted with yet\n *  - `ng-dirty`: the control has been interacted with\n *  - `ng-touched`: the control has been blurred\n *  - `ng-untouched`: the control hasn't been blurred\n *  - `ng-pending`: any `$asyncValidators` are unfulfilled\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * ## Animation Hooks\n *\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"inputExample\">\n     <file name=\"index.html\">\n       <script>\n        angular.module('inputExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.val = '1';\n          }]);\n       </script>\n       <style>\n         .my-input {\n           -webkit-transition:all linear 0.5s;\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       Update input to see transitions when valid/invalid.\n       Integer is a valid value.\n       <form name=\"testForm\" ng-controller=\"ExampleController\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\" />\n       </form>\n     </file>\n * </example>\n *\n * ## Binding to a getter/setter\n *\n * Sometimes it's helpful to bind `ngModel` to a getter/setter function.  A getter/setter is a\n * function that returns a representation of the model when called with zero arguments, and sets\n * the internal state of a model when called with an argument. It's sometimes useful to use this\n * for models that have an internal representation that's different than what the model exposes\n * to the view.\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more\n * frequently than other parts of your code.\n * </div>\n *\n * You use this behavior by adding `ng-model-options=\"{ getterSetter: true }\"` to an element that\n * has `ng-model` attached to it. You can also add `ng-model-options=\"{ getterSetter: true }\"` to\n * a `<form>`, which will enable this behavior for all `<input>`s within it. See\n * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.\n *\n * The following example shows how to use `ngModel` with a getter/setter:\n *\n * @example\n * <example name=\"ngModel-getter-setter\" module=\"getterSetterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <form name=\"userForm\">\n           Name:\n           <input type=\"text\" name=\"userName\"\n                  ng-model=\"user.name\"\n                  ng-model-options=\"{ getterSetter: true }\" />\n         </form>\n         <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n       </div>\n     </file>\n     <file name=\"app.js\">\n       angular.module('getterSetterExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var _name = 'Brian';\n           $scope.user = {\n             name: function(newName) {\n               if (angular.isDefined(newName)) {\n                 _name = newName;\n               }\n               return _name;\n             }\n           };\n         }]);\n     </file>\n * </example>\n */\nvar ngModelDirective = ['$rootScope', function($rootScope) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    // Prelink needs to run before any input directive\n    // so that we can set the NgModelOptions in NgModelController\n    // before anyone else uses it.\n    priority: 1,\n    compile: function ngModelCompile(element) {\n      // Setup initial state of the control\n      element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);\n\n      return {\n        pre: function ngModelPreLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0],\n              formCtrl = ctrls[1] || nullFormCtrl;\n\n          modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);\n\n          // notify others, especially parent forms\n          formCtrl.$addControl(modelCtrl);\n\n          attr.$observe('name', function(newValue) {\n            if (modelCtrl.$name !== newValue) {\n              formCtrl.$$renameControl(modelCtrl, newValue);\n            }\n          });\n\n          scope.$on('$destroy', function() {\n            formCtrl.$removeControl(modelCtrl);\n          });\n        },\n        post: function ngModelPostLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0];\n          if (modelCtrl.$options && modelCtrl.$options.updateOn) {\n            element.on(modelCtrl.$options.updateOn, function(ev) {\n              modelCtrl.$$debounceViewValueCommit(ev && ev.type);\n            });\n          }\n\n          element.on('blur', function(ev) {\n            if (modelCtrl.$touched) return;\n\n            if ($rootScope.$$phase) {\n              scope.$evalAsync(modelCtrl.$setTouched);\n            } else {\n              scope.$apply(modelCtrl.$setTouched);\n            }\n          });\n        }\n      };\n    }\n  };\n}];\n\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n *\n * @description\n * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of\n * events that will trigger a model update and/or a debouncing delay so that the actual update only\n * takes place when a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different than the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * `ngModelOptions` has an effect on the element it's declared on and its descendants.\n *\n * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:\n *   - `updateOn`: string specifying which event should the input be bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging of the control.\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     `ng-model-options=\"{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }\"`\n *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did\n *     not validate correctly instead of the default behavior of setting the model to undefined.\n *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to\n       `ngModel` as getters/setters.\n *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for\n *     `<input type=\"date\">`, `<input type=\"time\">`, ... . Right now, the only supported value is `'UTC'`,\n *     otherwise the default timezone of the browser will be used.\n *\n * @example\n\n  The following example shows how to override immediate updates. Changes on the inputs within the\n  form will update the model only when the control loses focus (blur event). If `escape` key is\n  pressed while the input field is focused, the value is reset to the value in the current model.\n\n  <example name=\"ngModelOptions-directive-blur\" module=\"optionsExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ updateOn: 'blur' }\"\n                 ng-keyup=\"cancel($event)\" /><br />\n\n          Other data:\n          <input type=\"text\" ng-model=\"user.data\" /><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('optionsExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.user = { name: 'say', data: '' };\n\n          $scope.cancel = function(e) {\n            if (e.keyCode == 27) {\n              $scope.userForm.userName.$rollbackViewValue();\n            }\n          };\n        }]);\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var model = element(by.binding('user.name'));\n      var input = element(by.model('user.name'));\n      var other = element(by.model('user.data'));\n\n      it('should allow custom events', function() {\n        input.sendKeys(' hello');\n        input.click();\n        expect(model.getText()).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say hello');\n      });\n\n      it('should $rollbackViewValue when model changes', function() {\n        input.sendKeys(' hello');\n        expect(input.getAttribute('value')).toEqual('say hello');\n        input.sendKeys(protractor.Key.ESCAPE);\n        expect(input.getAttribute('value')).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say');\n      });\n    </file>\n  </example>\n\n  This one shows how to debounce model changes. Model will be updated only 1 sec after last change.\n  If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n\n  <example name=\"ngModelOptions-directive-debounce\" module=\"optionsExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ debounce: 1000 }\" />\n          <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('optionsExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.user = { name: 'say' };\n        }]);\n    </file>\n  </example>\n\n  This one shows how to bind to getter/setters:\n\n  <example name=\"ngModelOptions-directive-getter-setter\" module=\"getterSetterExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ getterSetter: true }\" />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('getterSetterExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          var _name = 'Brian';\n          $scope.user = {\n            name: function(newName) {\n              return angular.isDefined(newName) ? (_name = newName) : _name;\n            }\n          };\n        }]);\n    </file>\n  </example>\n */\nvar ngModelOptionsDirective = function() {\n  return {\n    restrict: 'A',\n    controller: ['$scope', '$attrs', function($scope, $attrs) {\n      var that = this;\n      this.$options = $scope.$eval($attrs.ngModelOptions);\n      // Allow adding/overriding bound events\n      if (this.$options.updateOn !== undefined) {\n        this.$options.updateOnDefault = false;\n        // extract \"default\" pseudo-event from list of events that can trigger a model update\n        this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {\n          that.$options.updateOnDefault = true;\n          return ' ';\n        }));\n      } else {\n        this.$options.updateOnDefault = true;\n      }\n    }]\n  };\n};\n\n\n\n// helper methods\nfunction addSetValidityMethod(context) {\n  var ctrl = context.ctrl,\n      $element = context.$element,\n      classCache = {},\n      set = context.set,\n      unset = context.unset,\n      parentForm = context.parentForm,\n      $animate = context.$animate;\n\n  classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));\n\n  ctrl.$setValidity = setValidity;\n\n  function setValidity(validationErrorKey, state, controller) {\n    if (state === undefined) {\n      createAndSet('$pending', validationErrorKey, controller);\n    } else {\n      unsetAndCleanup('$pending', validationErrorKey, controller);\n    }\n    if (!isBoolean(state)) {\n      unset(ctrl.$error, validationErrorKey, controller);\n      unset(ctrl.$$success, validationErrorKey, controller);\n    } else {\n      if (state) {\n        unset(ctrl.$error, validationErrorKey, controller);\n        set(ctrl.$$success, validationErrorKey, controller);\n      } else {\n        set(ctrl.$error, validationErrorKey, controller);\n        unset(ctrl.$$success, validationErrorKey, controller);\n      }\n    }\n    if (ctrl.$pending) {\n      cachedToggleClass(PENDING_CLASS, true);\n      ctrl.$valid = ctrl.$invalid = undefined;\n      toggleValidationCss('', null);\n    } else {\n      cachedToggleClass(PENDING_CLASS, false);\n      ctrl.$valid = isObjectEmpty(ctrl.$error);\n      ctrl.$invalid = !ctrl.$valid;\n      toggleValidationCss('', ctrl.$valid);\n    }\n\n    // re-read the state as the set/unset methods could have\n    // combined state in ctrl.$error[validationError] (used for forms),\n    // where setting/unsetting only increments/decrements the value,\n    // and does not replace it.\n    var combinedState;\n    if (ctrl.$pending && ctrl.$pending[validationErrorKey]) {\n      combinedState = undefined;\n    } else if (ctrl.$error[validationErrorKey]) {\n      combinedState = false;\n    } else if (ctrl.$$success[validationErrorKey]) {\n      combinedState = true;\n    } else {\n      combinedState = null;\n    }\n\n    toggleValidationCss(validationErrorKey, combinedState);\n    parentForm.$setValidity(validationErrorKey, combinedState, ctrl);\n  }\n\n  function createAndSet(name, value, controller) {\n    if (!ctrl[name]) {\n      ctrl[name] = {};\n    }\n    set(ctrl[name], value, controller);\n  }\n\n  function unsetAndCleanup(name, value, controller) {\n    if (ctrl[name]) {\n      unset(ctrl[name], value, controller);\n    }\n    if (isObjectEmpty(ctrl[name])) {\n      ctrl[name] = undefined;\n    }\n  }\n\n  function cachedToggleClass(className, switchValue) {\n    if (switchValue && !classCache[className]) {\n      $animate.addClass($element, className);\n      classCache[className] = true;\n    } else if (!switchValue && classCache[className]) {\n      $animate.removeClass($element, className);\n      classCache[className] = false;\n    }\n  }\n\n  function toggleValidationCss(validationErrorKey, isValid) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n\n    cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true);\n    cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false);\n  }\n}\n\nfunction isObjectEmpty(obj) {\n  if (obj) {\n    for (var prop in obj) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <div>Normal: {{1 + 2}}</div>\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-non-bindable', function() {\n         expect(element(by.binding('1 + 2')).getText()).toContain('3');\n         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n       });\n      </file>\n    </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example module=\"pluralizeExample\">\n      <file name=\"index.html\">\n        <script>\n          angular.module('pluralizeExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.person1 = 'Igor';\n              $scope.person2 = 'Misko';\n              $scope.personCount = 1;\n            }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\n          Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\n          Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {\n  var BRACE = /{}/g,\n      IS_WHEN = /^when(Minus)?(.+)$/;\n\n  return {\n    restrict: 'EA',\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,\n          watchRemover = angular.noop,\n          lastCount;\n\n      forEach(attr, function(expression, attributeName) {\n        var tmpMatch = IS_WHEN.exec(attributeName);\n        if (tmpMatch) {\n          var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);\n          whens[whenKey] = element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));\n\n      });\n\n      scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {\n        var count = parseFloat(newVal);\n        var countIsNaN = isNaN(count);\n\n        if (!countIsNaN && !(count in whens)) {\n          // If an explicit number rule such as 1, 2, 3... is defined, just use it.\n          // Otherwise, check it against pluralization rules in $locale service.\n          count = $locale.pluralCat(count - offset);\n        }\n\n        // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.\n        // In JS `NaN !== NaN`, so we have to exlicitly check.\n        if ((count !== lastCount) && !(countIsNaN && isNaN(lastCount))) {\n          watchRemover();\n          watchRemover = scope.$watch(whensExpFns[count], updateElementText);\n          lastCount = count;\n        }\n      });\n\n      function updateElementText(newText) {\n        element.text(newText || '');\n      }\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n * This may be useful when, for instance, nesting ngRepeats.\n *\n * # Iterating over object properties\n *\n * It is possible to get `ngRepeat` to iterate over the properties of an object using the following\n * syntax:\n *\n * ```js\n * <div ng-repeat=\"(key, value) in myObj\"> ... </div>\n * ```\n *\n * You need to be aware that the JavaScript specification does not define what order\n * it will return the keys for an object. In order to have a guaranteed deterministic order\n * for the keys, Angular versions up to and including 1.3 **sort the keys alphabetically**.\n *\n * If this is not desired, the recommended workaround is to convert your object into an array\n * that is sorted into the order that you prefer before providing it to `ngRepeat`.  You could\n * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter)\n * or implement a `$watch` on the object yourself.\n *\n * In version 1.4 we will remove the sorting, since it seems that browsers generally follow the\n * strategy of providing keys in the order in which they were defined, although there are exceptions\n * when keys are deleted and reinstated.\n *\n *\n * # Tracking and Duplicates\n *\n * When the contents of the collection change, `ngRepeat` makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * By default, `ngRepeat` does not allow duplicate items in arrays. This is because when\n * there are duplicates, it is not possible to maintain a one-to-one mapping between collection\n * items and DOM elements.\n *\n * If you do need to repeat duplicate items, you can substitute the default tracking behavior\n * with your own using the `track by` expression.\n *\n * For example, you may track items by the index of each item in the collection, using the\n * special scope property `$index`:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by $index\">\n *      {{n}}\n *    </div>\n * ```\n *\n * You may use arbitrary expressions in `track by`, including references to custom functions\n * on the scope:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by myTrackingFunction(n)\">\n *      {{n}}\n *    </div>\n * ```\n *\n * If you are working with objects that have an identifier property, you can track\n * by the identifier instead of the whole object. Should you reload your data later, `ngRepeat`\n * will not have to rebuild the DOM elements for items it has already rendered, even if the\n * JavaScript objects in the collection have been substituted for new ones:\n * ```html\n *    <div ng-repeat=\"model in collection track by model.id\">\n *      {{model.name}}\n *    </div>\n * ```\n *\n * When no `track by` expression is provided, it is equivalent to tracking by the built-in\n * `$id` function, which tracks items by their identity:\n * ```html\n *    <div ng-repeat=\"obj in collection track by $id(obj)\">\n *      {{obj.prop}}\n *    </div>\n * ```\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * **.enter** - when a new item is added to the list or when an item is revealed after a filter\n *\n * **.leave** - when an item is removed from the list or when an item is filtered out\n *\n * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking expression\n *     is specified, ng-repeat associates elements by identity. It is an error to have\n *     more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)  If filters are used in the expression, they should be\n *     applied before the tracking expression.\n *\n *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n *     will be associated by item identity in the array.\n *\n *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n *     element in the same way in the DOM.\n *\n *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n *     property is same.\n *\n *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n *     to items in conjunction with a tracking expression.\n *\n *   * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the\n *     intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message\n *     when a filter is active on the repeater, but the filtered result set is empty.\n *\n *     For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after\n *     the items have been processed through the filter.\n *\n * @example\n * This example initializes the scope to a list of names and\n * then uses `ngRepeat` to display every person:\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-init=\"friends = [\n        {name:'John', age:25, gender:'boy'},\n        {name:'Jessie', age:30, gender:'girl'},\n        {name:'Johanna', age:28, gender:'girl'},\n        {name:'Joy', age:15, gender:'girl'},\n        {name:'Mary', age:28, gender:'girl'},\n        {name:'Peter', age:95, gender:'boy'},\n        {name:'Sebastian', age:50, gender:'boy'},\n        {name:'Erika', age:27, gender:'girl'},\n        {name:'Patrick', age:40, gender:'boy'},\n        {name:'Samantha', age:60, gender:'girl'}\n      ]\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q as results\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n          <li class=\"animate-repeat\" ng-if=\"results.length == 0\">\n            <strong>No results found...</strong>\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:40px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:40px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n\n  var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {\n    // TODO(perf): generate setters to shave off ~40ms or 1-1.5%\n    scope[valueIdentifier] = value;\n    if (keyIdentifier) scope[keyIdentifier] = key;\n    scope.$index = index;\n    scope.$first = (index === 0);\n    scope.$last = (index === (arrayLength - 1));\n    scope.$middle = !(scope.$first || scope.$last);\n    // jshint bitwise: false\n    scope.$odd = !(scope.$even = (index&1) === 0);\n    // jshint bitwise: true\n  };\n\n  var getBlockStart = function(block) {\n    return block.clone[0];\n  };\n\n  var getBlockEnd = function(block) {\n    return block.clone[block.clone.length - 1];\n  };\n\n\n  return {\n    restrict: 'A',\n    multiElement: true,\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    compile: function ngRepeatCompile($element, $attr) {\n      var expression = $attr.ngRepeat;\n      var ngRepeatEndComment = document.createComment(' end ngRepeat: ' + expression + ' ');\n\n      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n            expression);\n      }\n\n      var lhs = match[1];\n      var rhs = match[2];\n      var aliasAs = match[3];\n      var trackByExp = match[4];\n\n      match = lhs.match(/^(?:(\\s*[\\$\\w]+)|\\(\\s*([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\s*\\))$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iidexp', \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\n            lhs);\n      }\n      var valueIdentifier = match[3] || match[1];\n      var keyIdentifier = match[2];\n\n      if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||\n          /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(aliasAs))) {\n        throw ngRepeatMinErr('badident', \"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",\n          aliasAs);\n      }\n\n      var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;\n      var hashFnLocals = {$id: hashKey};\n\n      if (trackByExp) {\n        trackByExpGetter = $parse(trackByExp);\n      } else {\n        trackByIdArrayFn = function(key, value) {\n          return hashKey(value);\n        };\n        trackByIdObjFn = function(key) {\n          return key;\n        };\n      }\n\n      return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {\n\n        if (trackByExpGetter) {\n          trackByIdExpFn = function(key, value, index) {\n            // assign key, value, and $index to the locals so that they can be used in hash functions\n            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n            hashFnLocals[valueIdentifier] = value;\n            hashFnLocals.$index = index;\n            return trackByExpGetter($scope, hashFnLocals);\n          };\n        }\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - element: previous element.\n        //   - index: position\n        //\n        // We are using no-proto object so that we don't need to guard against inherited props via\n        // hasOwnProperty.\n        var lastBlockMap = createMap();\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection) {\n          var index, length,\n              previousNode = $element[0],     // node that cloned nodes should be inserted after\n                                              // initialized to the comment node anchor\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = createMap(),\n              collectionLength,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder,\n              elementsToRemove;\n\n          if (aliasAs) {\n            $scope[aliasAs] = collection;\n          }\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, sort them and use to determine order of iteration over obj props\n            collectionKeys = [];\n            for (var itemKey in collection) {\n              if (collection.hasOwnProperty(itemKey) && itemKey.charAt(0) != '$') {\n                collectionKeys.push(itemKey);\n              }\n            }\n            collectionKeys.sort();\n          }\n\n          collectionLength = collectionKeys.length;\n          nextBlockOrder = new Array(collectionLength);\n\n          // locate existing items\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            trackById = trackByIdFn(key, value, index);\n            if (lastBlockMap[trackById]) {\n              // found previously seen block\n              block = lastBlockMap[trackById];\n              delete lastBlockMap[trackById];\n              nextBlockMap[trackById] = block;\n              nextBlockOrder[index] = block;\n            } else if (nextBlockMap[trackById]) {\n              // if collision detected. restore lastBlockMap and throw an error\n              forEach(nextBlockOrder, function(block) {\n                if (block && block.scope) lastBlockMap[block.id] = block;\n              });\n              throw ngRepeatMinErr('dupes',\n                  \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",\n                  expression, trackById, value);\n            } else {\n              // new never before seen block\n              nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};\n              nextBlockMap[trackById] = true;\n            }\n          }\n\n          // remove leftover items\n          for (var blockKey in lastBlockMap) {\n            block = lastBlockMap[blockKey];\n            elementsToRemove = getBlockNodes(block.clone);\n            $animate.leave(elementsToRemove);\n            if (elementsToRemove[0].parentNode) {\n              // if the element was not removed yet because of pending animation, mark it as deleted\n              // so that we can ignore it later\n              for (index = 0, length = elementsToRemove.length; index < length; index++) {\n                elementsToRemove[index][NG_REMOVED] = true;\n              }\n            }\n            block.scope.$destroy();\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n\n              nextNode = previousNode;\n\n              // skip nodes that are already pending removal via leave animation\n              do {\n                nextNode = nextNode.nextSibling;\n              } while (nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) != nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockNodes(block.clone), null, jqLite(previousNode));\n              }\n              previousNode = getBlockEnd(block);\n              updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n            } else {\n              // new item which we don't know about\n              $transclude(function ngRepeatTransclude(clone, scope) {\n                block.scope = scope;\n                // http://jsperf.com/clone-vs-createcomment\n                var endNode = ngRepeatEndComment.cloneNode(false);\n                clone[clone.length++] = endNode;\n\n                // TODO(perf): support naked previousNode in `enter` to avoid creation of jqLite wrapper?\n                $animate.enter(clone, null, jqLite(previousNode));\n                previousNode = endNode;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n                updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n      };\n    }\n  };\n}];\n\nvar NG_HIDE_CLASS = 'ng-hide';\nvar NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n/**\n * @ngdoc directive\n * @name ngShow\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression\n * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding\n * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope\n * with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; this is just another form of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngShow`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass except that\n * you must also include the !important flag to override the display property\n * so that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   /&#42; this is required as of 1.3x to properly\n *      apply all styling in a show/hide animation &#42;/\n *   transition: 0s linear all;\n * }\n *\n * .my-element.ng-hide-add-active,\n * .my-element.ng-hide-remove-active {\n *   /&#42; the transition is defined in the active class &#42;/\n *   transition: 1s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * addClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a truthy value and the just before contents are set to visible\n * removeClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\n *     then the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-show\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-show\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-show {\n        line-height: 20px;\n        opacity: 1;\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n\n      .animate-show.ng-hide-add.ng-hide-add-active,\n      .animate-show.ng-hide-remove.ng-hide-remove-active {\n        -webkit-transition: all linear 0.5s;\n        transition: all linear 0.5s;\n      }\n\n      .animate-show.ng-hide {\n        line-height: 0;\n        opacity: 0;\n        padding: 0 10px;\n      }\n\n      .check-element {\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngShow, function ngShowWatchAction(value) {\n        // we're adding a temporary, animation-specific class for ng-hide since this way\n        // we can control when the element is actually displayed on screen without having\n        // to have a global/greedy CSS selector that breaks when other animations are run.\n        // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845\n        $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression\n * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class in CSS:\n *\n * ```css\n * .ng-hide {\n *   /&#42; this is just another form of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngHide`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`\n * CSS class is added and removed for you instead of your own CSS class.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: 0.5s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * removeClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden\n * addClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a non truthy value and just before the contents are set to visible\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\n *     the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-hide\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-hide\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-hide {\n        -webkit-transition: all linear 0.5s;\n        transition: all linear 0.5s;\n        line-height: 20px;\n        opacity: 1;\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n\n      .animate-hide.ng-hide {\n        line-height: 0;\n        opacity: 0;\n        padding: 0 10px;\n      }\n\n      .check-element {\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngHide, function ngHideWatchAction(value) {\n        // The comment inside of the ngShowDirective explains why we add and\n        // remove a temporary class for the show/hide animation\n        $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watchCollection(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\n    }\n    if (newStyles) element.css(newStyles);\n  });\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container\n * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 1200\n * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"switchExample\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <tt>selection={{selection}}</tt>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('switchExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.items = ['settings', 'home', 'other'];\n          $scope.selection = $scope.items[0];\n        }]);\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should select default', function() {\n        select.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'EA',\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function ngSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousLeaveAnimations = [],\n          selectedScopes = [];\n\n      var spliceFactory = function(array, index) {\n          return function() { array.splice(index, 1); };\n      };\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n        for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) {\n          $animate.cancel(previousLeaveAnimations[i]);\n        }\n        previousLeaveAnimations.length = 0;\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = getBlockNodes(selectedElements[i].clone);\n          selectedScopes[i].$destroy();\n          var promise = previousLeaveAnimations[i] = $animate.leave(selected);\n          promise.then(spliceFactory(previousLeaveAnimations, i));\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            selectedTransclude.transclude(function(caseElement, selectedScope) {\n              selectedScopes.push(selectedScope);\n              var anchor = selectedTransclude.element;\n              caseElement[caseElement.length++] = document.createComment(' end ngSwitchWhen: ');\n              var block = { clone: caseElement };\n\n              selectedElements.push(block);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attrs, ctrl, $transclude) {\n    ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);\n    ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict EAC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.\n *\n * @element ANY\n *\n * @example\n   <example module=\"transcludeExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('transcludeExample', [])\n          .directive('pane', function(){\n             return {\n               restrict: 'E',\n               transclude: true,\n               scope: { title:'@' },\n               template: '<div style=\"border: 1px solid black;\">' +\n                           '<div style=\"background-color: gray\">{{title}}</div>' +\n                           '<ng-transclude></ng-transclude>' +\n                         '</div>'\n             };\n         })\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.title = 'Lorem Ipsum';\n           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n         }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input ng-model=\"title\"> <br/>\n         <textarea ng-model=\"text\"></textarea> <br/>\n         <pane title=\"{{title}}\">{{text}}</pane>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        it('should have transcluded', function() {\n          var titleElement = element(by.model('title'));\n          titleElement.clear();\n          titleElement.sendKeys('TITLE');\n          var textElement = element(by.model('text'));\n          textElement.clear();\n          textElement.sendKeys('TEXT');\n          expect(element(by.binding('title')).getText()).toEqual('TITLE');\n          expect(element(by.binding('text')).getText()).toEqual('TEXT');\n        });\n     </file>\n   </example>\n *\n */\nvar ngTranscludeDirective = ngDirective({\n  restrict: 'EAC',\n  link: function($scope, $element, $attrs, controller, $transclude) {\n    if (!$transclude) {\n      throw minErr('ngTransclude')('orphan',\n       'Illegal use of ngTransclude directive in the template! ' +\n       'No parent directive that requires a transclusion found. ' +\n       'Element: {0}',\n       startingTag($element));\n    }\n\n    $transclude(function(clone) {\n      $element.empty();\n      $element.append(clone);\n    });\n  }\n});\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example>\n    <file name=\"index.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type == 'text/ng-template') {\n        var templateUrl = attr.id,\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\nvar ngOptionsMinErr = minErr('ngOptions');\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `SELECT` element with angular data-binding.\n *\n * # `ngOptions`\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension expression.\n *\n * In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a\n * similar result. However, `ngOptions` provides some benefits such as reducing memory and\n * increasing speed by not creating a new scope for each repeated instance, as well as providing\n * more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression. `ngOptions` should be used when the `<select>` model needs to be bound\n *  to a non-string value. This is because an option element can only be bound to string values at\n * present.\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `ngModel` compares by reference, not value. This is important when binding to an\n * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).\n * </div>\n *\n * ## `select` **`as`**\n *\n * Using `select` **`as`** will bind the result of the `select` expression to the model, but\n * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)\n * or property name (for object data sources) of the value within the collection. If a **`track by`** expression\n * is used, the result of that expression will be set as the value of the `option` and `select` elements.\n *\n *\n * ### `select` **`as`** and **`track by`**\n *\n * <div class=\"alert alert-warning\">\n * Do not use `select` **`as`** and **`track by`** in the same expression. They are not designed to work together.\n * </div>\n *\n * Consider the following example:\n *\n * ```html\n * <select ng-options=\"item.subItem as item.label for item in values track by item.id\" ng-model=\"selected\">\n * ```\n *\n * ```js\n * $scope.values = [{\n *   id: 1,\n *   label: 'aLabel',\n *   subItem: { name: 'aSubItem' }\n * }, {\n *   id: 2,\n *   label: 'bLabel',\n *   subItem: { name: 'bSubItem' }\n * }];\n *\n * $scope.selected = { name: 'aSubItem' };\n * ```\n *\n * With the purpose of preserving the selection, the **`track by`** expression is always applied to the element\n * of the data source (to `item` in this example). To calculate whether an element is selected, we do the\n * following:\n *\n * 1. Apply **`track by`** to the elements in the array. In the example: `[1, 2]`\n * 2. Apply **`track by`** to the already selected value in `ngModel`.\n *    In the example: this is not possible as **`track by`** refers to `item.id`, but the selected\n *    value from `ngModel` is `{name: 'aSubItem'}`, so the **`track by`** expression is applied to\n *    a wrong object, the selected element can't be found, `<select>` is always reset to the \"not\n *    selected\" option.\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {comprehension_expression=} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`\n *        (for including a filter with `track by`)\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`). With this the selection is preserved\n *      even when the options are recreated (e.g. reloaded from the server).\n *\n * @example\n    <example module=\"selectExample\">\n      <file name=\"index.html\">\n        <script>\n        angular.module('selectExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.colors = [\n              {name:'black', shade:'dark'},\n              {name:'white', shade:'light'},\n              {name:'red', shade:'dark'},\n              {name:'blue', shade:'dark'},\n              {name:'yellow', shade:'light'}\n            ];\n            $scope.myColor = $scope.colors[2]; // red\n          }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              Name: <input ng-model=\"color.name\">\n              [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\n            </li>\n            <li>\n              [<a href ng-click=\"colors.push({})\">add</a>]\n            </li>\n          </ul>\n          <hr/>\n          Color (null not allowed):\n          <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select><br>\n\n          Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span><br/>\n\n          Color grouped by shade:\n          <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n          </select><br/>\n\n\n          Select <a href ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</a>.<br>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor} }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.model('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\nvar ngOptionsDirective = valueFn({\n  restrict: 'A',\n  terminal: true\n});\n\n// jshint maxlen: false\nvar selectDirective = ['$compile', '$parse', function($compile,   $parse) {\n                         //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888\n  var NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,\n      nullModelCtrl = {$setViewValue: noop};\n// jshint maxlen: 100\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {\n      var self = this,\n          optionsMap = {},\n          ngModelCtrl = nullModelCtrl,\n          nullOption,\n          unknownOption;\n\n\n      self.databound = $attrs.ngModel;\n\n\n      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {\n        ngModelCtrl = ngModelCtrl_;\n        nullOption = nullOption_;\n        unknownOption = unknownOption_;\n      };\n\n\n      self.addOption = function(value, element) {\n        assertNotHasOwnProperty(value, '\"option value\"');\n        optionsMap[value] = true;\n\n        if (ngModelCtrl.$viewValue == value) {\n          $element.val(value);\n          if (unknownOption.parent()) unknownOption.remove();\n        }\n        // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459\n        // Adding an <option selected=\"selected\"> element to a <select required=\"required\"> should\n        // automatically select the new element\n        if (element && element[0].hasAttribute('selected')) {\n          element[0].selected = true;\n        }\n      };\n\n\n      self.removeOption = function(value) {\n        if (this.hasOption(value)) {\n          delete optionsMap[value];\n          if (ngModelCtrl.$viewValue === value) {\n            this.renderUnknownOption(value);\n          }\n        }\n      };\n\n\n      self.renderUnknownOption = function(val) {\n        var unknownVal = '? ' + hashKey(val) + ' ?';\n        unknownOption.val(unknownVal);\n        $element.prepend(unknownOption);\n        $element.val(unknownVal);\n        unknownOption.prop('selected', true); // needed for IE\n      };\n\n\n      self.hasOption = function(value) {\n        return optionsMap.hasOwnProperty(value);\n      };\n\n      $scope.$on('$destroy', function() {\n        // disable unknown option so that we don't do work when the whole select is being destroyed\n        self.renderUnknownOption = noop;\n      });\n    }],\n\n    link: function(scope, element, attr, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      if (!ctrls[1]) return;\n\n      var selectCtrl = ctrls[0],\n          ngModelCtrl = ctrls[1],\n          multiple = attr.multiple,\n          optionsExp = attr.ngOptions,\n          nullOption = false, // if false, user will not be able to select it (used by ngOptions)\n          emptyOption,\n          renderScheduled = false,\n          // we can't just jqLite('<option>') since jqLite is not smart enough\n          // to create it in <select> and IE barfs otherwise.\n          optionTemplate = jqLite(document.createElement('option')),\n          optGroupTemplate =jqLite(document.createElement('optgroup')),\n          unknownOption = optionTemplate.clone();\n\n      // find \"null\" option\n      for (var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          emptyOption = nullOption = children.eq(i);\n          break;\n        }\n      }\n\n      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);\n\n      // required validator\n      if (multiple) {\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n      }\n\n      if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);\n      else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);\n      else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);\n\n\n      ////////////////////////////\n\n\n\n      function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {\n        ngModelCtrl.$render = function() {\n          var viewValue = ngModelCtrl.$viewValue;\n\n          if (selectCtrl.hasOption(viewValue)) {\n            if (unknownOption.parent()) unknownOption.remove();\n            selectElement.val(viewValue);\n            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\n          } else {\n            if (isUndefined(viewValue) && emptyOption) {\n              selectElement.val('');\n            } else {\n              selectCtrl.renderUnknownOption(viewValue);\n            }\n          }\n        };\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            if (unknownOption.parent()) unknownOption.remove();\n            ngModelCtrl.$setViewValue(selectElement.val());\n          });\n        });\n      }\n\n      function setupAsMultiple(scope, selectElement, ctrl) {\n        var lastView;\n        ctrl.$render = function() {\n          var items = new HashMap(ctrl.$viewValue);\n          forEach(selectElement.find('option'), function(option) {\n            option.selected = isDefined(items.get(option.value));\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        scope.$watch(function selectMultipleWatch() {\n          if (!equals(lastView, ctrl.$viewValue)) {\n            lastView = shallowCopy(ctrl.$viewValue);\n            ctrl.$render();\n          }\n        });\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            var array = [];\n            forEach(selectElement.find('option'), function(option) {\n              if (option.selected) {\n                array.push(option.value);\n              }\n            });\n            ctrl.$setViewValue(array);\n          });\n        });\n      }\n\n      function setupAsOptions(scope, selectElement, ctrl) {\n        var match;\n\n        if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {\n          throw ngOptionsMinErr('iexp',\n            \"Expected expression in form of \" +\n            \"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\n            \" but got '{0}'. Element: {1}\",\n            optionsExp, startingTag(selectElement));\n        }\n\n        var displayFn = $parse(match[2] || match[1]),\n            valueName = match[4] || match[6],\n            selectAs = / as /.test(match[0]) && match[1],\n            selectAsFn = selectAs ? $parse(selectAs) : null,\n            keyName = match[5],\n            groupByFn = $parse(match[3] || ''),\n            valueFn = $parse(match[2] ? match[1] : valueName),\n            valuesFn = $parse(match[7]),\n            track = match[8],\n            trackFn = track ? $parse(match[8]) : null,\n            trackKeysCache = {},\n            // This is an array of array of existing option groups in DOM.\n            // We try to reuse these if possible\n            // - optionGroupsCache[0] is the options with no option group\n            // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\n            optionGroupsCache = [[{element: selectElement, label:''}]],\n            //re-usable object to represent option's locals\n            locals = {};\n\n        if (nullOption) {\n          // compile the element since there might be bindings in it\n          $compile(nullOption)(scope);\n\n          // remove the class, which is added automatically because we recompile the element and it\n          // becomes the compilation root\n          nullOption.removeClass('ng-scope');\n\n          // we need to remove it before calling selectElement.empty() because otherwise IE will\n          // remove the label from the element. wtf?\n          nullOption.remove();\n        }\n\n        // clear contents, we'll add what's needed based on the model\n        selectElement.empty();\n\n        selectElement.on('change', selectionChanged);\n\n        ctrl.$render = render;\n\n        scope.$watchCollection(valuesFn, scheduleRendering);\n        scope.$watchCollection(getLabels, scheduleRendering);\n\n        if (multiple) {\n          scope.$watchCollection(function() { return ctrl.$modelValue; }, scheduleRendering);\n        }\n\n        // ------------------------------------------------------------------ //\n\n        function callExpression(exprFn, key, value) {\n          locals[valueName] = value;\n          if (keyName) locals[keyName] = key;\n          return exprFn(scope, locals);\n        }\n\n        function selectionChanged() {\n          scope.$apply(function() {\n            var collection = valuesFn(scope) || [];\n            var viewValue;\n            if (multiple) {\n              viewValue = [];\n              forEach(selectElement.val(), function(selectedKey) {\n                  selectedKey = trackFn ? trackKeysCache[selectedKey] : selectedKey;\n                viewValue.push(getViewValue(selectedKey, collection[selectedKey]));\n              });\n            } else {\n              var selectedKey = trackFn ? trackKeysCache[selectElement.val()] : selectElement.val();\n              viewValue = getViewValue(selectedKey, collection[selectedKey]);\n            }\n            ctrl.$setViewValue(viewValue);\n            render();\n          });\n        }\n\n        function getViewValue(key, value) {\n          if (key === '?') {\n            return undefined;\n          } else if (key === '') {\n            return null;\n          } else {\n            var viewValueFn = selectAsFn ? selectAsFn : valueFn;\n            return callExpression(viewValueFn, key, value);\n          }\n        }\n\n        function getLabels() {\n          var values = valuesFn(scope);\n          var toDisplay;\n          if (values && isArray(values)) {\n            toDisplay = new Array(values.length);\n            for (var i = 0, ii = values.length; i < ii; i++) {\n              toDisplay[i] = callExpression(displayFn, i, values[i]);\n            }\n            return toDisplay;\n          } else if (values) {\n            // TODO: Add a test for this case\n            toDisplay = {};\n            for (var prop in values) {\n              if (values.hasOwnProperty(prop)) {\n                toDisplay[prop] = callExpression(displayFn, prop, values[prop]);\n              }\n            }\n          }\n          return toDisplay;\n        }\n\n        function createIsSelectedFn(viewValue) {\n          var selectedSet;\n          if (multiple) {\n            if (trackFn && isArray(viewValue)) {\n\n              selectedSet = new HashMap([]);\n              for (var trackIndex = 0; trackIndex < viewValue.length; trackIndex++) {\n                // tracking by key\n                selectedSet.put(callExpression(trackFn, null, viewValue[trackIndex]), true);\n              }\n            } else {\n              selectedSet = new HashMap(viewValue);\n            }\n          } else if (trackFn) {\n            viewValue = callExpression(trackFn, null, viewValue);\n          }\n\n          return function isSelected(key, value) {\n            var compareValueFn;\n            if (trackFn) {\n              compareValueFn = trackFn;\n            } else if (selectAsFn) {\n              compareValueFn = selectAsFn;\n            } else {\n              compareValueFn = valueFn;\n            }\n\n            if (multiple) {\n              return isDefined(selectedSet.remove(callExpression(compareValueFn, key, value)));\n            } else {\n              return viewValue === callExpression(compareValueFn, key, value);\n            }\n          };\n        }\n\n        function scheduleRendering() {\n          if (!renderScheduled) {\n            scope.$$postDigest(render);\n            renderScheduled = true;\n          }\n        }\n\n        /**\n         * A new labelMap is created with each render.\n         * This function is called for each existing option with added=false,\n         * and each new option with added=true.\n         * - Labels that are passed to this method twice,\n         * (once with added=true and once with added=false) will end up with a value of 0, and\n         * will cause no change to happen to the corresponding option.\n         * - Labels that are passed to this method only once with added=false will end up with a\n         * value of -1 and will eventually be passed to selectCtrl.removeOption()\n         * - Labels that are passed to this method only once with added=true will end up with a\n         * value of 1 and will eventually be passed to selectCtrl.addOption()\n        */\n        function updateLabelMap(labelMap, label, added) {\n          labelMap[label] = labelMap[label] || 0;\n          labelMap[label] += (added ? 1 : -1);\n        }\n\n        function render() {\n          renderScheduled = false;\n\n          // Temporary location for the option groups before we render them\n          var optionGroups = {'':[]},\n              optionGroupNames = [''],\n              optionGroupName,\n              optionGroup,\n              option,\n              existingParent, existingOptions, existingOption,\n              viewValue = ctrl.$viewValue,\n              values = valuesFn(scope) || [],\n              keys = keyName ? sortedKeys(values) : values,\n              key,\n              value,\n              groupLength, length,\n              groupIndex, index,\n              labelMap = {},\n              selected,\n              isSelected = createIsSelectedFn(viewValue),\n              anySelected = false,\n              lastElement,\n              element,\n              label,\n              optionId;\n\n          trackKeysCache = {};\n\n          // We now build up the list of options we need (we merge later)\n          for (index = 0; length = keys.length, index < length; index++) {\n            key = index;\n            if (keyName) {\n              key = keys[index];\n              if (key.charAt(0) === '$') continue;\n            }\n            value = values[key];\n\n            optionGroupName = callExpression(groupByFn, key, value) || '';\n            if (!(optionGroup = optionGroups[optionGroupName])) {\n              optionGroup = optionGroups[optionGroupName] = [];\n              optionGroupNames.push(optionGroupName);\n            }\n\n            selected = isSelected(key, value);\n            anySelected = anySelected || selected;\n\n            label = callExpression(displayFn, key, value); // what will be seen by the user\n\n            // doing displayFn(scope, locals) || '' overwrites zero values\n            label = isDefined(label) ? label : '';\n            optionId = trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index);\n            if (trackFn) {\n              trackKeysCache[optionId] = key;\n            }\n\n            optionGroup.push({\n              // either the index into array or key from object\n              id: optionId,\n              label: label,\n              selected: selected                   // determine if we should be selected\n            });\n          }\n          if (!multiple) {\n            if (nullOption || viewValue === null) {\n              // insert null option if we have a placeholder, or the model is null\n              optionGroups[''].unshift({id:'', label:'', selected:!anySelected});\n            } else if (!anySelected) {\n              // option could not be found, we have to insert the undefined item\n              optionGroups[''].unshift({id:'?', label:'', selected:true});\n            }\n          }\n\n          // Now we need to update the list of DOM nodes to match the optionGroups we computed above\n          for (groupIndex = 0, groupLength = optionGroupNames.length;\n               groupIndex < groupLength;\n               groupIndex++) {\n            // current option group name or '' if no group\n            optionGroupName = optionGroupNames[groupIndex];\n\n            // list of options for that group. (first item has the parent)\n            optionGroup = optionGroups[optionGroupName];\n\n            if (optionGroupsCache.length <= groupIndex) {\n              // we need to grow the optionGroups\n              existingParent = {\n                element: optGroupTemplate.clone().attr('label', optionGroupName),\n                label: optionGroup.label\n              };\n              existingOptions = [existingParent];\n              optionGroupsCache.push(existingOptions);\n              selectElement.append(existingParent.element);\n            } else {\n              existingOptions = optionGroupsCache[groupIndex];\n              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element\n\n              // update the OPTGROUP label if not the same.\n              if (existingParent.label != optionGroupName) {\n                existingParent.element.attr('label', existingParent.label = optionGroupName);\n              }\n            }\n\n            lastElement = null;  // start at the beginning\n            for (index = 0, length = optionGroup.length; index < length; index++) {\n              option = optionGroup[index];\n              if ((existingOption = existingOptions[index + 1])) {\n                // reuse elements\n                lastElement = existingOption.element;\n                if (existingOption.label !== option.label) {\n                  updateLabelMap(labelMap, existingOption.label, false);\n                  updateLabelMap(labelMap, option.label, true);\n                  lastElement.text(existingOption.label = option.label);\n                  lastElement.prop('label', existingOption.label);\n                }\n                if (existingOption.id !== option.id) {\n                  lastElement.val(existingOption.id = option.id);\n                }\n                // lastElement.prop('selected') provided by jQuery has side-effects\n                if (lastElement[0].selected !== option.selected) {\n                  lastElement.prop('selected', (existingOption.selected = option.selected));\n                  if (msie) {\n                    // See #7692\n                    // The selected item wouldn't visually update on IE without this.\n                    // Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well\n                    lastElement.prop('selected', existingOption.selected);\n                  }\n                }\n              } else {\n                // grow elements\n\n                // if it's a null option\n                if (option.id === '' && nullOption) {\n                  // put back the pre-compiled element\n                  element = nullOption;\n                } else {\n                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\n                  // in this version of jQuery on some browser the .text() returns a string\n                  // rather then the element.\n                  (element = optionTemplate.clone())\n                      .val(option.id)\n                      .prop('selected', option.selected)\n                      .attr('selected', option.selected)\n                      .prop('label', option.label)\n                      .text(option.label);\n                }\n\n                existingOptions.push(existingOption = {\n                    element: element,\n                    label: option.label,\n                    id: option.id,\n                    selected: option.selected\n                });\n                updateLabelMap(labelMap, option.label, true);\n                if (lastElement) {\n                  lastElement.after(element);\n                } else {\n                  existingParent.element.append(element);\n                }\n                lastElement = element;\n              }\n            }\n            // remove any excessive OPTIONs in a group\n            index++; // increment since the existingOptions[0] is parent element not OPTION\n            while (existingOptions.length > index) {\n              option = existingOptions.pop();\n              updateLabelMap(labelMap, option.label, false);\n              option.element.remove();\n            }\n          }\n          // remove any excessive OPTGROUPs from select\n          while (optionGroupsCache.length > groupIndex) {\n            // remove all the labels in the option group\n            optionGroup = optionGroupsCache.pop();\n            for (index = 1; index < optionGroup.length; ++index) {\n              updateLabelMap(labelMap, optionGroup[index].label, false);\n            }\n            optionGroup[0].element.remove();\n          }\n          forEach(labelMap, function(count, label) {\n            if (count > 0) {\n              selectCtrl.addOption(label);\n            } else if (count < 0) {\n              selectCtrl.removeOption(label);\n            }\n          });\n        }\n      }\n    }\n  };\n}];\n\nvar optionDirective = ['$interpolate', function($interpolate) {\n  var nullSelectCtrl = {\n    addOption: noop,\n    removeOption: noop\n  };\n\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      if (isUndefined(attr.value)) {\n        var interpolateFn = $interpolate(element.text(), true);\n        if (!interpolateFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function(scope, element, attr) {\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (!selectCtrl || !selectCtrl.databound) {\n          selectCtrl = nullSelectCtrl;\n        }\n\n        if (interpolateFn) {\n          scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {\n            attr.$set('value', newVal);\n            if (oldVal !== newVal) {\n              selectCtrl.removeOption(oldVal);\n            }\n            selectCtrl.addOption(newVal, element);\n          });\n        } else {\n          selectCtrl.addOption(attr.value, element);\n        }\n\n        element.on('$destroy', function() {\n          selectCtrl.removeOption(attr.value);\n        });\n      };\n    }\n  };\n}];\n\nvar styleDirective = valueFn({\n  restrict: 'E',\n  terminal: false\n});\n\nvar requiredDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      attr.required = true; // force truthy in case we are on non input element\n\n      ctrl.$validators.required = function(modelValue, viewValue) {\n        return !attr.required || !ctrl.$isEmpty(viewValue);\n      };\n\n      attr.$observe('required', function() {\n        ctrl.$validate();\n      });\n    }\n  };\n};\n\n\nvar patternDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var regexp, patternExp = attr.ngPattern || attr.pattern;\n      attr.$observe('pattern', function(regex) {\n        if (isString(regex) && regex.length > 0) {\n          regex = new RegExp('^' + regex + '$');\n        }\n\n        if (regex && !regex.test) {\n          throw minErr('ngPattern')('noregexp',\n            'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,\n            regex, startingTag(elm));\n        }\n\n        regexp = regex || undefined;\n        ctrl.$validate();\n      });\n\n      ctrl.$validators.pattern = function(value) {\n        return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value);\n      };\n    }\n  };\n};\n\n\nvar maxlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var maxlength = -1;\n      attr.$observe('maxlength', function(value) {\n        var intVal = int(value);\n        maxlength = isNaN(intVal) ? -1 : intVal;\n        ctrl.$validate();\n      });\n      ctrl.$validators.maxlength = function(modelValue, viewValue) {\n        return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);\n      };\n    }\n  };\n};\n\nvar minlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var minlength = 0;\n      attr.$observe('minlength', function(value) {\n        minlength = int(value) || 0;\n        ctrl.$validate();\n      });\n      ctrl.$validators.minlength = function(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;\n      };\n    }\n  };\n};\n\n  if (window.angular.bootstrap) {\n    //AngularJS is already loaded, so we can return here...\n    console.log('WARNING: Tried to load angular more than once.');\n    return;\n  }\n\n  //try to bind to jquery now so that one can write jqLite(document).ready()\n  //but we will rebind on bootstrap again.\n  bindJQuery();\n\n  publishExternalAPI(angular);\n\n  jqLite(document).ready(function() {\n    angularInit(document, bootstrap);\n  });\n\n})(window, document);\n\n!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}</style>');"
  },
  {
    "path": "third_party/ui/bower_components/angular/bower.json",
    "content": "{\n  \"name\": \"angular\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular/index.js",
    "content": "require('./angular');\nmodule.exports = angular;\n"
  },
  {
    "path": "third_party/ui/bower_components/angular/package.json",
    "content": "{\n  \"name\": \"angular\",\n  \"version\": \"1.3.15\",\n  \"description\": \"HTML enhanced for web apps\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/.bower.json",
    "content": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-animate.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  },\n  \"homepage\": \"https://github.com/angular/bower-angular-animate\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"30fb369974560dbeb8a5311861c124e094944dab\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular-animate.git\",\n  \"_target\": \"1.3.x\",\n  \"_originalSource\": \"angular-animate\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/README.md",
    "content": "# packaged angular-animate\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-animate\n```\n\nThen add `ngAnimate` as a dependency for your app:\n\n```javascript\nangular.module('myApp', [require('angular-animate')]);\n```\n\n### bower\n\n```shell\nbower install angular-animate\n```\n\nThen add a `<script>` to your `index.html`:\n\n```html\n<script src=\"/bower_components/angular-animate/angular-animate.js\"></script>\n```\n\nThen add `ngAnimate` as a dependency for your app:\n\n```javascript\nangular.module('myApp', ['ngAnimate']);\n```\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/angular-animate.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/* jshint maxlen: false */\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.\n *\n * <div doc-module-components=\"ngAnimate\"></div>\n *\n * # Usage\n *\n * To see animations in action, all that is required is to define the appropriate CSS classes\n * or to register a JavaScript animation via the `myModule.animation()` function. The directives that support animation automatically are:\n * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation\n * by using the `$animate` service.\n *\n * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives:\n *\n * | Directive                                                                                                | Supported Animations                                                     |\n * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|\n * | {@link ng.directive:ngRepeat#animations ngRepeat}                                                        | enter, leave and move                                                    |\n * | {@link ngRoute.directive:ngView#animations ngView}                                                       | enter and leave                                                          |\n * | {@link ng.directive:ngInclude#animations ngInclude}                                                      | enter and leave                                                          |\n * | {@link ng.directive:ngSwitch#animations ngSwitch}                                                        | enter and leave                                                          |\n * | {@link ng.directive:ngIf#animations ngIf}                                                                | enter and leave                                                          |\n * | {@link ng.directive:ngClass#animations ngClass}                                                          | add and remove (the CSS class(es) present)                               |\n * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide}            | add and remove (the ng-hide class value)                                 |\n * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel}    | add and remove (dirty, pristine, valid, invalid & all other validations) |\n * | {@link module:ngMessages#animations ngMessages}                                                          | add and remove (ng-active & ng-inactive)                                 |\n * | {@link module:ngMessages#animations ngMessage}                                                           | enter and leave                                                          |\n *\n * You can find out more information about animations upon visiting each directive page.\n *\n * Below is an example of how to apply animations to a directive that supports animation hooks:\n *\n * ```html\n * <style type=\"text/css\">\n * .slide.ng-enter, .slide.ng-leave {\n *   -webkit-transition:0.5s linear all;\n *   transition:0.5s linear all;\n * }\n *\n * .slide.ng-enter { }        /&#42; starting animations for enter &#42;/\n * .slide.ng-enter.ng-enter-active { } /&#42; terminal animations for enter &#42;/\n * .slide.ng-leave { }        /&#42; starting animations for leave &#42;/\n * .slide.ng-leave.ng-leave-active { } /&#42; terminal animations for leave &#42;/\n * </style>\n *\n * <!--\n * the animate service will automatically add .ng-enter and .ng-leave to the element\n * to trigger the CSS transition/animations\n * -->\n * <ANY class=\"slide\" ng-include=\"...\"></ANY>\n * ```\n *\n * Keep in mind that, by default, if an animation is running, any child elements cannot be animated\n * until the parent element's animation has completed. This blocking feature can be overridden by\n * placing the `ng-animate-children` attribute on a parent container tag.\n *\n * ```html\n * <div class=\"slide-animation\" ng-if=\"on\" ng-animate-children>\n *   <div class=\"fade-animation\" ng-if=\"on\">\n *     <div class=\"explode-animation\" ng-if=\"on\">\n *        ...\n *     </div>\n *   </div>\n * </div>\n * ```\n *\n * When the `on` expression value changes and an animation is triggered then each of the elements within\n * will all animate without the block being applied to child elements.\n *\n * ## Are animations run when the application starts?\n * No they are not. When an application is bootstrapped Angular will disable animations from running to avoid\n * a frenzy of animations from being triggered as soon as the browser has rendered the screen. For this to work,\n * Angular will wait for two digest cycles until enabling animations. From there on, any animation-triggering\n * layout changes in the application will trigger animations as normal.\n *\n * In addition, upon bootstrap, if the routing system or any directives or load remote data (via $http) then Angular\n * will automatically extend the wait time to enable animations once **all** of the outbound HTTP requests\n * are complete.\n *\n * ## CSS-defined Animations\n * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes\n * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported\n * and can be used to play along with this naming structure.\n *\n * The following code below demonstrates how to perform animations using **CSS transitions** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * /&#42;\n *  The animate class is apart of the element and the ng-enter class\n *  is attached to the element once the enter animation event is triggered\n * &#42;/\n * .reveal-animation.ng-enter {\n *  -webkit-transition: 1s linear all; /&#42; Safari/Chrome &#42;/\n *  transition: 1s linear all; /&#42; All other modern browsers and IE10+ &#42;/\n *\n *  /&#42; The animation preparation code &#42;/\n *  opacity: 0;\n * }\n *\n * /&#42;\n *  Keep in mind that you want to combine both CSS\n *  classes together to avoid any CSS-specificity\n *  conflicts\n * &#42;/\n * .reveal-animation.ng-enter.ng-enter-active {\n *  /&#42; The animation code itself &#42;/\n *  opacity: 1;\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * The following code below demonstrates how to perform animations using **CSS animations** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * .reveal-animation.ng-enter {\n *   -webkit-animation: enter_sequence 1s linear; /&#42; Safari/Chrome &#42;/\n *   animation: enter_sequence 1s linear; /&#42; IE10+ and Future Browsers &#42;/\n * }\n * @-webkit-keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * @keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.\n *\n * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add\n * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically\n * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be\n * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end\n * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element\n * has no CSS transition/animation classes applied to it.\n *\n * ### Structural transition animations\n *\n * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition\n * value to force the browser into rendering the styles defined in the setup (`.ng-enter`, `.ng-leave`\n * or `.ng-move`) class. This means that any active transition animations operating on the element\n * will be cut off to make way for the enter, leave or move animation.\n *\n * ### Class-based transition animations\n *\n * Class-based transitions refer to transition animations that are triggered when a CSS class is\n * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`,\n * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`).\n * They are different when compared to structural animations since they **do not cancel existing\n * animations** nor do they **block successive transitions** from rendering on the same element.\n * This distinction allows for **multiple class-based transitions** to be performed on the same element.\n *\n * In addition to ngAnimate supporting the default (natural) functionality of class-based transition\n * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the\n * developer in further styling the element throughout the transition animation. Earlier versions\n * of ngAnimate may have caused natural CSS transitions to break and not render properly due to\n * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class\n * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of\n * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS\n * class transitions are compatible with ngAnimate.\n *\n * There is, however, one special case when dealing with class-based transitions in ngAnimate.\n * When rendering class-based transitions that make use of the setup and active CSS classes\n * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define\n * the transition value **on the active CSS class** and not the setup class.\n *\n * ```css\n * .fade-add {\n *   /&#42; remember to place a 0s transition here\n *      to ensure that the styles are applied instantly\n *      even if the element already has a transition style &#42;/\n *   transition:0s linear all;\n *\n *   /&#42; starting CSS styles &#42;/\n *   opacity:1;\n * }\n * .fade-add.fade-add-active {\n *   /&#42; this will be the length of the animation &#42;/\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it\n * has a duration of zero. This may not be required, however, incase the browser is unable to render\n * the styling present in this CSS class instantly then it could be that the browser is attempting\n * to perform an unnecessary transition.\n *\n * This workaround, however, does not apply to  standard class-based transitions that are rendered\n * when a CSS class containing a transition is applied to an element:\n *\n * ```css\n * /&#42; this works as expected &#42;/\n * .fade {\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * Please keep this in mind when coding the CSS markup that will be used within class-based transitions.\n * Also, try not to mix the two class-based animation flavors together since the CSS code may become\n * overly complex.\n *\n *\n * ### Preventing Collisions With Third Party Libraries\n *\n * Some third-party frameworks place animation duration defaults across many element or className\n * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which\n * is expecting actual animations on these elements and has to wait for their completion.\n *\n * You can prevent this unwanted behavior by using a prefix on all your animation classes:\n *\n * ```css\n * /&#42; prefixed with animate- &#42;/\n * .animate-fade-add.animate-fade-add-active {\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * You then configure `$animate` to enforce this prefix:\n *\n * ```js\n * $animateProvider.classNameFilter(/animate-/);\n * ```\n * </div>\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   -webkit-transition: 1s linear all;\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   -webkit-transition-delay: 0.1s;\n *   transition-delay: 0.1s;\n *\n *   /&#42; in case the stagger doesn't work then these two values\n *    must be set to 0 to avoid an accidental CSS inheritance &#42;/\n *   -webkit-transition-duration: 0s;\n *   transition-duration: 0s;\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if more than 10ms has passed after the last animation has been fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * $timeout(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n * }, 100, false);\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * ## JavaScript-defined Animations\n * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not\n * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.\n *\n * ```js\n * //!annotate=\"YourApp\" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.\n * var ngModule = angular.module('YourApp', ['ngAnimate']);\n * ngModule.animation('.my-crazy-animation', function() {\n *   return {\n *     enter: function(element, done) {\n *       //run the animation here and call done when the animation is complete\n *       return function(cancelled) {\n *         //this (optional) function will be called when the animation\n *         //completes or when the animation is cancelled (the cancelled\n *         //flag will be set to true if cancelled).\n *       };\n *     },\n *     leave: function(element, done) { },\n *     move: function(element, done) { },\n *\n *     //animation that can be triggered before the class is added\n *     beforeAddClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is added\n *     addClass: function(element, className, done) { },\n *\n *     //animation that can be triggered before the class is removed\n *     beforeRemoveClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is removed\n *     removeClass: function(element, className, done) { }\n *   };\n * });\n * ```\n *\n * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run\n * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits\n * the element's CSS class attribute value and then run the matching animation event function (if found).\n * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will\n * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).\n *\n * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned.\n * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run,\n * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation\n * or transition code that is defined via a stylesheet).\n *\n *\n * ### Applying Directive-specific Styles to an Animation\n * In some cases a directive or service may want to provide `$animate` with extra details that the animation will\n * include into its animation. Let's say for example we wanted to render an animation that animates an element\n * towards the mouse coordinates as to where the user clicked last. By collecting the X/Y coordinates of the click\n * (via the event parameter) we can set the `top` and `left` styles into an object and pass that into our function\n * call to `$animate.addClass`.\n *\n * ```js\n * canvas.on('click', function(e) {\n *   $animate.addClass(element, 'on', {\n *     to: {\n *       left : e.client.x + 'px',\n *       top : e.client.y + 'px'\n *     }\n *   }):\n * });\n * ```\n *\n * Now when the animation runs, and a transition or keyframe animation is picked up, then the animation itself will\n * also include and transition the styling of the `left` and `top` properties into its running animation. If we want\n * to provide some starting animation values then we can do so by placing the starting animations styles into an object\n * called `from` in the same object as the `to` animations.\n *\n * ```js\n * canvas.on('click', function(e) {\n *   $animate.addClass(element, 'on', {\n *     from: {\n *        position: 'absolute',\n *        left: '0px',\n *        top: '0px'\n *     },\n *     to: {\n *       left : e.client.x + 'px',\n *       top : e.client.y + 'px'\n *     }\n *   }):\n * });\n * ```\n *\n * Once the animation is complete or cancelled then the union of both the before and after styles are applied to the\n * element. If `ngAnimate` is not present then the styles will be applied immediately.\n *\n */\n\nangular.module('ngAnimate', ['ng'])\n\n  /**\n   * @ngdoc provider\n   * @name $animateProvider\n   * @description\n   *\n   * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module.\n   * When an animation is triggered, the $animate service will query the $animate service to find any animations that match\n   * the provided name value.\n   *\n   * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n   *\n   * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n   *\n   */\n  .directive('ngAnimateChildren', function() {\n    var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';\n    return function(scope, element, attrs) {\n      var val = attrs.ngAnimateChildren;\n      if (angular.isString(val) && val.length === 0) { //empty attribute\n        element.data(NG_ANIMATE_CHILDREN, true);\n      } else {\n        scope.$watch(val, function(value) {\n          element.data(NG_ANIMATE_CHILDREN, !!value);\n        });\n      }\n    };\n  })\n\n  //this private service is only used within CSS-enabled animations\n  //IE8 + IE9 do not support rAF natively, but that is fine since they\n  //also don't support transitions and keyframes which means that the code\n  //below will never be used by the two browsers.\n  .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) {\n    var bod = $document[0].body;\n    return function(fn) {\n      //the returned function acts as the cancellation function\n      return $$rAF(function() {\n        //the line below will force the browser to perform a repaint\n        //so that all the animated elements within the animation frame\n        //will be properly updated and drawn on screen. This is\n        //required to perform multi-class CSS based animations with\n        //Firefox. DO NOT REMOVE THIS LINE.\n        var a = bod.offsetWidth + 1;\n        fn();\n      });\n    };\n  }])\n\n  .config(['$provide', '$animateProvider', function($provide, $animateProvider) {\n    var noop = angular.noop;\n    var forEach = angular.forEach;\n    var selectors = $animateProvider.$$selectors;\n    var isArray = angular.isArray;\n    var isString = angular.isString;\n    var isObject = angular.isObject;\n\n    var ELEMENT_NODE = 1;\n    var NG_ANIMATE_STATE = '$$ngAnimateState';\n    var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';\n    var NG_ANIMATE_CLASS_NAME = 'ng-animate';\n    var rootAnimateState = {running: true};\n\n    function extractElementNode(element) {\n      for (var i = 0; i < element.length; i++) {\n        var elm = element[i];\n        if (elm.nodeType == ELEMENT_NODE) {\n          return elm;\n        }\n      }\n    }\n\n    function prepareElement(element) {\n      return element && angular.element(element);\n    }\n\n    function stripCommentsFromElement(element) {\n      return angular.element(extractElementNode(element));\n    }\n\n    function isMatchingElement(elm1, elm2) {\n      return extractElementNode(elm1) == extractElementNode(elm2);\n    }\n    var $$jqLite;\n    $provide.decorator('$animate',\n        ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', '$$jqLite',\n function($delegate,   $$q,   $injector,   $sniffer,   $rootElement,   $$asyncCallback,   $rootScope,   $document,   $templateRequest,   $$$jqLite) {\n\n      $$jqLite = $$$jqLite;\n      $rootElement.data(NG_ANIMATE_STATE, rootAnimateState);\n\n      // Wait until all directive and route-related templates are downloaded and\n      // compiled. The $templateRequest.totalPendingRequests variable keeps track of\n      // all of the remote templates being currently downloaded. If there are no\n      // templates currently downloading then the watcher will still fire anyway.\n      var deregisterWatch = $rootScope.$watch(\n        function() { return $templateRequest.totalPendingRequests; },\n        function(val, oldVal) {\n          if (val !== 0) return;\n          deregisterWatch();\n\n          // Now that all templates have been downloaded, $animate will wait until\n          // the post digest queue is empty before enabling animations. By having two\n          // calls to $postDigest calls we can ensure that the flag is enabled at the\n          // very end of the post digest queue. Since all of the animations in $animate\n          // use $postDigest, it's important that the code below executes at the end.\n          // This basically means that the page is fully downloaded and compiled before\n          // any animations are triggered.\n          $rootScope.$$postDigest(function() {\n            $rootScope.$$postDigest(function() {\n              rootAnimateState.running = false;\n            });\n          });\n        }\n      );\n\n      var globalAnimationCounter = 0;\n      var classNameFilter = $animateProvider.classNameFilter();\n      var isAnimatableClassName = !classNameFilter\n              ? function() { return true; }\n              : function(className) {\n                return classNameFilter.test(className);\n              };\n\n      function classBasedAnimationsBlocked(element, setter) {\n        var data = element.data(NG_ANIMATE_STATE) || {};\n        if (setter) {\n          data.running = true;\n          data.structural = true;\n          element.data(NG_ANIMATE_STATE, data);\n        }\n        return data.disabled || (data.running && data.structural);\n      }\n\n      function runAnimationPostDigest(fn) {\n        var cancelFn, defer = $$q.defer();\n        defer.promise.$$cancelFn = function() {\n          cancelFn && cancelFn();\n        };\n        $rootScope.$$postDigest(function() {\n          cancelFn = fn(function() {\n            defer.resolve();\n          });\n        });\n        return defer.promise;\n      }\n\n      function parseAnimateOptions(options) {\n        // some plugin code may still be passing in the callback\n        // function as the last param for the $animate methods so\n        // it's best to only allow string or array values for now\n        if (isObject(options)) {\n          if (options.tempClasses && isString(options.tempClasses)) {\n            options.tempClasses = options.tempClasses.split(/\\s+/);\n          }\n          return options;\n        }\n      }\n\n      function resolveElementClasses(element, cache, runningAnimations) {\n        runningAnimations = runningAnimations || {};\n\n        var lookup = {};\n        forEach(runningAnimations, function(data, selector) {\n          forEach(selector.split(' '), function(s) {\n            lookup[s]=data;\n          });\n        });\n\n        var hasClasses = Object.create(null);\n        forEach((element.attr('class') || '').split(/\\s+/), function(className) {\n          hasClasses[className] = true;\n        });\n\n        var toAdd = [], toRemove = [];\n        forEach((cache && cache.classes) || [], function(status, className) {\n          var hasClass = hasClasses[className];\n          var matchingAnimation = lookup[className] || {};\n\n          // When addClass and removeClass is called then $animate will check to\n          // see if addClass and removeClass cancel each other out. When there are\n          // more calls to removeClass than addClass then the count falls below 0\n          // and then the removeClass animation will be allowed. Otherwise if the\n          // count is above 0 then that means an addClass animation will commence.\n          // Once an animation is allowed then the code will also check to see if\n          // there exists any on-going animation that is already adding or remvoing\n          // the matching CSS class.\n          if (status === false) {\n            //does it have the class or will it have the class\n            if (hasClass || matchingAnimation.event == 'addClass') {\n              toRemove.push(className);\n            }\n          } else if (status === true) {\n            //is the class missing or will it be removed?\n            if (!hasClass || matchingAnimation.event == 'removeClass') {\n              toAdd.push(className);\n            }\n          }\n        });\n\n        return (toAdd.length + toRemove.length) > 0 && [toAdd.join(' '), toRemove.join(' ')];\n      }\n\n      function lookup(name) {\n        if (name) {\n          var matches = [],\n              flagMap = {},\n              classes = name.substr(1).split('.');\n\n          //the empty string value is the default animation\n          //operation which performs CSS transition and keyframe\n          //animations sniffing. This is always included for each\n          //element animation procedure if the browser supports\n          //transitions and/or keyframe animations. The default\n          //animation is added to the top of the list to prevent\n          //any previous animations from affecting the element styling\n          //prior to the element being animated.\n          if ($sniffer.transitions || $sniffer.animations) {\n            matches.push($injector.get(selectors['']));\n          }\n\n          for (var i=0; i < classes.length; i++) {\n            var klass = classes[i],\n                selectorFactoryName = selectors[klass];\n            if (selectorFactoryName && !flagMap[klass]) {\n              matches.push($injector.get(selectorFactoryName));\n              flagMap[klass] = true;\n            }\n          }\n          return matches;\n        }\n      }\n\n      function animationRunner(element, animationEvent, className, options) {\n        //transcluded directives may sometimes fire an animation using only comment nodes\n        //best to catch this early on to prevent any animation operations from occurring\n        var node = element[0];\n        if (!node) {\n          return;\n        }\n\n        if (options) {\n          options.to = options.to || {};\n          options.from = options.from || {};\n        }\n\n        var classNameAdd;\n        var classNameRemove;\n        if (isArray(className)) {\n          classNameAdd = className[0];\n          classNameRemove = className[1];\n          if (!classNameAdd) {\n            className = classNameRemove;\n            animationEvent = 'removeClass';\n          } else if (!classNameRemove) {\n            className = classNameAdd;\n            animationEvent = 'addClass';\n          } else {\n            className = classNameAdd + ' ' + classNameRemove;\n          }\n        }\n\n        var isSetClassOperation = animationEvent == 'setClass';\n        var isClassBased = isSetClassOperation\n                           || animationEvent == 'addClass'\n                           || animationEvent == 'removeClass'\n                           || animationEvent == 'animate';\n\n        var currentClassName = element.attr('class');\n        var classes = currentClassName + ' ' + className;\n        if (!isAnimatableClassName(classes)) {\n          return;\n        }\n\n        var beforeComplete = noop,\n            beforeCancel = [],\n            before = [],\n            afterComplete = noop,\n            afterCancel = [],\n            after = [];\n\n        var animationLookup = (' ' + classes).replace(/\\s+/g,'.');\n        forEach(lookup(animationLookup), function(animationFactory) {\n          var created = registerAnimation(animationFactory, animationEvent);\n          if (!created && isSetClassOperation) {\n            registerAnimation(animationFactory, 'addClass');\n            registerAnimation(animationFactory, 'removeClass');\n          }\n        });\n\n        function registerAnimation(animationFactory, event) {\n          var afterFn = animationFactory[event];\n          var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)];\n          if (afterFn || beforeFn) {\n            if (event == 'leave') {\n              beforeFn = afterFn;\n              //when set as null then animation knows to skip this phase\n              afterFn = null;\n            }\n            after.push({\n              event: event, fn: afterFn\n            });\n            before.push({\n              event: event, fn: beforeFn\n            });\n            return true;\n          }\n        }\n\n        function run(fns, cancellations, allCompleteFn) {\n          var animations = [];\n          forEach(fns, function(animation) {\n            animation.fn && animations.push(animation);\n          });\n\n          var count = 0;\n          function afterAnimationComplete(index) {\n            if (cancellations) {\n              (cancellations[index] || noop)();\n              if (++count < animations.length) return;\n              cancellations = null;\n            }\n            allCompleteFn();\n          }\n\n          //The code below adds directly to the array in order to work with\n          //both sync and async animations. Sync animations are when the done()\n          //operation is called right away. DO NOT REFACTOR!\n          forEach(animations, function(animation, index) {\n            var progress = function() {\n              afterAnimationComplete(index);\n            };\n            switch (animation.event) {\n              case 'setClass':\n                cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress, options));\n                break;\n              case 'animate':\n                cancellations.push(animation.fn(element, className, options.from, options.to, progress));\n                break;\n              case 'addClass':\n                cancellations.push(animation.fn(element, classNameAdd || className,     progress, options));\n                break;\n              case 'removeClass':\n                cancellations.push(animation.fn(element, classNameRemove || className,  progress, options));\n                break;\n              default:\n                cancellations.push(animation.fn(element, progress, options));\n                break;\n            }\n          });\n\n          if (cancellations && cancellations.length === 0) {\n            allCompleteFn();\n          }\n        }\n\n        return {\n          node: node,\n          event: animationEvent,\n          className: className,\n          isClassBased: isClassBased,\n          isSetClassOperation: isSetClassOperation,\n          applyStyles: function() {\n            if (options) {\n              element.css(angular.extend(options.from || {}, options.to || {}));\n            }\n          },\n          before: function(allCompleteFn) {\n            beforeComplete = allCompleteFn;\n            run(before, beforeCancel, function() {\n              beforeComplete = noop;\n              allCompleteFn();\n            });\n          },\n          after: function(allCompleteFn) {\n            afterComplete = allCompleteFn;\n            run(after, afterCancel, function() {\n              afterComplete = noop;\n              allCompleteFn();\n            });\n          },\n          cancel: function() {\n            if (beforeCancel) {\n              forEach(beforeCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              beforeComplete(true);\n            }\n            if (afterCancel) {\n              forEach(afterCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              afterComplete(true);\n            }\n          }\n        };\n      }\n\n      /**\n       * @ngdoc service\n       * @name $animate\n       * @kind object\n       *\n       * @description\n       * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations.\n       * When any of these operations are run, the $animate service\n       * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object)\n       * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run.\n       *\n       * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives\n       * will work out of the box without any extra configuration.\n       *\n       * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n       *\n       * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n       * ## Callback Promises\n       * With AngularJS 1.3, each of the animation methods, on the `$animate` service, return a promise when called. The\n       * promise itself is then resolved once the animation has completed itself, has been cancelled or has been\n       * skipped due to animations being disabled. (Note that even if the animation is cancelled it will still\n       * call the resolve function of the animation.)\n       *\n       * ```js\n       * $animate.enter(element, container).then(function() {\n       *   //...this is called once the animation is complete...\n       * });\n       * ```\n       *\n       * Also note that, due to the nature of the callback promise, if any Angular-specific code (like changing the scope,\n       * location of the page, etc...) is executed within the callback promise then be sure to wrap the code using\n       * `$scope.$apply(...)`;\n       *\n       * ```js\n       * $animate.leave(element).then(function() {\n       *   $scope.$apply(function() {\n       *     $location.path('/new-page');\n       *   });\n       * });\n       * ```\n       *\n       * An animation can also be cancelled by calling the `$animate.cancel(promise)` method with the provided\n       * promise that was returned when the animation was started.\n       *\n       * ```js\n       * var promise = $animate.addClass(element, 'super-long-animation');\n       * promise.then(function() {\n       *   //this will still be called even if cancelled\n       * });\n       *\n       * element.on('click', function() {\n       *   //tooo lazy to wait for the animation to end\n       *   $animate.cancel(promise);\n       * });\n       * ```\n       *\n       * (Keep in mind that the promise cancellation is unique to `$animate` since promises in\n       * general cannot be cancelled.)\n       *\n       */\n      return {\n        /**\n         * @ngdoc method\n         * @name $animate#animate\n         * @kind function\n         *\n         * @description\n         * Performs an inline animation on the element which applies the provided `to` and `from` CSS styles to the element.\n         * If any detected CSS transition, keyframe or JavaScript matches the provided `className` value then the animation\n         * will take on the provided styles. For example, if a transition animation is set for the given className then the\n         * provided `from` and `to` styles will be applied alongside the given transition. If a JavaScript animation is\n         * detected then the provided styles will be given in as function paramters.\n         *\n         * ```js\n         * ngModule.animation('.my-inline-animation', function() {\n         *   return {\n         *     animate : function(element, className, from, to, done) {\n         *       //styles\n         *     }\n         *   }\n         * });\n         * ```\n         *\n         * Below is a breakdown of each step that occurs during the `animate` animation:\n         *\n         * | Animation Step                                                                                                        | What the element class attribute looks like                  |\n         * |-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------|\n         * | 1. `$animate.animate(...)` is called                                                                                  | `class=\"my-animation\"`                                       |\n         * | 2. `$animate` waits for the next digest to start the animation                                                        | `class=\"my-animation ng-animate\"`                            |\n         * | 3. `$animate` runs the JavaScript-defined animations detected on the element                                          | `class=\"my-animation ng-animate\"`                            |\n         * | 4. the `className` class value is added to the element                                                                | `class=\"my-animation ng-animate className\"`                  |\n         * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay                         | `class=\"my-animation ng-animate className\"`                  |\n         * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.className` class styling is applied right away| `class=\"my-animation ng-animate className\"`                  |\n         * | 7. `$animate` applies the provided collection of `from` CSS styles to the element                                     | `class=\"my-animation ng-animate className\"`                  |\n         * | 8. `$animate` waits for a single animation frame (this performs a reflow)                                             | `class=\"my-animation ng-animate className\"`                  |\n         * | 9. `$animate` removes the CSS transition block placed on the element                                                  | `class=\"my-animation ng-animate className\"`                  |\n         * | 10. the `className-active` class is added (this triggers the CSS transition/animation)                                | `class=\"my-animation ng-animate className className-active\"` |\n         * | 11. `$animate` applies the collection of `to` CSS styles to the element which are then handled by the transition      | `class=\"my-animation ng-animate className className-active\"` |\n         * | 12. `$animate` waits for the animation to complete (via events and timeout)                                           | `class=\"my-animation ng-animate className className-active\"` |\n         * | 13. The animation ends and all generated CSS classes are removed from the element                                     | `class=\"my-animation\"`                                       |\n         * | 14. The returned promise is resolved.                                                                                 | `class=\"my-animation\"`                                       |\n         *\n         * @param {DOMElement} element the element that will be the focus of the enter animation\n         * @param {object} from a collection of CSS styles that will be applied to the element at the start of the animation\n         * @param {object} to a collection of CSS styles that the element will animate towards\n         * @param {string=} className an optional CSS class that will be added to the element for the duration of the animation (the default class is `ng-inline-animate`)\n         * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        animate: function(element, from, to, className, options) {\n          className = className || 'ng-inline-animate';\n          options = parseAnimateOptions(options) || {};\n          options.from = to ? from : null;\n          options.to   = to ? to : from;\n\n          return runAnimationPostDigest(function(done) {\n            return performAnimation('animate', className, stripCommentsFromElement(element), null, null, noop, options, done);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#enter\n         * @kind function\n         *\n         * @description\n         * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once\n         * the animation is started, the following CSS classes will be present on the element for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during enter animation:\n         *\n         * | Animation Step                                                                                                        | What the element class attribute looks like                |\n         * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|\n         * | 1. `$animate.enter(...)` is called                                                                                    | `class=\"my-animation\"`                                     |\n         * | 2. element is inserted into the `parentElement` element or beside the `afterElement` element                          | `class=\"my-animation\"`                                     |\n         * | 3. `$animate` waits for the next digest to start the animation                                                        | `class=\"my-animation ng-animate\"`                          |\n         * | 4. `$animate` runs the JavaScript-defined animations detected on the element                                          | `class=\"my-animation ng-animate\"`                          |\n         * | 5. the `.ng-enter` class is added to the element                                                                      | `class=\"my-animation ng-animate ng-enter\"`                 |\n         * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay                         | `class=\"my-animation ng-animate ng-enter\"`                 |\n         * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-enter` class styling is applied right away | `class=\"my-animation ng-animate ng-enter\"`                 |\n         * | 8. `$animate` waits for a single animation frame (this performs a reflow)                                             | `class=\"my-animation ng-animate ng-enter\"`                 |\n         * | 9. `$animate` removes the CSS transition block placed on the element                                                  | `class=\"my-animation ng-animate ng-enter\"`                 |\n         * | 10. the `.ng-enter-active` class is added (this triggers the CSS transition/animation)                                | `class=\"my-animation ng-animate ng-enter ng-enter-active\"` |\n         * | 11. `$animate` waits for the animation to complete (via events and timeout)                                           | `class=\"my-animation ng-animate ng-enter ng-enter-active\"` |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                     | `class=\"my-animation\"`                                     |\n         * | 13. The returned promise is resolved.                                                                                 | `class=\"my-animation\"`                                     |\n         *\n         * @param {DOMElement} element the element that will be the focus of the enter animation\n         * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation\n         * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        enter: function(element, parentElement, afterElement, options) {\n          options = parseAnimateOptions(options);\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          classBasedAnimationsBlocked(element, true);\n          $delegate.enter(element, parentElement, afterElement);\n          return runAnimationPostDigest(function(done) {\n            return performAnimation('enter', 'ng-enter', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#leave\n         * @kind function\n         *\n         * @description\n         * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during leave animation:\n         *\n         * | Animation Step                                                                                                        | What the element class attribute looks like                |\n         * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|\n         * | 1. `$animate.leave(...)` is called                                                                                    | `class=\"my-animation\"`                                     |\n         * | 2. `$animate` runs the JavaScript-defined animations detected on the element                                          | `class=\"my-animation ng-animate\"`                          |\n         * | 3. `$animate` waits for the next digest to start the animation                                                        | `class=\"my-animation ng-animate\"`                          |\n         * | 4. the `.ng-leave` class is added to the element                                                                      | `class=\"my-animation ng-animate ng-leave\"`                 |\n         * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay                         | `class=\"my-animation ng-animate ng-leave\"`                 |\n         * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.ng-leave` class styling is applied right away | `class=\"my-animation ng-animate ng-leave\"`                 |\n         * | 7. `$animate` waits for a single animation frame (this performs a reflow)                                             | `class=\"my-animation ng-animate ng-leave\"`                 |\n         * | 8. `$animate` removes the CSS transition block placed on the element                                                  | `class=\"my-animation ng-animate ng-leave\"`                 |\n         * | 9. the `.ng-leave-active` class is added (this triggers the CSS transition/animation)                                 | `class=\"my-animation ng-animate ng-leave ng-leave-active\"` |\n         * | 10. `$animate` waits for the animation to complete (via events and timeout)                                           | `class=\"my-animation ng-animate ng-leave ng-leave-active\"` |\n         * | 11. The animation ends and all generated CSS classes are removed from the element                                     | `class=\"my-animation\"`                                     |\n         * | 12. The element is removed from the DOM                                                                               | ...                                                        |\n         * | 13. The returned promise is resolved.                                                                                 | ...                                                        |\n         *\n         * @param {DOMElement} element the element that will be the focus of the leave animation\n         * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        leave: function(element, options) {\n          options = parseAnimateOptions(options);\n          element = angular.element(element);\n\n          cancelChildAnimations(element);\n          classBasedAnimationsBlocked(element, true);\n          return runAnimationPostDigest(function(done) {\n            return performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {\n              $delegate.leave(element);\n            }, options, done);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#move\n         * @kind function\n         *\n         * @description\n         * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or\n         * add the element directly after the afterElement element if present. Then the move animation will be run. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during move animation:\n         *\n         * | Animation Step                                                                                                       | What the element class attribute looks like              |\n         * |----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n         * | 1. `$animate.move(...)` is called                                                                                    | `class=\"my-animation\"`                                   |\n         * | 2. element is moved into the parentElement element or beside the afterElement element                                | `class=\"my-animation\"`                                   |\n         * | 3. `$animate` waits for the next digest to start the animation                                                       | `class=\"my-animation ng-animate\"`                        |\n         * | 4. `$animate` runs the JavaScript-defined animations detected on the element                                         | `class=\"my-animation ng-animate\"`                        |\n         * | 5. the `.ng-move` class is added to the element                                                                      | `class=\"my-animation ng-animate ng-move\"`                |\n         * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay                        | `class=\"my-animation ng-animate ng-move\"`                |\n         * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-move` class styling is applied right away | `class=\"my-animation ng-animate ng-move\"`                |\n         * | 8. `$animate` waits for a single animation frame (this performs a reflow)                                            | `class=\"my-animation ng-animate ng-move\"`                |\n         * | 9. `$animate` removes the CSS transition block placed on the element                                                 | `class=\"my-animation ng-animate ng-move\"`                |\n         * | 10. the `.ng-move-active` class is added (this triggers the CSS transition/animation)                                | `class=\"my-animation ng-animate ng-move ng-move-active\"` |\n         * | 11. `$animate` waits for the animation to complete (via events and timeout)                                          | `class=\"my-animation ng-animate ng-move ng-move-active\"` |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                    | `class=\"my-animation\"`                                   |\n         * | 13. The returned promise is resolved.                                                                                | `class=\"my-animation\"`                                   |\n         *\n         * @param {DOMElement} element the element that will be the focus of the move animation\n         * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation\n         * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        move: function(element, parentElement, afterElement, options) {\n          options = parseAnimateOptions(options);\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          cancelChildAnimations(element);\n          classBasedAnimationsBlocked(element, true);\n          $delegate.move(element, parentElement, afterElement);\n          return runAnimationPostDigest(function(done) {\n            return performAnimation('move', 'ng-move', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#addClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class.\n         * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide\n         * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions\n         * or keyframes are defined on the -add-active or base CSS class).\n         *\n         * Below is a breakdown of each step that occurs during addClass animation:\n         *\n         * | Animation Step                                                                                         | What the element class attribute looks like                        |\n         * |--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|\n         * | 1. `$animate.addClass(element, 'super')` is called                                                     | `class=\"my-animation\"`                                             |\n         * | 2. `$animate` runs the JavaScript-defined animations detected on the element                           | `class=\"my-animation ng-animate\"`                                  |\n         * | 3. the `.super-add` class is added to the element                                                      | `class=\"my-animation ng-animate super-add\"`                        |\n         * | 4. `$animate` waits for a single animation frame (this performs a reflow)                              | `class=\"my-animation ng-animate super-add\"`                        |\n         * | 5. the `.super` and `.super-add-active` classes are added (this triggers the CSS transition/animation) | `class=\"my-animation ng-animate super super-add super-add-active\"` |\n         * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay          | `class=\"my-animation ng-animate super super-add super-add-active\"` |\n         * | 7. `$animate` waits for the animation to complete (via events and timeout)                             | `class=\"my-animation ng-animate super super-add super-add-active\"` |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                       | `class=\"my-animation super\"`                                       |\n         * | 9. The super class is kept on the element                                                              | `class=\"my-animation super\"`                                       |\n         * | 10. The returned promise is resolved.                                                                  | `class=\"my-animation super\"`                                       |\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be added to the element and then animated\n         * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        addClass: function(element, className, options) {\n          return this.setClass(element, className, [], options);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#removeClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value\n         * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in\n         * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if\n         * no CSS transitions or keyframes are defined on the -remove or base CSS classes).\n         *\n         * Below is a breakdown of each step that occurs during removeClass animation:\n         *\n         * | Animation Step                                                                                                       | What the element class attribute looks like                        |\n         * |----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|\n         * | 1. `$animate.removeClass(element, 'super')` is called                                                                | `class=\"my-animation super\"`                                       |\n         * | 2. `$animate` runs the JavaScript-defined animations detected on the element                                         | `class=\"my-animation super ng-animate\"`                            |\n         * | 3. the `.super-remove` class is added to the element                                                                 | `class=\"my-animation super ng-animate super-remove\"`               |\n         * | 4. `$animate` waits for a single animation frame (this performs a reflow)                                            | `class=\"my-animation super ng-animate super-remove\"`               |\n         * | 5. the `.super-remove-active` classes are added and `.super` is removed (this triggers the CSS transition/animation) | `class=\"my-animation ng-animate super-remove super-remove-active\"` |\n         * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay                        | `class=\"my-animation ng-animate super-remove super-remove-active\"` |\n         * | 7. `$animate` waits for the animation to complete (via events and timeout)                                           | `class=\"my-animation ng-animate super-remove super-remove-active\"` |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                     | `class=\"my-animation\"`                                             |\n         * | 9. The returned promise is resolved.                                                                                 | `class=\"my-animation\"`                                             |\n         *\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be animated and then removed from the element\n         * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n        */\n        removeClass: function(element, className, options) {\n          return this.setClass(element, [], className, options);\n        },\n\n        /**\n         *\n         * @ngdoc method\n         * @name $animate#setClass\n         *\n         * @description Adds and/or removes the given CSS classes to and from the element.\n         * Once complete, the `done()` callback will be fired (if provided).\n         *\n         * | Animation Step                                                                                                                               | What the element class attribute looks like                                            |\n         * |----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|\n         * | 1. `$animate.setClass(element, 'on', 'off')` is called                                                                                       | `class=\"my-animation off\"`                                                             |\n         * | 2. `$animate` runs the JavaScript-defined animations detected on the element                                                                 | `class=\"my-animation ng-animate off\"`                                                  |\n         * | 3. the `.on-add` and `.off-remove` classes are added to the element                                                                          | `class=\"my-animation ng-animate on-add off-remove off\"`                                |\n         * | 4. `$animate` waits for a single animation frame (this performs a reflow)                                                                    | `class=\"my-animation ng-animate on-add off-remove off\"`                                |\n         * | 5. the `.on`, `.on-add-active` and `.off-remove-active` classes are added and `.off` is removed (this triggers the CSS transition/animation) | `class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\"` |\n         * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay                                                | `class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\"` |\n         * | 7. `$animate` waits for the animation to complete (via events and timeout)                                                                   | `class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\"` |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                                             | `class=\"my-animation on\"`                                                              |\n         * | 9. The returned promise is resolved.                                                                                                         | `class=\"my-animation on\"`                                                              |\n         *\n         * @param {DOMElement} element the element which will have its CSS classes changed\n         *   removed from it\n         * @param {string} add the CSS classes which will be added to the element\n         * @param {string} remove the CSS class which will be removed from the element\n         *   CSS classes have been set on the element\n         * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation\n         * @return {Promise} the animation callback promise\n         */\n        setClass: function(element, add, remove, options) {\n          options = parseAnimateOptions(options);\n\n          var STORAGE_KEY = '$$animateClasses';\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n\n          if (classBasedAnimationsBlocked(element)) {\n            return $delegate.$$setClassImmediately(element, add, remove, options);\n          }\n\n          // we're using a combined array for both the add and remove\n          // operations since the ORDER OF addClass and removeClass matters\n          var classes, cache = element.data(STORAGE_KEY);\n          var hasCache = !!cache;\n          if (!cache) {\n            cache = {};\n            cache.classes = {};\n          }\n          classes = cache.classes;\n\n          add = isArray(add) ? add : add.split(' ');\n          forEach(add, function(c) {\n            if (c && c.length) {\n              classes[c] = true;\n            }\n          });\n\n          remove = isArray(remove) ? remove : remove.split(' ');\n          forEach(remove, function(c) {\n            if (c && c.length) {\n              classes[c] = false;\n            }\n          });\n\n          if (hasCache) {\n            if (options && cache.options) {\n              cache.options = angular.extend(cache.options || {}, options);\n            }\n\n            //the digest cycle will combine all the animations into one function\n            return cache.promise;\n          } else {\n            element.data(STORAGE_KEY, cache = {\n              classes: classes,\n              options: options\n            });\n          }\n\n          return cache.promise = runAnimationPostDigest(function(done) {\n            var parentElement = element.parent();\n            var elementNode = extractElementNode(element);\n            var parentNode = elementNode.parentNode;\n            // TODO(matsko): move this code into the animationsDisabled() function once #8092 is fixed\n            if (!parentNode || parentNode['$$NG_REMOVED'] || elementNode['$$NG_REMOVED']) {\n              done();\n              return;\n            }\n\n            var cache = element.data(STORAGE_KEY);\n            element.removeData(STORAGE_KEY);\n\n            var state = element.data(NG_ANIMATE_STATE) || {};\n            var classes = resolveElementClasses(element, cache, state.active);\n            return !classes\n              ? done()\n              : performAnimation('setClass', classes, element, parentElement, null, function() {\n                  if (classes[0]) $delegate.$$addClassImmediately(element, classes[0]);\n                  if (classes[1]) $delegate.$$removeClassImmediately(element, classes[1]);\n                }, cache.options, done);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#cancel\n         * @kind function\n         *\n         * @param {Promise} animationPromise The animation promise that is returned when an animation is started.\n         *\n         * @description\n         * Cancels the provided animation.\n        */\n        cancel: function(promise) {\n          promise.$$cancelFn();\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#enabled\n         * @kind function\n         *\n         * @param {boolean=} value If provided then set the animation on or off.\n         * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation\n         * @return {boolean} Current animation state.\n         *\n         * @description\n         * Globally enables/disables animations.\n         *\n        */\n        enabled: function(value, element) {\n          switch (arguments.length) {\n            case 2:\n              if (value) {\n                cleanup(element);\n              } else {\n                var data = element.data(NG_ANIMATE_STATE) || {};\n                data.disabled = true;\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            break;\n\n            case 1:\n              rootAnimateState.disabled = !value;\n            break;\n\n            default:\n              value = !rootAnimateState.disabled;\n            break;\n          }\n          return !!value;\n         }\n      };\n\n      /*\n        all animations call this shared animation triggering function internally.\n        The animationEvent variable refers to the JavaScript animation event that will be triggered\n        and the className value is the name of the animation that will be applied within the\n        CSS code. Element, `parentElement` and `afterElement` are provided DOM elements for the animation\n        and the onComplete callback will be fired once the animation is fully complete.\n      */\n      function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, options, doneCallback) {\n        var noopCancel = noop;\n        var runner = animationRunner(element, animationEvent, className, options);\n        if (!runner) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return noopCancel;\n        }\n\n        animationEvent = runner.event;\n        className = runner.className;\n        var elementEvents = angular.element._data(runner.node);\n        elementEvents = elementEvents && elementEvents.events;\n\n        if (!parentElement) {\n          parentElement = afterElement ? afterElement.parent() : element.parent();\n        }\n\n        //skip the animation if animations are disabled, a parent is already being animated,\n        //the element is not currently attached to the document body or then completely close\n        //the animation if any matching animations are not found at all.\n        //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found.\n        if (animationsDisabled(element, parentElement)) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return noopCancel;\n        }\n\n        var ngAnimateState  = element.data(NG_ANIMATE_STATE) || {};\n        var runningAnimations     = ngAnimateState.active || {};\n        var totalActiveAnimations = ngAnimateState.totalActive || 0;\n        var lastAnimation         = ngAnimateState.last;\n        var skipAnimation = false;\n\n        if (totalActiveAnimations > 0) {\n          var animationsToCancel = [];\n          if (!runner.isClassBased) {\n            if (animationEvent == 'leave' && runningAnimations['ng-leave']) {\n              skipAnimation = true;\n            } else {\n              //cancel all animations when a structural animation takes place\n              for (var klass in runningAnimations) {\n                animationsToCancel.push(runningAnimations[klass]);\n              }\n              ngAnimateState = {};\n              cleanup(element, true);\n            }\n          } else if (lastAnimation.event == 'setClass') {\n            animationsToCancel.push(lastAnimation);\n            cleanup(element, className);\n          } else if (runningAnimations[className]) {\n            var current = runningAnimations[className];\n            if (current.event == animationEvent) {\n              skipAnimation = true;\n            } else {\n              animationsToCancel.push(current);\n              cleanup(element, className);\n            }\n          }\n\n          if (animationsToCancel.length > 0) {\n            forEach(animationsToCancel, function(operation) {\n              operation.cancel();\n            });\n          }\n        }\n\n        if (runner.isClassBased\n            && !runner.isSetClassOperation\n            && animationEvent != 'animate'\n            && !skipAnimation) {\n          skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR\n        }\n\n        if (skipAnimation) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          fireDoneCallbackAsync();\n          return noopCancel;\n        }\n\n        runningAnimations     = ngAnimateState.active || {};\n        totalActiveAnimations = ngAnimateState.totalActive || 0;\n\n        if (animationEvent == 'leave') {\n          //there's no need to ever remove the listener since the element\n          //will be removed (destroyed) after the leave animation ends or\n          //is cancelled midway\n          element.one('$destroy', function(e) {\n            var element = angular.element(this);\n            var state = element.data(NG_ANIMATE_STATE);\n            if (state) {\n              var activeLeaveAnimation = state.active['ng-leave'];\n              if (activeLeaveAnimation) {\n                activeLeaveAnimation.cancel();\n                cleanup(element, 'ng-leave');\n              }\n            }\n          });\n        }\n\n        //the ng-animate class does nothing, but it's here to allow for\n        //parent animations to find and cancel child animations when needed\n        $$jqLite.addClass(element, NG_ANIMATE_CLASS_NAME);\n        if (options && options.tempClasses) {\n          forEach(options.tempClasses, function(className) {\n            $$jqLite.addClass(element, className);\n          });\n        }\n\n        var localAnimationCount = globalAnimationCounter++;\n        totalActiveAnimations++;\n        runningAnimations[className] = runner;\n\n        element.data(NG_ANIMATE_STATE, {\n          last: runner,\n          active: runningAnimations,\n          index: localAnimationCount,\n          totalActive: totalActiveAnimations\n        });\n\n        //first we run the before animations and when all of those are complete\n        //then we perform the DOM operation and run the next set of animations\n        fireBeforeCallbackAsync();\n        runner.before(function(cancelled) {\n          var data = element.data(NG_ANIMATE_STATE);\n          cancelled = cancelled ||\n                        !data || !data.active[className] ||\n                        (runner.isClassBased && data.active[className].event != animationEvent);\n\n          fireDOMOperation();\n          if (cancelled === true) {\n            closeAnimation();\n          } else {\n            fireAfterCallbackAsync();\n            runner.after(closeAnimation);\n          }\n        });\n\n        return runner.cancel;\n\n        function fireDOMCallback(animationPhase) {\n          var eventName = '$animate:' + animationPhase;\n          if (elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) {\n            $$asyncCallback(function() {\n              element.triggerHandler(eventName, {\n                event: animationEvent,\n                className: className\n              });\n            });\n          }\n        }\n\n        function fireBeforeCallbackAsync() {\n          fireDOMCallback('before');\n        }\n\n        function fireAfterCallbackAsync() {\n          fireDOMCallback('after');\n        }\n\n        function fireDoneCallbackAsync() {\n          fireDOMCallback('close');\n          doneCallback();\n        }\n\n        //it is less complicated to use a flag than managing and canceling\n        //timeouts containing multiple callbacks.\n        function fireDOMOperation() {\n          if (!fireDOMOperation.hasBeenRun) {\n            fireDOMOperation.hasBeenRun = true;\n            domOperation();\n          }\n        }\n\n        function closeAnimation() {\n          if (!closeAnimation.hasBeenRun) {\n            if (runner) { //the runner doesn't exist if it fails to instantiate\n              runner.applyStyles();\n            }\n\n            closeAnimation.hasBeenRun = true;\n            if (options && options.tempClasses) {\n              forEach(options.tempClasses, function(className) {\n                $$jqLite.removeClass(element, className);\n              });\n            }\n\n            var data = element.data(NG_ANIMATE_STATE);\n            if (data) {\n\n              /* only structural animations wait for reflow before removing an\n                 animation, but class-based animations don't. An example of this\n                 failing would be when a parent HTML tag has a ng-class attribute\n                 causing ALL directives below to skip animations during the digest */\n              if (runner && runner.isClassBased) {\n                cleanup(element, className);\n              } else {\n                $$asyncCallback(function() {\n                  var data = element.data(NG_ANIMATE_STATE) || {};\n                  if (localAnimationCount == data.index) {\n                    cleanup(element, className, animationEvent);\n                  }\n                });\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            }\n            fireDoneCallbackAsync();\n          }\n        }\n      }\n\n      function cancelChildAnimations(element) {\n        var node = extractElementNode(element);\n        if (node) {\n          var nodes = angular.isFunction(node.getElementsByClassName) ?\n            node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :\n            node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);\n          forEach(nodes, function(element) {\n            element = angular.element(element);\n            var data = element.data(NG_ANIMATE_STATE);\n            if (data && data.active) {\n              forEach(data.active, function(runner) {\n                runner.cancel();\n              });\n            }\n          });\n        }\n      }\n\n      function cleanup(element, className) {\n        if (isMatchingElement(element, $rootElement)) {\n          if (!rootAnimateState.disabled) {\n            rootAnimateState.running = false;\n            rootAnimateState.structural = false;\n          }\n        } else if (className) {\n          var data = element.data(NG_ANIMATE_STATE) || {};\n\n          var removeAnimations = className === true;\n          if (!removeAnimations && data.active && data.active[className]) {\n            data.totalActive--;\n            delete data.active[className];\n          }\n\n          if (removeAnimations || !data.totalActive) {\n            $$jqLite.removeClass(element, NG_ANIMATE_CLASS_NAME);\n            element.removeData(NG_ANIMATE_STATE);\n          }\n        }\n      }\n\n      function animationsDisabled(element, parentElement) {\n        if (rootAnimateState.disabled) {\n          return true;\n        }\n\n        if (isMatchingElement(element, $rootElement)) {\n          return rootAnimateState.running;\n        }\n\n        var allowChildAnimations, parentRunningAnimation, hasParent;\n        do {\n          //the element did not reach the root element which means that it\n          //is not apart of the DOM. Therefore there is no reason to do\n          //any animations on it\n          if (parentElement.length === 0) break;\n\n          var isRoot = isMatchingElement(parentElement, $rootElement);\n          var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {});\n          if (state.disabled) {\n            return true;\n          }\n\n          //no matter what, for an animation to work it must reach the root element\n          //this implies that the element is attached to the DOM when the animation is run\n          if (isRoot) {\n            hasParent = true;\n          }\n\n          //once a flag is found that is strictly false then everything before\n          //it will be discarded and all child animations will be restricted\n          if (allowChildAnimations !== false) {\n            var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN);\n            if (angular.isDefined(animateChildrenFlag)) {\n              allowChildAnimations = animateChildrenFlag;\n            }\n          }\n\n          parentRunningAnimation = parentRunningAnimation ||\n                                   state.running ||\n                                   (state.last && !state.last.isClassBased);\n        }\n        while (parentElement = parentElement.parent());\n\n        return !hasParent || (!allowChildAnimations && parentRunningAnimation);\n      }\n    }]);\n\n    $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow',\n                           function($window,   $sniffer,   $timeout,   $$animateReflow) {\n      // Detect proper transitionend/animationend event names.\n      var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n      // If unprefixed events are not supported but webkit-prefixed are, use the latter.\n      // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n      // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n      // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n      // Register both events in case `window.onanimationend` is not supported because of that,\n      // do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n      // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n      // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition\n      if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        TRANSITION_PROP = 'WebkitTransition';\n        TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n      } else {\n        TRANSITION_PROP = 'transition';\n        TRANSITIONEND_EVENT = 'transitionend';\n      }\n\n      if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        ANIMATION_PROP = 'WebkitAnimation';\n        ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n      } else {\n        ANIMATION_PROP = 'animation';\n        ANIMATIONEND_EVENT = 'animationend';\n      }\n\n      var DURATION_KEY = 'Duration';\n      var PROPERTY_KEY = 'Property';\n      var DELAY_KEY = 'Delay';\n      var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\n      var ANIMATION_PLAYSTATE_KEY = 'PlayState';\n      var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey';\n      var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data';\n      var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\n      var CLOSING_TIME_BUFFER = 1.5;\n      var ONE_SECOND = 1000;\n\n      var lookupCache = {};\n      var parentCounter = 0;\n      var animationReflowQueue = [];\n      var cancelAnimationReflow;\n      function clearCacheAfterReflow() {\n        if (!cancelAnimationReflow) {\n          cancelAnimationReflow = $$animateReflow(function() {\n            animationReflowQueue = [];\n            cancelAnimationReflow = null;\n            lookupCache = {};\n          });\n        }\n      }\n\n      function afterReflow(element, callback) {\n        if (cancelAnimationReflow) {\n          cancelAnimationReflow();\n        }\n        animationReflowQueue.push(callback);\n        cancelAnimationReflow = $$animateReflow(function() {\n          forEach(animationReflowQueue, function(fn) {\n            fn();\n          });\n\n          animationReflowQueue = [];\n          cancelAnimationReflow = null;\n          lookupCache = {};\n        });\n      }\n\n      var closingTimer = null;\n      var closingTimestamp = 0;\n      var animationElementQueue = [];\n      function animationCloseHandler(element, totalTime) {\n        var node = extractElementNode(element);\n        element = angular.element(node);\n\n        //this item will be garbage collected by the closing\n        //animation timeout\n        animationElementQueue.push(element);\n\n        //but it may not need to cancel out the existing timeout\n        //if the timestamp is less than the previous one\n        var futureTimestamp = Date.now() + totalTime;\n        if (futureTimestamp <= closingTimestamp) {\n          return;\n        }\n\n        $timeout.cancel(closingTimer);\n\n        closingTimestamp = futureTimestamp;\n        closingTimer = $timeout(function() {\n          closeAllAnimations(animationElementQueue);\n          animationElementQueue = [];\n        }, totalTime, false);\n      }\n\n      function closeAllAnimations(elements) {\n        forEach(elements, function(element) {\n          var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n          if (elementData) {\n            forEach(elementData.closeAnimationFns, function(fn) {\n              fn();\n            });\n          }\n        });\n      }\n\n      function getElementAnimationDetails(element, cacheKey) {\n        var data = cacheKey ? lookupCache[cacheKey] : null;\n        if (!data) {\n          var transitionDuration = 0;\n          var transitionDelay = 0;\n          var animationDuration = 0;\n          var animationDelay = 0;\n\n          //we want all the styles defined before and after\n          forEach(element, function(element) {\n            if (element.nodeType == ELEMENT_NODE) {\n              var elementStyles = $window.getComputedStyle(element) || {};\n\n              var transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY];\n              transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration);\n\n              var transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY];\n              transitionDelay  = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay);\n\n              var animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY];\n              animationDelay   = Math.max(parseMaxTime(elementStyles[ANIMATION_PROP + DELAY_KEY]), animationDelay);\n\n              var aDuration  = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]);\n\n              if (aDuration > 0) {\n                aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1;\n              }\n              animationDuration = Math.max(aDuration, animationDuration);\n            }\n          });\n          data = {\n            total: 0,\n            transitionDelay: transitionDelay,\n            transitionDuration: transitionDuration,\n            animationDelay: animationDelay,\n            animationDuration: animationDuration\n          };\n          if (cacheKey) {\n            lookupCache[cacheKey] = data;\n          }\n        }\n        return data;\n      }\n\n      function parseMaxTime(str) {\n        var maxValue = 0;\n        var values = isString(str) ?\n          str.split(/\\s*,\\s*/) :\n          [];\n        forEach(values, function(value) {\n          maxValue = Math.max(parseFloat(value) || 0, maxValue);\n        });\n        return maxValue;\n      }\n\n      function getCacheKey(element) {\n        var parentElement = element.parent();\n        var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY);\n        if (!parentID) {\n          parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter);\n          parentID = parentCounter;\n        }\n        return parentID + '-' + extractElementNode(element).getAttribute('class');\n      }\n\n      function animateSetup(animationEvent, element, className, styles) {\n        var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0;\n\n        var cacheKey = getCacheKey(element);\n        var eventCacheKey = cacheKey + ' ' + className;\n        var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0;\n\n        var stagger = {};\n        if (itemIndex > 0) {\n          var staggerClassName = className + '-stagger';\n          var staggerCacheKey = cacheKey + ' ' + staggerClassName;\n          var applyClasses = !lookupCache[staggerCacheKey];\n\n          applyClasses && $$jqLite.addClass(element, staggerClassName);\n\n          stagger = getElementAnimationDetails(element, staggerCacheKey);\n\n          applyClasses && $$jqLite.removeClass(element, staggerClassName);\n        }\n\n        $$jqLite.addClass(element, className);\n\n        var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {};\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n        var transitionDuration = timings.transitionDuration;\n        var animationDuration = timings.animationDuration;\n\n        if (structural && transitionDuration === 0 && animationDuration === 0) {\n          $$jqLite.removeClass(element, className);\n          return false;\n        }\n\n        var blockTransition = styles || (structural && transitionDuration > 0);\n        var blockAnimation = animationDuration > 0 &&\n                             stagger.animationDelay > 0 &&\n                             stagger.animationDuration === 0;\n\n        var closeAnimationFns = formerData.closeAnimationFns || [];\n        element.data(NG_ANIMATE_CSS_DATA_KEY, {\n          stagger: stagger,\n          cacheKey: eventCacheKey,\n          running: formerData.running || 0,\n          itemIndex: itemIndex,\n          blockTransition: blockTransition,\n          closeAnimationFns: closeAnimationFns\n        });\n\n        var node = extractElementNode(element);\n\n        if (blockTransition) {\n          blockTransitions(node, true);\n          if (styles) {\n            element.css(styles);\n          }\n        }\n\n        if (blockAnimation) {\n          blockAnimations(node, true);\n        }\n\n        return true;\n      }\n\n      function animateRun(animationEvent, element, className, activeAnimationComplete, styles) {\n        var node = extractElementNode(element);\n        var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if (node.getAttribute('class').indexOf(className) == -1 || !elementData) {\n          activeAnimationComplete();\n          return;\n        }\n\n        var activeClassName = '';\n        var pendingClassName = '';\n        forEach(className.split(' '), function(klass, i) {\n          var prefix = (i > 0 ? ' ' : '') + klass;\n          activeClassName += prefix + '-active';\n          pendingClassName += prefix + '-pending';\n        });\n\n        var style = '';\n        var appliedStyles = [];\n        var itemIndex = elementData.itemIndex;\n        var stagger = elementData.stagger;\n        var staggerTime = 0;\n        if (itemIndex > 0) {\n          var transitionStaggerDelay = 0;\n          if (stagger.transitionDelay > 0 && stagger.transitionDuration === 0) {\n            transitionStaggerDelay = stagger.transitionDelay * itemIndex;\n          }\n\n          var animationStaggerDelay = 0;\n          if (stagger.animationDelay > 0 && stagger.animationDuration === 0) {\n            animationStaggerDelay = stagger.animationDelay * itemIndex;\n            appliedStyles.push(CSS_PREFIX + 'animation-play-state');\n          }\n\n          staggerTime = Math.round(Math.max(transitionStaggerDelay, animationStaggerDelay) * 100) / 100;\n        }\n\n        if (!staggerTime) {\n          $$jqLite.addClass(element, activeClassName);\n          if (elementData.blockTransition) {\n            blockTransitions(node, false);\n          }\n        }\n\n        var eventCacheKey = elementData.cacheKey + ' ' + activeClassName;\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n        var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration);\n        if (maxDuration === 0) {\n          $$jqLite.removeClass(element, activeClassName);\n          animateClose(element, className);\n          activeAnimationComplete();\n          return;\n        }\n\n        if (!staggerTime && styles && Object.keys(styles).length > 0) {\n          if (!timings.transitionDuration) {\n            element.css('transition', timings.animationDuration + 's linear all');\n            appliedStyles.push('transition');\n          }\n          element.css(styles);\n        }\n\n        var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay);\n        var maxDelayTime = maxDelay * ONE_SECOND;\n\n        if (appliedStyles.length > 0) {\n          //the element being animated may sometimes contain comment nodes in\n          //the jqLite object, so we're safe to use a single variable to house\n          //the styles since there is always only one element being animated\n          var oldStyle = node.getAttribute('style') || '';\n          if (oldStyle.charAt(oldStyle.length - 1) !== ';') {\n            oldStyle += ';';\n          }\n          node.setAttribute('style', oldStyle + ' ' + style);\n        }\n\n        var startTime = Date.now();\n        var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT;\n        var animationTime     = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER;\n        var totalTime         = (staggerTime + animationTime) * ONE_SECOND;\n\n        var staggerTimeout;\n        if (staggerTime > 0) {\n          $$jqLite.addClass(element, pendingClassName);\n          staggerTimeout = $timeout(function() {\n            staggerTimeout = null;\n\n            if (timings.transitionDuration > 0) {\n              blockTransitions(node, false);\n            }\n            if (timings.animationDuration > 0) {\n              blockAnimations(node, false);\n            }\n\n            $$jqLite.addClass(element, activeClassName);\n            $$jqLite.removeClass(element, pendingClassName);\n\n            if (styles) {\n              if (timings.transitionDuration === 0) {\n                element.css('transition', timings.animationDuration + 's linear all');\n              }\n              element.css(styles);\n              appliedStyles.push('transition');\n            }\n          }, staggerTime * ONE_SECOND, false);\n        }\n\n        element.on(css3AnimationEvents, onAnimationProgress);\n        elementData.closeAnimationFns.push(function() {\n          onEnd();\n          activeAnimationComplete();\n        });\n\n        elementData.running++;\n        animationCloseHandler(element, totalTime);\n        return onEnd;\n\n        // This will automatically be called by $animate so\n        // there is no need to attach this internally to the\n        // timeout done method.\n        function onEnd() {\n          element.off(css3AnimationEvents, onAnimationProgress);\n          $$jqLite.removeClass(element, activeClassName);\n          $$jqLite.removeClass(element, pendingClassName);\n          if (staggerTimeout) {\n            $timeout.cancel(staggerTimeout);\n          }\n          animateClose(element, className);\n          var node = extractElementNode(element);\n          for (var i in appliedStyles) {\n            node.style.removeProperty(appliedStyles[i]);\n          }\n        }\n\n        function onAnimationProgress(event) {\n          event.stopPropagation();\n          var ev = event.originalEvent || event;\n          var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();\n\n          /* Firefox (or possibly just Gecko) likes to not round values up\n           * when a ms measurement is used for the animation */\n          var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n          /* $manualTimeStamp is a mocked timeStamp value which is set\n           * within browserTrigger(). This is only here so that tests can\n           * mock animations properly. Real events fallback to event.timeStamp,\n           * or, if they don't, then a timeStamp is automatically created for them.\n           * We're checking to see if the timeStamp surpasses the expected delay,\n           * but we're using elapsedTime instead of the timeStamp on the 2nd\n           * pre-condition since animations sometimes close off early */\n          if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n            activeAnimationComplete();\n          }\n        }\n      }\n\n      function blockTransitions(node, bool) {\n        node.style[TRANSITION_PROP + PROPERTY_KEY] = bool ? 'none' : '';\n      }\n\n      function blockAnimations(node, bool) {\n        node.style[ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY] = bool ? 'paused' : '';\n      }\n\n      function animateBefore(animationEvent, element, className, styles) {\n        if (animateSetup(animationEvent, element, className, styles)) {\n          return function(cancelled) {\n            cancelled && animateClose(element, className);\n          };\n        }\n      }\n\n      function animateAfter(animationEvent, element, className, afterAnimationComplete, styles) {\n        if (element.data(NG_ANIMATE_CSS_DATA_KEY)) {\n          return animateRun(animationEvent, element, className, afterAnimationComplete, styles);\n        } else {\n          animateClose(element, className);\n          afterAnimationComplete();\n        }\n      }\n\n      function animate(animationEvent, element, className, animationComplete, options) {\n        //If the animateSetup function doesn't bother returning a\n        //cancellation function then it means that there is no animation\n        //to perform at all\n        var preReflowCancellation = animateBefore(animationEvent, element, className, options.from);\n        if (!preReflowCancellation) {\n          clearCacheAfterReflow();\n          animationComplete();\n          return;\n        }\n\n        //There are two cancellation functions: one is before the first\n        //reflow animation and the second is during the active state\n        //animation. The first function will take care of removing the\n        //data from the element which will not make the 2nd animation\n        //happen in the first place\n        var cancel = preReflowCancellation;\n        afterReflow(element, function() {\n          //once the reflow is complete then we point cancel to\n          //the new cancellation function which will remove all of the\n          //animation properties from the active animation\n          cancel = animateAfter(animationEvent, element, className, animationComplete, options.to);\n        });\n\n        return function(cancelled) {\n          (cancel || noop)(cancelled);\n        };\n      }\n\n      function animateClose(element, className) {\n        $$jqLite.removeClass(element, className);\n        var data = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if (data) {\n          if (data.running) {\n            data.running--;\n          }\n          if (!data.running || data.running === 0) {\n            element.removeData(NG_ANIMATE_CSS_DATA_KEY);\n          }\n        }\n      }\n\n      return {\n        animate: function(element, className, from, to, animationCompleted, options) {\n          options = options || {};\n          options.from = from;\n          options.to = to;\n          return animate('animate', element, className, animationCompleted, options);\n        },\n\n        enter: function(element, animationCompleted, options) {\n          options = options || {};\n          return animate('enter', element, 'ng-enter', animationCompleted, options);\n        },\n\n        leave: function(element, animationCompleted, options) {\n          options = options || {};\n          return animate('leave', element, 'ng-leave', animationCompleted, options);\n        },\n\n        move: function(element, animationCompleted, options) {\n          options = options || {};\n          return animate('move', element, 'ng-move', animationCompleted, options);\n        },\n\n        beforeSetClass: function(element, add, remove, animationCompleted, options) {\n          options = options || {};\n          var className = suffixClasses(remove, '-remove') + ' ' +\n                          suffixClasses(add, '-add');\n          var cancellationMethod = animateBefore('setClass', element, className, options.from);\n          if (cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          clearCacheAfterReflow();\n          animationCompleted();\n        },\n\n        beforeAddClass: function(element, className, animationCompleted, options) {\n          options = options || {};\n          var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), options.from);\n          if (cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          clearCacheAfterReflow();\n          animationCompleted();\n        },\n\n        beforeRemoveClass: function(element, className, animationCompleted, options) {\n          options = options || {};\n          var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), options.from);\n          if (cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          clearCacheAfterReflow();\n          animationCompleted();\n        },\n\n        setClass: function(element, add, remove, animationCompleted, options) {\n          options = options || {};\n          remove = suffixClasses(remove, '-remove');\n          add = suffixClasses(add, '-add');\n          var className = remove + ' ' + add;\n          return animateAfter('setClass', element, className, animationCompleted, options.to);\n        },\n\n        addClass: function(element, className, animationCompleted, options) {\n          options = options || {};\n          return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted, options.to);\n        },\n\n        removeClass: function(element, className, animationCompleted, options) {\n          options = options || {};\n          return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted, options.to);\n        }\n      };\n\n      function suffixClasses(classes, suffix) {\n        var className = '';\n        classes = isArray(classes) ? classes : classes.split(/\\s+/);\n        forEach(classes, function(klass, i) {\n          if (klass && klass.length > 0) {\n            className += (i > 0 ? ' ' : '') + klass + suffix;\n          }\n        });\n        return className;\n      }\n    }]);\n  }]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/bower.json",
    "content": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-animate.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/index.js",
    "content": "require('./angular-animate');\nmodule.exports = 'ngAnimate';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-animate/package.json",
    "content": "{\n  \"name\": \"angular-animate\",\n  \"version\": \"1.3.15\",\n  \"description\": \"AngularJS module for animations\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"animation\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/.bower.json",
    "content": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-aria.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  },\n  \"homepage\": \"https://github.com/angular/bower-angular-aria\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"d838769dec2546c1c80f7ccfa96f9d9b0989ea90\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular-aria.git\",\n  \"_target\": \"1.3.x\",\n  \"_originalSource\": \"angular-aria\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/README.md",
    "content": "# packaged angular-aria\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAria).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-aria\n```\nThen add `ngAria` as a dependency for your app:\n\n```javascript\nangular.module('myApp', [require('angular-aria')]);\n```\n\n### bower\n\n```shell\nbower install angular-aria\n```\n\nAdd a `<script>` to your `index.html`:\n\n```html\n<script src=\"/bower_components/angular-aria/angular-aria.js\"></script>\n```\n\nThen add `ngAria` as a dependency for your app:\n\n```javascript\nangular.module('myApp', ['ngAria']);\n```\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](http://docs.angularjs.org/api/ngAria).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/angular-aria.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngAria\n * @description\n *\n * The `ngAria` module provides support for common\n * [<abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)\n * attributes that convey state or semantic information about the application for users\n * of assistive technologies, such as screen readers.\n *\n * <div doc-module-components=\"ngAria\"></div>\n *\n * ## Usage\n *\n * For ngAria to do its magic, simply include the module as a dependency. The directives supported\n * by ngAria are:\n * `ngModel`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`, `ngDblClick`, and `ngMessages`.\n *\n * Below is a more detailed breakdown of the attributes handled by ngAria:\n *\n * | Directive                                   | Supported Attributes                                                                   |\n * |---------------------------------------------|----------------------------------------------------------------------------------------|\n * | {@link ng.directive:ngDisabled ngDisabled}  | aria-disabled                                                                          |\n * | {@link ng.directive:ngShow ngShow}          | aria-hidden                                                                            |\n * | {@link ng.directive:ngHide ngHide}          | aria-hidden                                                                            |\n * | {@link ng.directive:ngDblclick ngDblclick}  | tabindex                                                                               |\n * | {@link module:ngMessages ngMessages}        | aria-live                                                                              |\n * | {@link ng.directive:ngModel ngModel}        | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles |\n * | {@link ng.directive:ngClick ngClick}        | tabindex, keypress event, button role                                                               |\n *\n * Find out more information about each directive by reading the\n * {@link guide/accessibility ngAria Developer Guide}.\n *\n * ##Example\n * Using ngDisabled with ngAria:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\">\n * ```\n * Becomes:\n * ```html\n * <md-checkbox ng-disabled=\"disabled\" aria-disabled=\"true\">\n * ```\n *\n * ##Disabling Attributes\n * It's possible to disable individual attributes added by ngAria with the\n * {@link ngAria.$ariaProvider#config config} method. For more details, see the\n * {@link guide/accessibility Developer Guide}.\n */\n /* global -ngAriaModule */\nvar ngAriaModule = angular.module('ngAria', ['ng']).\n                        provider('$aria', $AriaProvider);\n\n/**\n * @ngdoc provider\n * @name $ariaProvider\n *\n * @description\n *\n * Used for configuring the ARIA attributes injected and managed by ngAria.\n *\n * ```js\n * angular.module('myApp', ['ngAria'], function config($ariaProvider) {\n *   $ariaProvider.config({\n *     ariaValue: true,\n *     tabindex: false\n *   });\n * });\n *```\n *\n * ## Dependencies\n * Requires the {@link ngAria} module to be installed.\n *\n */\nfunction $AriaProvider() {\n  var config = {\n    ariaHidden: true,\n    ariaChecked: true,\n    ariaDisabled: true,\n    ariaRequired: true,\n    ariaInvalid: true,\n    ariaMultiline: true,\n    ariaValue: true,\n    tabindex: true,\n    bindKeypress: true\n  };\n\n  /**\n   * @ngdoc method\n   * @name $ariaProvider#config\n   *\n   * @param {object} config object to enable/disable specific ARIA attributes\n   *\n   *  - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags\n   *  - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags\n   *  - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags\n   *  - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags\n   *  - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags\n   *  - **ariaMultiline** – `{boolean}` – Enables/disables aria-multiline tags\n   *  - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and aria-valuenow tags\n   *  - **tabindex** – `{boolean}` – Enables/disables tabindex tags\n   *  - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on `&lt;div&gt;` and\n   *    `&lt;li&gt;` elements with ng-click\n   *\n   * @description\n   * Enables/disables various ARIA attributes\n   */\n  this.config = function(newConfig) {\n    config = angular.extend(config, newConfig);\n  };\n\n  function watchExpr(attrName, ariaAttr, negate) {\n    return function(scope, elem, attr) {\n      var ariaCamelName = attr.$normalize(ariaAttr);\n      if (config[ariaCamelName] && !attr[ariaCamelName]) {\n        scope.$watch(attr[attrName], function(boolVal) {\n          if (negate) {\n            boolVal = !boolVal;\n          }\n          elem.attr(ariaAttr, boolVal);\n        });\n      }\n    };\n  }\n\n  /**\n   * @ngdoc service\n   * @name $aria\n   *\n   * @description\n   * @priority 200\n   *\n   * The $aria service contains helper methods for applying common\n   * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.\n   *\n   * ngAria injects common accessibility attributes that tell assistive technologies when HTML\n   * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,\n   * let's review a code snippet from ngAria itself:\n   *\n   *```js\n   * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {\n   *   return $aria.$$watchExpr('ngDisabled', 'aria-disabled');\n   * }])\n   *```\n   * Shown above, the ngAria module creates a directive with the same signature as the\n   * traditional `ng-disabled` directive. But this ngAria version is dedicated to\n   * solely managing accessibility attributes. The internal `$aria` service is used to watch the\n   * boolean attribute `ngDisabled`. If it has not been explicitly set by the developer,\n   * `aria-disabled` is injected as an attribute with its value synchronized to the value in\n   * `ngDisabled`.\n   *\n   * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do\n   * anything to enable this feature. The `aria-disabled` attribute is automatically managed\n   * simply as a silent side-effect of using `ng-disabled` with the ngAria module.\n   *\n   * The full list of directives that interface with ngAria:\n   * * **ngModel**\n   * * **ngShow**\n   * * **ngHide**\n   * * **ngClick**\n   * * **ngDblclick**\n   * * **ngMessages**\n   * * **ngDisabled**\n   *\n   * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each\n   * directive.\n   *\n   *\n   * ## Dependencies\n   * Requires the {@link ngAria} module to be installed.\n   */\n  this.$get = function() {\n    return {\n      config: function(key) {\n        return config[key];\n      },\n      $$watchExpr: watchExpr\n    };\n  };\n}\n\n\nngAriaModule.directive('ngShow', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngShow', 'aria-hidden', true);\n}])\n.directive('ngHide', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngHide', 'aria-hidden', false);\n}])\n.directive('ngModel', ['$aria', function($aria) {\n\n  function shouldAttachAttr(attr, normalizedAttr, elem) {\n    return $aria.config(normalizedAttr) && !elem.attr(attr);\n  }\n\n  function shouldAttachRole(role, elem) {\n    return !elem.attr('role') && (elem.attr('type') === role) && (elem[0].nodeName !== 'INPUT');\n  }\n\n  function getShape(attr, elem) {\n    var type = attr.type,\n        role = attr.role;\n\n    return ((type || role) === 'checkbox' || role === 'menuitemcheckbox') ? 'checkbox' :\n           ((type || role) === 'radio'    || role === 'menuitemradio') ? 'radio' :\n           (type === 'range'              || role === 'progressbar' || role === 'slider') ? 'range' :\n           (type || role) === 'textbox'   || elem[0].nodeName === 'TEXTAREA' ? 'multiline' : '';\n  }\n\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    priority: 200, //Make sure watches are fired after any other directives that affect the ngModel value\n    link: function(scope, elem, attr, ngModel) {\n      var shape = getShape(attr, elem);\n      var needsTabIndex = shouldAttachAttr('tabindex', 'tabindex', elem);\n\n      function ngAriaWatchModelValue() {\n        return ngModel.$modelValue;\n      }\n\n      function getRadioReaction() {\n        if (needsTabIndex) {\n          needsTabIndex = false;\n          return function ngAriaRadioReaction(newVal) {\n            var boolVal = (attr.value == ngModel.$viewValue);\n            elem.attr('aria-checked', boolVal);\n            elem.attr('tabindex', 0 - !boolVal);\n          };\n        } else {\n          return function ngAriaRadioReaction(newVal) {\n            elem.attr('aria-checked', (attr.value == ngModel.$viewValue));\n          };\n        }\n      }\n\n      function ngAriaCheckboxReaction(newVal) {\n        elem.attr('aria-checked', !ngModel.$isEmpty(ngModel.$viewValue));\n      }\n\n      switch (shape) {\n        case 'radio':\n        case 'checkbox':\n          if (shouldAttachRole(shape, elem)) {\n            elem.attr('role', shape);\n          }\n          if (shouldAttachAttr('aria-checked', 'ariaChecked', elem)) {\n            scope.$watch(ngAriaWatchModelValue, shape === 'radio' ?\n                getRadioReaction() : ngAriaCheckboxReaction);\n          }\n          break;\n        case 'range':\n          if (shouldAttachRole(shape, elem)) {\n            elem.attr('role', 'slider');\n          }\n          if ($aria.config('ariaValue')) {\n            if (attr.min && !elem.attr('aria-valuemin')) {\n              elem.attr('aria-valuemin', attr.min);\n            }\n            if (attr.max && !elem.attr('aria-valuemax')) {\n              elem.attr('aria-valuemax', attr.max);\n            }\n            if (!elem.attr('aria-valuenow')) {\n              scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {\n                elem.attr('aria-valuenow', newVal);\n              });\n            }\n          }\n          break;\n        case 'multiline':\n          if (shouldAttachAttr('aria-multiline', 'ariaMultiline', elem)) {\n            elem.attr('aria-multiline', true);\n          }\n          break;\n      }\n\n      if (needsTabIndex) {\n        elem.attr('tabindex', 0);\n      }\n\n      if (ngModel.$validators.required && shouldAttachAttr('aria-required', 'ariaRequired', elem)) {\n        scope.$watch(function ngAriaRequiredWatch() {\n          return ngModel.$error.required;\n        }, function ngAriaRequiredReaction(newVal) {\n          elem.attr('aria-required', !!newVal);\n        });\n      }\n\n      if (shouldAttachAttr('aria-invalid', 'ariaInvalid', elem)) {\n        scope.$watch(function ngAriaInvalidWatch() {\n          return ngModel.$invalid;\n        }, function ngAriaInvalidReaction(newVal) {\n          elem.attr('aria-invalid', !!newVal);\n        });\n      }\n    }\n  };\n}])\n.directive('ngDisabled', ['$aria', function($aria) {\n  return $aria.$$watchExpr('ngDisabled', 'aria-disabled');\n}])\n.directive('ngMessages', function() {\n  return {\n    restrict: 'A',\n    require: '?ngMessages',\n    link: function(scope, elem, attr, ngMessages) {\n      if (!elem.attr('aria-live')) {\n        elem.attr('aria-live', 'assertive');\n      }\n    }\n  };\n})\n.directive('ngClick',['$aria', '$parse', function($aria, $parse) {\n  return {\n    restrict: 'A',\n    compile: function(elem, attr) {\n      var fn = $parse(attr.ngClick, /* interceptorFn */ null, /* expensiveChecks */ true);\n      return function(scope, elem, attr) {\n\n        var nodeBlackList = ['BUTTON', 'A', 'INPUT', 'TEXTAREA'];\n\n        function isNodeOneOf(elem, nodeTypeArray) {\n          if (nodeTypeArray.indexOf(elem[0].nodeName) !== -1) {\n            return true;\n          }\n        }\n        if (!elem.attr('role') && !isNodeOneOf(elem, nodeBlackList)) {\n          elem.attr('role', 'button');\n        }\n\n        if ($aria.config('tabindex') && !elem.attr('tabindex')) {\n          elem.attr('tabindex', 0);\n        }\n\n        if ($aria.config('bindKeypress') && !attr.ngKeypress && !isNodeOneOf(elem, nodeBlackList)) {\n          elem.on('keypress', function(event) {\n            if (event.keyCode === 32 || event.keyCode === 13) {\n              scope.$apply(callback);\n            }\n\n            function callback() {\n              fn(scope, { $event: event });\n            }\n          });\n        }\n      };\n    }\n  };\n}])\n.directive('ngDblclick', ['$aria', function($aria) {\n  return function(scope, elem, attr) {\n    if ($aria.config('tabindex') && !elem.attr('tabindex')) {\n      elem.attr('tabindex', 0);\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/bower.json",
    "content": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-aria.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/index.js",
    "content": "require('./angular-aria');\nmodule.exports = 'ngAria';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-aria/package.json",
    "content": "{\n  \"name\": \"angular-aria\",\n  \"version\": \"1.3.15\",\n  \"description\": \"AngularJS module for making accessibility easy\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"accessibility\",\n    \"a11y\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/.bower.json",
    "content": "{\n  \"name\": \"angular-cookies\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-cookies.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  },\n  \"homepage\": \"https://github.com/angular/bower-angular-cookies\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"846700fd8e45eefa1a43cf1865bcb7aaf95a68e0\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular-cookies.git\",\n  \"_target\": \"1.3.x\",\n  \"_originalSource\": \"angular-cookies\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/README.md",
    "content": "# packaged angular-cookies\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngCookies).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-cookies\n```\n\nThen add `ngCookies` as a dependency for your app:\n\n```javascript\nangular.module('myApp', [require('angular-cookies')]);\n```\n\n### bower\n\n```shell\nbower install angular-cookies\n```\n\nAdd a `<script>` to your `index.html`:\n\n```html\n<script src=\"/bower_components/angular-cookies/angular-cookies.js\"></script>\n```\n\nThen add `ngCookies` as a dependency for your app:\n\n```javascript\nangular.module('myApp', ['ngCookies']);\n```\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](http://docs.angularjs.org/api/ngCookies).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/angular-cookies.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngCookies\n * @description\n *\n * # ngCookies\n *\n * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.\n *\n *\n * <div doc-module-components=\"ngCookies\"></div>\n *\n * See {@link ngCookies.$cookies `$cookies`} and\n * {@link ngCookies.$cookieStore `$cookieStore`} for usage.\n */\n\n\nangular.module('ngCookies', ['ng']).\n  /**\n   * @ngdoc service\n   * @name $cookies\n   *\n   * @description\n   * Provides read/write access to browser's cookies.\n   *\n   * Only a simple Object is exposed and by adding or removing properties to/from this object, new\n   * cookies are created/deleted at the end of current $eval.\n   * The object's properties can only be strings.\n   *\n   * Requires the {@link ngCookies `ngCookies`} module to be installed.\n   *\n   * @example\n   *\n   * ```js\n   * angular.module('cookiesExample', ['ngCookies'])\n   *   .controller('ExampleController', ['$cookies', function($cookies) {\n   *     // Retrieving a cookie\n   *     var favoriteCookie = $cookies.myFavorite;\n   *     // Setting a cookie\n   *     $cookies.myFavorite = 'oatmeal';\n   *   }]);\n   * ```\n   */\n   factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) {\n      var cookies = {},\n          lastCookies = {},\n          lastBrowserCookies,\n          runEval = false,\n          copy = angular.copy,\n          isUndefined = angular.isUndefined;\n\n      //creates a poller fn that copies all cookies from the $browser to service & inits the service\n      $browser.addPollFn(function() {\n        var currentCookies = $browser.cookies();\n        if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl\n          lastBrowserCookies = currentCookies;\n          copy(currentCookies, lastCookies);\n          copy(currentCookies, cookies);\n          if (runEval) $rootScope.$apply();\n        }\n      })();\n\n      runEval = true;\n\n      //at the end of each eval, push cookies\n      //TODO: this should happen before the \"delayed\" watches fire, because if some cookies are not\n      //      strings or browser refuses to store some cookies, we update the model in the push fn.\n      $rootScope.$watch(push);\n\n      return cookies;\n\n\n      /**\n       * Pushes all the cookies from the service to the browser and verifies if all cookies were\n       * stored.\n       */\n      function push() {\n        var name,\n            value,\n            browserCookies,\n            updated;\n\n        //delete any cookies deleted in $cookies\n        for (name in lastCookies) {\n          if (isUndefined(cookies[name])) {\n            $browser.cookies(name, undefined);\n          }\n        }\n\n        //update all cookies updated in $cookies\n        for (name in cookies) {\n          value = cookies[name];\n          if (!angular.isString(value)) {\n            value = '' + value;\n            cookies[name] = value;\n          }\n          if (value !== lastCookies[name]) {\n            $browser.cookies(name, value);\n            updated = true;\n          }\n        }\n\n        //verify what was actually stored\n        if (updated) {\n          updated = false;\n          browserCookies = $browser.cookies();\n\n          for (name in cookies) {\n            if (cookies[name] !== browserCookies[name]) {\n              //delete or reset all cookies that the browser dropped from $cookies\n              if (isUndefined(browserCookies[name])) {\n                delete cookies[name];\n              } else {\n                cookies[name] = browserCookies[name];\n              }\n              updated = true;\n            }\n          }\n        }\n      }\n    }]).\n\n\n  /**\n   * @ngdoc service\n   * @name $cookieStore\n   * @requires $cookies\n   *\n   * @description\n   * Provides a key-value (string-object) storage, that is backed by session cookies.\n   * Objects put or retrieved from this storage are automatically serialized or\n   * deserialized by angular's toJson/fromJson.\n   *\n   * Requires the {@link ngCookies `ngCookies`} module to be installed.\n   *\n   * @example\n   *\n   * ```js\n   * angular.module('cookieStoreExample', ['ngCookies'])\n   *   .controller('ExampleController', ['$cookieStore', function($cookieStore) {\n   *     // Put cookie\n   *     $cookieStore.put('myFavorite','oatmeal');\n   *     // Get cookie\n   *     var favoriteCookie = $cookieStore.get('myFavorite');\n   *     // Removing a cookie\n   *     $cookieStore.remove('myFavorite');\n   *   }]);\n   * ```\n   */\n   factory('$cookieStore', ['$cookies', function($cookies) {\n\n      return {\n        /**\n         * @ngdoc method\n         * @name $cookieStore#get\n         *\n         * @description\n         * Returns the value of given cookie key\n         *\n         * @param {string} key Id to use for lookup.\n         * @returns {Object} Deserialized cookie value.\n         */\n        get: function(key) {\n          var value = $cookies[key];\n          return value ? angular.fromJson(value) : value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookieStore#put\n         *\n         * @description\n         * Sets a value for given cookie key\n         *\n         * @param {string} key Id for the `value`.\n         * @param {Object} value Value to be stored.\n         */\n        put: function(key, value) {\n          $cookies[key] = angular.toJson(value);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cookieStore#remove\n         *\n         * @description\n         * Remove given cookie\n         *\n         * @param {string} key Id of the key-value pair to delete.\n         */\n        remove: function(key) {\n          delete $cookies[key];\n        }\n      };\n\n    }]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/bower.json",
    "content": "{\n  \"name\": \"angular-cookies\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-cookies.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/index.js",
    "content": "require('./angular-cookies');\nmodule.exports = 'ngCookies';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-cookies/package.json",
    "content": "{\n  \"name\": \"angular-cookies\",\n  \"version\": \"1.3.15\",\n  \"description\": \"AngularJS module for cookies\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"cookies\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-css/.bower.json",
    "content": "{\n  \"name\": \"angular-css\",\n  \"main\": \"./angular-css.js\",\n  \"version\": \"1.0.7\",\n  \"homepage\": \"http://door3.github.io/angular-css\",\n  \"authors\": [\n    \"Alex Castillo <alex@castillo.io>\"\n  ],\n  \"description\": \"CSS on-demand for AngularJS\",\n  \"keywords\": [\n    \"angularjs\",\n    \"ng-route\",\n    \"ui-router\",\n    \"css\"\n  ],\n  \"dependencies\": {\n    \"angular\": \">= 1.3.0\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/door3/angular-css\"\n  },\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"component.json\",\n    \"package.json\",\n    \"lib\",\n    \"config\",\n    \"demo\",\n    \"test\",\n    \"tests\"\n  ],\n  \"_release\": \"1.0.7\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.0.7\",\n    \"commit\": \"06232156c8c21aeee0626a3a6bf4d0499516c7e8\"\n  },\n  \"_source\": \"git://github.com/door3/angular-css.git\",\n  \"_target\": \"1.0.x\",\n  \"_originalSource\": \"angular-css\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-css/Gruntfile.js",
    "content": "'use strict';\n\nmodule.exports = function(grunt) {\n    grunt.initConfig({\n        pkg: grunt.file.readJSON('package.json'),\n\n        karma: {\n            unit: {\n                options: {\n                    files: [\n                        'node_modules/angular/angular.js',\n                        'node_modules/angular-mocks/angular-mocks.js',\n                        'node_modules/chai/chai.js',\n                        'angular-css.js',\n                        'test/spec.js'\n                    ]\n                },\n\n                frameworks: ['mocha'],\n\n                browsers: [\n                    'Chrome',\n                    'PhantomJS',\n                    'Firefox'\n                ],\n\n                singleRun: true\n            }\n        },\n\n        uglify: {\n            options: {\n                banner: '/*! <%= pkg.name %> <%= pkg.version %> | Copyright (c) <%= grunt.template.today(\"yyyy\") %> DOOR3, Alex Castillo | MIT License */'\n            },\n\n            build: {\n                src: '<%= pkg.name %>.js',\n                dest: '<%= pkg.name %>.min.js'\n            }\n        }\n    });\n\n    grunt.loadNpmTasks('grunt-contrib-uglify');\n    grunt.loadNpmTasks('grunt-karma');\n\n    grunt.registerTask('test', ['karma']);\n\n    grunt.registerTask('default', [\n        'test',\n        'uglify'\n    ]);\n};\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-css/LICENSE.txt",
    "content": "The MIT License\n\nCopyright (c) 2014 DOOR3, Alex Castillo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "third_party/ui/bower_components/angular-css/README.md",
    "content": "# AngularCSS\n\n##### CSS on-demand for AngularJS\nOptimize the presentation layer of your single-page apps by dynamically injecting stylesheets as needed.\n\nAngularCSS listens for [route](https://github.com/angular/bower-angular-route) (or [states](https://github.com/angular-ui/ui-router)) change events, adds the CSS defined on the current route and removes the CSS from the previous route. It also works with directives in the same fashion with the compile and scope destroy events. See the code samples below for more details.\n\n##### Read the Article\n\n[Introducing AngularCSS: CSS On-Demand for AngularJS](http://door3.com/insights/introducing-angularcss-css-demand-angularjs)\n\n### Demos\n\n[Angular's ngRoute Demo](http://door3.github.io/angular-css) ([source](../gh-pages/app.routes.js))\n\n[UI Router Demo](http://door3.github.io/angular-css/states.html) ([source](../gh-pages/app.states.js))\n\n\n### Quick Start\n\nInstall and manage with [Bower](http://bower.io). A [CDN](http://cdnjs.com/libraries/angular-css) is also provided by cdnjs.com\n\n``` bash\n$ bower install angular-css\n```\n\n\n1) Include the required JavaScript libraries in your `index.html` (ngRoute and UI Router are optional). \n\n``` html\n<script src=\"/libs/angularjs/1.3.7/angular.min.js\"></script>\n<script src=\"/libs/angularjs/1.3.7/angular-routes.min.js\"></script>\n<script src=\"/libs/angular-css/angular-css.min.js\"></script>\n```\n\n2) Add `door3.css` as a dependency for your app.\n\n``` js\nvar myApp = angular.module('myApp', ['ngRoute','door3.css']);\n```\n\n### Examples\n\nThis module can be used by adding a css property in your routes values, directives or by calling the `$css` service methods from controllers and services.\n\nThe css property supports a string, an array of strings, object notation or an array of objects.\n\nSee examples below for more information.\n\n\n#### In Directives\n\n``` js\nmyApp.directive('myDirective', function () {\n  return {\n    restrict: 'E',\n    templateUrl: 'my-directive/my-directive.html',\n    /* Binding css to directives */\n    css: 'my-directive/my-directive.css'\n  }\n});\n```\n\n\n#### In Controllers\n\n``` js\nmyApp.controller('pageCtrl', function ($scope, $css) {\n\n  // Binds stylesheet(s) to scope create/destroy events (recommended over add/remove)\n  $css.bind({ \n    href: 'my-page/my-page.css'\n  }, $scope);\n\n  // Simply add stylesheet(s)\n  $css.add('my-page/my-page.css');\n\n  // Simply remove stylesheet(s)\n  $css.remove(['my-page/my-page.css','my-page/my-page2.css']);\n\n  // Remove all stylesheets\n  $css.removeAll();\n\n});\n```\n\n\n#### For Routes (Angular's ngRoute)\n\nRequires [ngRoute](https://github.com/angular/bower-angular-route) as a dependency\n\n\n``` js\nmyApp.config(function($routeProvider) {\n\n  $routeProvider\n    .when('/page1', {\n      templateUrl: 'page1/page1.html',\n      controller: 'page1Ctrl',\n      /* Now you can bind css to routes */\n      css: 'page1/page1.css'\n    })\n    .when('/page2', {\n      templateUrl: 'page2/page2.html',\n      controller: 'page2Ctrl',\n      /* You can also enable features like bust cache, persist and preload */\n      css: {\n        href: 'page2/page2.css',\n        bustCache: true\n      }\n    })\n    .when('/page3', {\n      templateUrl: 'page3/page3.html',\n      controller: 'page3Ctrl',\n      /* This is how you can include multiple stylesheets */\n      css: ['page3/page3.css','page3/page3-2.css']\n    })\n    .when('/page4', {\n      templateUrl: 'page4/page4.html',\n      controller: 'page4Ctrl',\n      css: [\n        {\n          href: 'page4/page4.css',\n          persist: true\n        }, {\n          href: 'page4/page4.mobile.css',\n          /* Media Query support via window.matchMedia API\n           * This will only add the stylesheet if the breakpoint matches */\n          media: 'screen and (max-width : 768px)'\n        }, {\n          href: 'page4/page4.print.css',\n          media: 'print'\n        }\n      ]\n    });\n\n});\n```\n\n#### For States (UI Router)\n\nRequires [ui.router](https://github.com/angular-ui/ui-router) as a dependency\n\n\n``` js\nmyApp.config(function($stateProvider) {\n\n  $stateProvider\n    .state('page1', {\n      url: '/page1',\n      templateUrl: 'page1/page1.html',\n      css: 'page1/page1.css'\n    })\n    .state('page2', {\n      url: '/page2',\n      templateUrl: 'page2/page2.html',\n      css: {\n        href: 'page2/page2.css',\n        preload: true,\n        persist: true\n      }\n    })\n    .state('page3', {\n      url: '/page3',\n      templateUrl: 'page3/page3.html',\n      css: ['page3/page3.css','page3/page3-2.css'],\n      views: {\n        'state1': {\n          templateUrl: 'page3/states/page3-state1.html',\n          css: 'page3/states/page3-state1.css'\n        },\n        'state2': {\n          templateUrl: 'page3/states/page3-state2.html',\n          css: ['page3/states/page3-state2.css']\n        },\n        'state3': {\n          templateUrl: 'page3/states/page3-state3.html',\n          css: {\n            href: 'page3/states/page3-state3.css'\n          }\n        }\n      }\n    })\n    .state('page4', {\n      url: '/page4',\n      templateUrl: 'page4/page4.html',\n      views: {\n        'state1': {\n          templateUrl: 'states/page4/page4-state1.html',\n          css: 'states/page4/page4-state1.css'\n        },\n        'state2': {\n          templateUrl: 'states/page4/page4-state2.html',\n          css: ['states/page4/page4-state2.css']\n        },\n        'state3': {\n          templateUrl: 'states/page4/page4-state3.html',\n          css: {\n            href: 'states/page4/page4-state3.css'\n          }\n        }\n      },\n      css: [\n        {\n          href: 'page4/page4.css',\n        }, {\n          href: 'page4/page4.mobile.css',\n          media: 'screen and (max-width : 768px)'\n        }, {\n          href: 'page4/page4.print.css',\n          media: 'print'\n        }\n      ]\n    });\n\n});\n```\n\n### Responsive Design\n\nAngularCSS supports \"smart media queries\". This means that stylesheets with media queries will be only added when the breakpoint matches.\nThis will significantly optimize the load time of your apps.\n\n```js\n$routeProvider\n  .when('/my-page', {\n    templateUrl: 'my-page/my-page.html',\n    css: [\n      {\n        href: 'my-page/my-page.mobile.css',\n        media: '(max-width: 480px)'\n      }, {\n        href: 'my-page/my-page.tablet.css',\n        media: '(min-width: 768px) and (max-width: 1024px)'\n      }, {\n        href: 'my-page/my-page.desktop.css',\n        media: '(min-width: 1224px)'\n      }\n    ]\n  });\n```\n\nEven though you can use the `media` property to specify media queries, the best way to manage your breakpoins is by settings them in the provider's defaults. For example:\n\n```js\nmyApp.config(function($routeProvider, $cssProvider) {\n\n  angular.extend($cssProvider.defaults, {\n    breakpoints: {\n      mobile: '(max-width: 480px)',\n      tablet: '(min-width: 768px) and (max-width: 1024px)',\n      desktop: '(min-width: 1224px)'\n    }\n  });\n\n  $routeProvider\n    .when('/my-page', {\n      templateUrl: 'my-page/my-page.html',\n      css: [\n        {\n          href: 'my-page/my-page.mobile.css',\n          breakpoint: 'mobile'\n        }, {\n          href: 'my-page/my-page.tablet.css',\n          breakpoint: 'tablet'\n        }, {\n          href: 'my-page/my-page.desktop.css',\n          breakpoint: 'desktop'\n        }\n      ]\n    });\n\n});\n```\n\n\n### Config\n\nYou can configure AngularCSS at the global level or at the stylesheet level.\n\n#### Configuring global options\n\nThese options are applied during the `config` phase of your app via `$cssProvider`.\n\n``` js\nmyApp.config(function($cssProvider) {\n\n  angular.extend($cssProvider.defaults, {\n    container: 'head',\n    method: 'append',\n    persist: false,\n    preload: false,\n    bustCache: false\n  });\n\n});\n```\n\n#### Configuring CSS options\n\nThese options are applied at the stylesheet level.\n\n``` js\ncss: {\n  href: 'file-path.css',\n  rel: 'stylesheet',\n  type: 'text/css',\n  media: false,\n  persist: false,\n  preload: false,\n  bustCache: false,\n  weight: 0\n}\n```\n\n### Support\n\nAngularCSS is fully supported by AngularJS 1.3+\n\nThere is partial support for AngularJS 1.2. It does not support `css` property via DDO (Directive Definition Object).\nThe workarond is to bind (or add) the CSS in the directive's controller or link function via `$css` service.\n\n``` js\nmyApp.directive('myDirective', function () {\n  return {\n    restrict: 'E',\n    templateUrl: 'my-directive/my-directive.html',\n    controller: function ($scope, $css) {\n      $css.bind('my-directive/my-directive.css', $scope);\n    }\n  }\n});\n```\n\n\n#### Browsers\n\nChrome, Firefox, Safari, iOS Safari, Android and IE9+\n\nIE9 Does not support [matchMedia](http://caniuse.com/#feat=matchmedia) API. This means that in IE9, stylesheets with media queries will be added without checking if the breakpoint matches.\n\n\n### Contributing\n\nPlease submit all pull requests the against master branch. If your pull request contains JavaScript patches or features, you should include relevant unit tests.\n\n### Copyright and license\n\n```\nThe MIT License\n\nCopyright (c) 2014 DOOR3, Alex Castillo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-css/angular-css.js",
    "content": "/**\n * AngularCSS - CSS on-demand for AngularJS\n * @version v1.0.7\n * @author DOOR3, Alex Castillo\n * @link http://door3.github.io/angular-css\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n\n'use strict';\n\n(function (angular) {\n\n  /**\n   * AngularCSS Module\n   * Contains: config, constant, provider and run\n   **/\n  var angularCSS = angular.module('door3.css', []);\n\n  // Config\n  angularCSS.config(['$logProvider', function ($logProvider) {\n    // Turn off/on in order to see console logs during dev mode\n    $logProvider.debugEnabled(false);\n  }]);\n\n  // Provider\n  angularCSS.provider('$css', [function $cssProvider() {\n\n    // Defaults - default options that can be overridden from application config\n    var defaults = this.defaults = {\n      element: 'link',\n      rel: 'stylesheet',\n      type: 'text/css',\n      container: 'head',\n      method: 'append',\n      weight: 0\n    };\n\n    this.$get = ['$rootScope','$injector','$q','$window','$timeout','$compile','$http','$filter','$log',\n                function $get($rootScope, $injector, $q, $window, $timeout, $compile, $http, $filter, $log) {\n\n      var $css = {};\n\n      var template = '<link ng-repeat=\"stylesheet in stylesheets track by $index | orderBy: \\'weight\\' \" rel=\"{{ stylesheet.rel }}\" type=\"{{ stylesheet.type }}\" ng-href=\"{{ stylesheet.href }}\" ng-attr-media=\"{{ stylesheet.media }}\">';\n\n      // Variables - default options that can be overridden from application config\n      var mediaQuery = {}, mediaQueryListener = {}, mediaQueriesToIgnore = ['print'], options = angular.extend({}, defaults),\n        container = angular.element(document.querySelector ? document.querySelector(options.container) : document.getElementsByTagName(options.container)[0]),\n        dynamicPaths = [];\n\n      // Parse all directives\n      angular.forEach($directives, function (directive, key) {\n        if (directive.hasOwnProperty('css')) {\n          $directives[key] = parse(directive.css);\n        }\n      });\n\n      /**\n       * Listen for directive add event in order to add stylesheet(s)\n       **/\n      function $directiveAddEventListener(event, directive, scope) {\n        // Binds directive's css\n        if (scope && directive.hasOwnProperty('css')) {\n          $css.bind([parse(directive.css)], scope);\n        }\n      }\n\n      /**\n       * Listen for route change event and add/remove stylesheet(s)\n       **/\n      function $routeEventListener(event, current, prev) {\n        // Removes previously added css rules\n        if (prev) {\n          $css.remove($css.getFromRoute(prev).concat(dynamicPaths));\n          // Reset dynamic paths array\n          dynamicPaths.length = 0;\n        }\n        // Adds current css rules\n        if (current) {\n          $css.add($css.getFromRoute(current));\n        }\n      }\n\n      /**\n       * Listen for state change event and add/remove stylesheet(s)\n       **/\n      function $stateEventListener(event, current, params, prev) {\n        // Removes previously added css rules\n        if (prev) {\n          $css.remove($css.getFromState(prev).concat(dynamicPaths));\n          // Reset dynamic paths array\n          dynamicPaths.length = 0;\n        }\n        // Adds current css rules\n        if (current) {\n          $css.add($css.getFromState(current));\n        }\n      }\n\n      /**\n       * Map breakpoitns defined in defaults to stylesheet media attribute\n       **/\n      function mapBreakpointToMedia(stylesheet) {\n        if (angular.isDefined(options.breakpoints)) {\n          if (stylesheet.breakpoint in options.breakpoints) {\n            stylesheet.media = options.breakpoints[stylesheet.breakpoint];\n          }\n          delete stylesheet.breakpoints;\n        } \n      }\n\n      /**\n       * Parse: returns array with full all object based on defaults\n       **/\n      function parse(obj) {\n        if (!obj) {\n          return;\n        }\n        // Function syntax\n        if (angular.isFunction(obj)) {\n          obj = angular.copy($injector.invoke(obj));\n        }\n        // String syntax\n        if (angular.isString(obj)) {\n          obj = angular.extend({\n            href: obj\n          }, options);\n        }\n        // Array of strings syntax\n        if (angular.isArray(obj) && angular.isString(obj[0])) {\n          angular.forEach(obj, function (item) {\n            obj = angular.extend({\n              href: item\n            }, options);\n          });\n        }\n        // Object syntax\n        if (angular.isObject(obj) && !angular.isArray(obj)) {\n          obj = angular.extend(obj, options);\n        }\n        // Array of objects syntax\n        if (angular.isArray(obj) && angular.isObject(obj[0])) {\n          angular.forEach(obj, function (item) {\n            obj = angular.extend(item, options);\n          });\n        }\n        // Map breakpoint to media attribute\n        mapBreakpointToMedia(obj);\n        return obj;\n      }\n\n      // Add stylesheets to scope\n      $rootScope.stylesheets = [];\n\n      // Adds compiled link tags to container element\n      container[options.method]($compile(template)($rootScope));\n\n      // Directive event listener (emulated internally)\n      $rootScope.$on('$directiveAdd', $directiveAddEventListener);\n\n      // Routes event listener ($route required)\n      $rootScope.$on('$routeChangeSuccess', $routeEventListener);\n\n      // States event listener ($state required)\n      $rootScope.$on('$stateChangeSuccess', $stateEventListener);\n\n      /**\n       * Bust Cache\n       **/\n      function bustCache(stylesheet) {\n        if (!stylesheet) {\n          return $log.error('No stylesheets provided');\n        }\n        var queryString = '?cache=';\n        // Append query string for bust cache only once\n        if (stylesheet.href.indexOf(queryString) === -1) {\n          stylesheet.href = stylesheet.href + (stylesheet.bustCache ? queryString + (new Date().getTime()) : '');\n        }\n      }\n\n      /**\n       * Filter By: returns an array of routes based on a property option\n       **/\n      function filterBy(array, prop) {\n        if (!array || !prop) {\n          return $log.error('filterBy: missing array or property');\n        }\n        return $filter('filter')(array, function (item) {\n          return item[prop];\n        });\n      }\n\n      /**\n       * Add Media Query\n       **/\n      function addViaMediaQuery(stylesheet) {\n        if (!stylesheet) {\n          return $log.error('No stylesheet provided');\n        }\n        // Media query object\n        mediaQuery[stylesheet.href] = $window.matchMedia(stylesheet.media);\n        // Media Query Listener function\n        mediaQueryListener[stylesheet.href] = function(mediaQuery) {\n          // Trigger digest\n          $timeout(function () {\n            if (mediaQuery.matches) {\n              // Add stylesheet\n              $rootScope.stylesheets.push(stylesheet);\n            } else {\n              var index = $rootScope.stylesheets.indexOf($filter('filter')($rootScope.stylesheets, {\n                href: stylesheet.href\n              })[0]);\n              // Remove stylesheet\n              if (index !== -1) {\n                $rootScope.stylesheets.splice(index, 1);\n              }\n            }\n          });\n        }\n        // Listen for media query changes\n        mediaQuery[stylesheet.href].addListener(mediaQueryListener[stylesheet.href]);\n        // Invoke first media query check\n        mediaQueryListener[stylesheet.href](mediaQuery[stylesheet.href]);\n      }\n\n      /**\n       * Remove Media Query\n       **/\n      function removeViaMediaQuery(stylesheet) {\n        if (!stylesheet) {\n          return $log.error('No stylesheet provided');\n        }\n        // Remove media query listener\n        if ($rootScope && angular.isDefined(mediaQuery)\n          && mediaQuery[stylesheet.href]\n          && angular.isDefined(mediaQueryListener)) {\n          mediaQuery[stylesheet.href].removeListener(mediaQueryListener[stylesheet.href]);\n        }\n      }\n\n      /**\n       * Is Media Query: checks for media settings, media queries to be ignore and match media support\n       **/\n      function isMediaQuery(stylesheet) {\n        if (!stylesheet) {\n          return $log.error('No stylesheet provided');\n        }\n        return !!(\n          // Check for media query setting\n          stylesheet.media\n          // Check for media queries to be ignored\n          && (mediaQueriesToIgnore.indexOf(stylesheet.media) === -1)\n          // Check for matchMedia support\n          && $window.matchMedia\n        );\n      }\n\n      /**\n       * Get From Route: returns array of css objects from single route\n       **/\n      $css.getFromRoute = function (route) {\n        if (!route) {\n          return $log.error('Get From Route: No route provided');\n        }\n        var css = null, result = [];\n        if (route.$$route && route.$$route.css) {\n          css = route.$$route.css;\n        }\n        else if (route.css) {\n          css = route.css;\n        }\n        // Adds route css rules to array\n        if (css) {\n          if (angular.isArray(css)) {\n            angular.forEach(css, function (cssItem) {\n              if (angular.isFunction(cssItem)) {\n                dynamicPaths.push(parse(cssItem));\n              }\n              result.push(parse(cssItem));\n            });\n          } else {\n            if (angular.isFunction(css)) {\n              dynamicPaths.push(parse(css));\n            }\n            result.push(parse(css));\n          }\n        }\n        return result;\n      };\n\n      /**\n       * Get From Routes: returns array of css objects from ng routes\n       **/\n      $css.getFromRoutes = function (routes) {\n        if (!routes) {\n          return $log.error('Get From Routes: No routes provided');\n        }\n        var result = [];\n        // Make array of all routes\n        angular.forEach(routes, function (route) {\n          var css = $css.getFromRoute(route);\n          if (css.length) {\n            result.push(css[0]);\n          }\n        });\n        return result;\n      };\n\n      /**\n       * Get From State: returns array of css objects from single state\n       **/\n      $css.getFromState = function (state) {\n        if (!state) {\n          return $log.error('Get From State: No state provided');\n        }\n        var result = [];\n        // State \"views\" notation\n        if (angular.isDefined(state.views)) {\n          angular.forEach(state.views, function (item) {\n            if (item.css) {\n              if (angular.isFunction(item.css)) {\n                dynamicPaths.push(parse(item.css));\n              }\n              result.push(parse(item.css));\n            }\n          });\n        }\n        // State \"children\" notation\n        if (angular.isDefined(state.children)) {\n          angular.forEach(state.children, function (child) {\n            if (child.css) {\n              if (angular.isFunction(child.css)) {\n                dynamicPaths.push(parse(child.css));\n              }\n              result.push(parse(child.css));\n            }\n            if (angular.isDefined(child.children)) {\n              angular.forEach(child.children, function (childChild) {\n                if (childChild.css) {\n                  if (angular.isFunction(childChild.css)) {\n                    dynamicPaths.push(parse(childChild.css));\n                  }\n                  result.push(parse(childChild.css));\n                }\n              });\n            }\n          });\n        }\n        // State default notation\n        if (angular.isDefined(state.css)) {\n          // For multiple stylesheets\n          if (angular.isArray(state.css)) {\n              angular.forEach(state.css, function (itemCss) {\n                if (angular.isFunction(itemCss)) {\n                  dynamicPaths.push(parse(itemCss));\n                }\n                result.push(parse(itemCss));\n              });\n            // For single stylesheets\n          } else {\n            if (angular.isFunction(state.css)) {\n              dynamicPaths.push(parse(state.css));\n            }\n            result.push(parse(state.css));\n          }\n        }\n        return result;\n      };\n\n      /**\n       * Get From States: returns array of css objects from states\n       **/\n      $css.getFromStates = function (states) {\n        if (!states) {\n          return $log.error('Get From States: No states provided');\n        }\n        var result = [];\n        // Make array of all routes\n        angular.forEach(states, function (state) {\n          var css = $css.getFromState(state);\n          if (angular.isArray(css)) {\n            angular.forEach(css, function (cssItem) {\n              result.push(cssItem);\n            });\n          } else {\n            result.push(css);\n          }\n        });\n        return result;\n      };\n\n      /**\n       * Preload: preloads css via http request\n       **/\n      $css.preload = function (stylesheets, callback) {\n        // If no stylesheets provided, then preload all\n        if (!stylesheets) {\n          stylesheets = [];\n          // Add all stylesheets from custom directives to array\n          if ($directives.length) {\n            Array.prototype.push.apply(stylesheets, $directives);\n          }\n          // Add all stylesheets from ngRoute to array\n          if ($injector.has('$route')) {\n            Array.prototype.push.apply(stylesheets, $css.getFromRoutes($injector.get('$route').routes));\n          }\n          // Add all stylesheets from UI Router to array\n          if ($injector.has('$state')) {\n            Array.prototype.push.apply(stylesheets, $css.getFromStates($injector.get('$state').get()));\n          }\n          stylesheets = filterBy(stylesheets, 'preload');\n        }\n        if (!angular.isArray(stylesheets)) {\n          stylesheets = [stylesheets];\n        }\n        var stylesheetLoadPromises = [];\n        angular.forEach(stylesheets, function(stylesheet, key) {\n          stylesheet = stylesheets[key] = parse(stylesheet);\n          stylesheetLoadPromises.push(\n            // Preload via ajax request\n            $http.get(stylesheet.href).error(function (response) {\n              $log.error('AngularCSS: Incorrect path for ' + stylesheet.href);\n            })\n          );\n        });\n        if (angular.isFunction(callback)) {\n          $q.all(stylesheetLoadPromises).then(function () {\n            callback(stylesheets);\n          });\n        }\n      };\n\n      /**\n       * Bind: binds css in scope with own scope create/destroy events\n       **/\n       $css.bind = function (css, $scope) {\n        if (!css || !$scope) {\n          return $log.error('No scope or stylesheets provided');\n        }\n        var result = [];\n        // Adds route css rules to array\n        if (angular.isArray(css)) {\n          angular.forEach(css, function (cssItem) {\n            result.push(parse(cssItem));\n          });\n        } else {\n          result.push(parse(css));\n        }\n        $css.add(result);\n        $log.debug('$css.bind(): Added', result);\n        $scope.$on('$destroy', function () {\n          $css.remove(result);\n          $log.debug('$css.bind(): Removed', result);\n        });\n       };\n\n      /**\n       * Add: adds stylesheets to scope\n       **/\n      $css.add = function (stylesheets, callback) {\n        if (!stylesheets) {\n          return $log.error('No stylesheets provided');\n        }\n        if (!angular.isArray(stylesheets)) {\n          stylesheets = [stylesheets];\n        }\n        angular.forEach(stylesheets, function(stylesheet) {\n          stylesheet = parse(stylesheet);\n          // Avoid adding duplicate stylesheets\n          if (stylesheet.href && !$filter('filter')($rootScope.stylesheets, { href: stylesheet.href }).length) {\n            // Bust Cache feature\n            bustCache(stylesheet)\n            // Media Query add support check\n            if (isMediaQuery(stylesheet)) {\n              addViaMediaQuery(stylesheet);\n            }\n            else {\n              $rootScope.stylesheets.push(stylesheet);\n            }\n            $log.debug('$css.add(): ' + stylesheet.href);\n          }\n        });\n        // Broadcasts custom event for css add\n        $rootScope.$broadcast('$cssAdd', stylesheets, $rootScope.stylesheets);\n      };\n\n      /**\n       * Remove: removes stylesheets from scope\n       **/\n      $css.remove = function (stylesheets, callback) {\n        if (!stylesheets) {\n          return $log.error('No stylesheets provided');\n        }\n        if (!angular.isArray(stylesheets)) {\n          stylesheets = [stylesheets];\n        }\n        // Only proceed based on persist setting\n        stylesheets = $filter('filter')(stylesheets, function (stylesheet) {\n          return !stylesheet.persist;\n        });\n        angular.forEach(stylesheets, function(stylesheet) {\n          stylesheet = parse(stylesheet);\n          // Get index of current item to be removed based on href\n          var index = $rootScope.stylesheets.indexOf($filter('filter')($rootScope.stylesheets, {\n            href: stylesheet.href\n          })[0]);\n          // Remove stylesheet from scope (if found)\n          if (index !== -1) {\n            $rootScope.stylesheets.splice(index, 1);\n          }\n          // Remove stylesheet via media query\n          removeViaMediaQuery(stylesheet);\n          $log.debug('$css.remove(): ' + stylesheet.href);\n        });\n        // Broadcasts custom event for css remove\n        $rootScope.$broadcast('$cssRemove', stylesheets, $rootScope.stylesheets);\n      };\n\n      /**\n       * Remove All: removes all style tags from the DOM\n       **/\n      $css.removeAll = function () {\n        // Remove all stylesheets from scope\n        if ($rootScope && $rootScope.hasOwnProperty('stylesheets')) {\n          $rootScope.stylesheets.length = 0;\n        }\n        $log.debug('all stylesheets removed');\n      };\n\n      // Preload all stylesheets\n      $css.preload();\n\n      return $css;\n\n    }];\n\n  }]);\n\n  /**\n   * Links filter - renders the stylesheets array in html format\n   **/\n  angularCSS.filter('$cssLinks', function () {\n    return function (stylesheets) {\n      if (!stylesheets || !angular.isArray(stylesheets)) {\n        return stylesheets;\n      }\n      var result = '';\n      angular.forEach(stylesheets, function (stylesheet) {\n        result += '<link rel=\"' + stylesheet.rel + '\" type=\"' + stylesheet.type + '\" href=\"' + stylesheet.href + '\"';\n        result += (stylesheet.media ? ' media=\"' + stylesheet.media + '\"' : '')\n        result += '>\\n\\n';\n      });\n      return result;\n    }\n  });\n\n  /**\n   * Run - auto instantiate the $css provider by injecting it in the run phase of this module\n   **/\n  angularCSS.run(['$css', function ($css) { } ]);\n\n  /**\n   * AngularJS hack - This way we can get and decorate all custom directives\n   * in order to broadcast a custom $directiveAdd event\n   **/\n  var $directives = [];\n  var originalModule = angular.module;\n  angular.module = function () {\n    var module = originalModule.apply(this, arguments);\n    var originalDirective = module.directive;\n    module.directive = function(directiveName, directiveFactory) {\n      var originalDirectiveFactory = angular.isFunction(directiveFactory) ?\n      directiveFactory : directiveFactory[directiveFactory.length - 1];\n      try {\n        var directive = angular.copy(originalDirectiveFactory)();\n        directive.directiveName = directiveName;\n        if (directive.hasOwnProperty('css')) {\n          $directives.push(directive);\n        }\n      } catch (e) { }\n      return originalDirective.apply(this, arguments);\n    };\n    module.config(['$provide','$injector', function ($provide, $injector) {\n      angular.forEach($directives, function ($directive) {\n        var dirProvider = $directive.directiveName + 'Directive';\n        if ($injector.has(dirProvider)) {\n          $provide.decorator(dirProvider, ['$delegate', '$rootScope', '$timeout', function ($delegate, $rootScope, $timeout) {\n            var directive = $delegate[0];\n            var compile = directive.compile;\n            if (directive.css) {\n              $directive.css = directive.css;\n            }\n            directive.compile = function() {\n              var link = compile ? compile.apply(this, arguments): false;\n              return function(scope) {\n                var linkArgs = arguments;\n                $timeout(function () {\n                  if (link) {\n                    link.apply(this, linkArgs);\n                  }\n                });\n                $rootScope.$broadcast('$directiveAdd', directive, scope);\n              };\n            };\n            return $delegate;\n          }]);\n        }\n      });\n    }]);\n    return module;\n  };\n  /* End of hack */\n\n})(angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-css/bower.json",
    "content": "{\n  \"name\": \"angular-css\",\n  \"main\": \"./angular-css.js\",\n  \"version\": \"1.0.7\",\n  \"homepage\": \"http://door3.github.io/angular-css\",\n  \"authors\": [\n    \"Alex Castillo <alex@castillo.io>\"\n  ],\n  \"description\": \"CSS on-demand for AngularJS\",\n  \"keywords\": [\n    \"angularjs\",\n    \"ng-route\",\n    \"ui-router\",\n    \"css\"\n  ],\n  \"dependencies\": {\n    \"angular\": \">= 1.3.0\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/door3/angular-css\"\n  },\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"component.json\",\n    \"package.json\",\n    \"lib\",\n    \"config\",\n    \"demo\",\n    \"test\",\n    \"tests\"\n  ]\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/.bower.json",
    "content": "{\n  \"name\": \"angular-filter\",\n  \"version\": \"0.5.4\",\n  \"main\": \"dist/angular-filter.js\",\n  \"description\": \"Bunch of useful filters for angularJS(with no external dependencies!)\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/a8m/angular-filter.git\"\n  },\n  \"dependencies\": {\n    \"angular\": \"*\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \"*\"\n  },\n  \"ignore\": [\n    \"node_modules\",\n    \"bower_components\",\n    \"package.json\",\n    \"lib\",\n    \"test\",\n    \"src\",\n    \"Gruntfile.js\",\n    \".gitignore\",\n    \"README.md\",\n    \"travis.yml\",\n    \".bowercc\"\n  ],\n  \"homepage\": \"https://github.com/a8m/angular-filter\",\n  \"_release\": \"0.5.4\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v0.5.4\",\n    \"commit\": \"13c430b3df656e3d0a3a78953d63bbce93f0ffe9\"\n  },\n  \"_source\": \"git://github.com/a8m/angular-filter.git\",\n  \"_target\": \"~0.5.1\",\n  \"_originalSource\": \"angular-filter\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/.bowerrc",
    "content": "{\n  \"directory\": \"bower_components\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - '0.10'\nbefore_script:\n  - export DISPLAY=:99.0\n  - sh -e /etc/init.d/xvfb start\n  - 'npm install -g bower grunt-cli'\n  - 'bower install --config.interactive=false'\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/bower.json",
    "content": "{\n  \"name\": \"angular-filter\",\n  \"version\": \"0.5.4\",\n  \"main\": \"dist/angular-filter.js\",\n  \"description\": \"Bunch of useful filters for angularJS(with no external dependencies!)\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/a8m/angular-filter.git\"\n  },\n  \"dependencies\": {\n    \"angular\": \"*\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \"*\"\n  },\n  \"ignore\": [\n    \"node_modules\",\n    \"bower_components\",\n    \"package.json\",\n    \"lib\",\n    \"test\",\n    \"src\",\n    \"Gruntfile.js\",\n    \".gitignore\",\n    \"README.md\",\n    \"travis.yml\",\n    \".bowercc\"\n  ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/dist/angular-filter.js",
    "content": "/**\n * Bunch of useful filters for angularJS(with no external dependencies!)\n * @version v0.5.4 - 2015-02-20 * @link https://github.com/a8m/angular-filter\n * @author Ariel Mashraki <ariel@mashraki.co.il>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n(function ( window, angular, undefined ) {\n/*jshint globalstrict:true*/\n'use strict';\n\nvar isDefined = angular.isDefined,\n    isUndefined = angular.isUndefined,\n    isFunction = angular.isFunction,\n    isString = angular.isString,\n    isNumber = angular.isNumber,\n    isObject = angular.isObject,\n    isArray = angular.isArray,\n    forEach = angular.forEach,\n    extend = angular.extend,\n    copy = angular.copy,\n    equals = angular.equals;\n\n\n/**\n * @description\n * get an object and return array of values\n * @param object\n * @returns {Array}\n */\nfunction toArray(object) {\n  return isArray(object) ? object :\n    Object.keys(object).map(function(key) {\n      return object[key];\n    });\n}\n\n/**\n * @param value\n * @returns {boolean}\n */\nfunction isNull(value) {\n    return value === null;\n}\n\n/**\n * @description\n * return if object contains partial object\n * @param partial{object}\n * @param object{object}\n * @returns {boolean}\n */\nfunction objectContains(partial, object) {\n  var keys = Object.keys(partial);\n\n  return keys.map(function(el) {\n    return (object[el] !== undefined) && (object[el] == partial[el]);\n  }).indexOf(false) == -1;\n\n}\n\n/**\n * @description\n * search for approximate pattern in string\n * @param word\n * @param pattern\n * @returns {*}\n */\nfunction hasApproxPattern(word, pattern) {\n  if(pattern === '')\n    return word;\n\n  var index = word.indexOf(pattern.charAt(0));\n\n  if(index === -1)\n    return false;\n\n  return hasApproxPattern(word.substr(index+1), pattern.substr(1))\n}\n\n/**\n * @description\n * return the first n element of an array,\n * if expression provided, is returns as long the expression return truthy\n * @param array\n * @param n {number}\n * @param expression {$parse}\n * @return array or single object\n */\nfunction getFirstMatches(array, n, expression) {\n  var count = 0;\n\n  return array.filter(function(elm) {\n    var rest = isDefined(expression) ? (count < n && expression(elm)) : count < n;\n    count = rest ? count+1 : count;\n\n    return rest;\n  });\n}\n/**\n * Polyfill to ECMA6 String.prototype.contains\n */\nif (!String.prototype.contains) {\n  String.prototype.contains = function() {\n    return String.prototype.indexOf.apply(this, arguments) !== -1;\n  };\n}\n\n/**\n * @param num {Number}\n * @param decimal {Number}\n * @param $math\n * @returns {Number}\n */\nfunction convertToDecimal(num, decimal, $math){\n  return $math.round(num * $math.pow(10,decimal)) / ($math.pow(10,decimal));\n}\n\n/**\n * @description\n * Get an object, and return an array composed of it's properties names(nested too).\n * @param obj {Object}\n * @param stack {Array}\n * @param parent {String}\n * @returns {Array}\n * @example\n * parseKeys({ a:1, b: { c:2, d: { e: 3 } } }) ==> [\"a\", \"b.c\", \"b.d.e\"]\n */\nfunction deepKeys(obj, stack, parent) {\n  stack = stack || [];\n  var keys = Object.keys(obj);\n\n  keys.forEach(function(el) {\n    //if it's a nested object\n    if(isObject(obj[el]) && !isArray(obj[el])) {\n      //concatenate the new parent if exist\n      var p = parent ? parent + '.' + el : parent;\n      deepKeys(obj[el], stack, p || el);\n    } else {\n      //create and save the key\n      var key = parent ? parent + '.' + el : el;\n      stack.push(key)\n    }\n  });\n  return stack\n}\n\n/**\n * @description\n * Test if given object is a Scope instance\n * @param obj\n * @returns {Boolean}\n */\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n/**\n * @ngdoc filter\n * @name a8m.angular\n * @kind function\n *\n * @description\n * reference to angular function\n */\n\nangular.module('a8m.angular', [])\n\n    .filter('isUndefined', function () {\n      return function (input) {\n        return angular.isUndefined(input);\n      }\n    })\n    .filter('isDefined', function() {\n      return function (input) {\n        return angular.isDefined(input);\n      }\n    })\n    .filter('isFunction', function() {\n      return function (input) {\n        return angular.isFunction(input);\n      }\n    })\n    .filter('isString', function() {\n      return function (input) {\n        return angular.isString(input)\n      }\n    })\n    .filter('isNumber', function() {\n      return function (input) {\n        return angular.isNumber(input);\n      }\n    })\n    .filter('isArray', function() {\n      return function (input) {\n        return angular.isArray(input);\n      }\n    })\n    .filter('isObject', function() {\n      return function (input) {\n        return angular.isObject(input);\n      }\n    })\n    .filter('isEqual', function() {\n      return function (o1, o2) {\n        return angular.equals(o1, o2);\n      }\n    });\n\n/**\n * @ngdoc filter\n * @name a8m.conditions\n * @kind function\n *\n * @description\n * reference to math conditions\n */\n angular.module('a8m.conditions', [])\n\n  .filter({\n    isGreaterThan  : isGreaterThanFilter,\n    '>'            : isGreaterThanFilter,\n\n    isGreaterThanOrEqualTo  : isGreaterThanOrEqualToFilter,\n    '>='                    : isGreaterThanOrEqualToFilter,\n\n    isLessThan  : isLessThanFilter,\n    '<'         : isLessThanFilter,\n\n    isLessThanOrEqualTo  : isLessThanOrEqualToFilter,\n    '<='                 : isLessThanOrEqualToFilter,\n\n    isEqualTo  : isEqualToFilter,\n    '=='       : isEqualToFilter,\n\n    isNotEqualTo  : isNotEqualToFilter,\n    '!='          : isNotEqualToFilter,\n\n    isIdenticalTo  : isIdenticalToFilter,\n    '==='          : isIdenticalToFilter,\n\n    isNotIdenticalTo  : isNotIdenticalToFilter,\n    '!=='             : isNotIdenticalToFilter\n  });\n\n  function isGreaterThanFilter() {\n    return function (input, check) {\n      return input > check;\n    };\n  }\n\n  function isGreaterThanOrEqualToFilter() {\n    return function (input, check) {\n      return input >= check;\n    };\n  }\n\n  function isLessThanFilter() {\n    return function (input, check) {\n      return input < check;\n    };\n  }\n\n  function isLessThanOrEqualToFilter() {\n    return function (input, check) {\n      return input <= check;\n    };\n  }\n\n  function isEqualToFilter() {\n    return function (input, check) {\n      return input == check;\n    };\n  }\n\n  function isNotEqualToFilter() {\n    return function (input, check) {\n      return input != check;\n    };\n  }\n\n  function isIdenticalToFilter() {\n    return function (input, check) {\n      return input === check;\n    };\n  }\n\n  function isNotIdenticalToFilter() {\n    return function (input, check) {\n      return input !== check;\n    };\n  }\n/**\n * @ngdoc filter\n * @name isNull\n * @kind function\n *\n * @description\n * checks if value is null or not\n * @return Boolean\n */\nangular.module('a8m.is-null', [])\n    .filter('isNull', function () {\n      return function(input) {\n        return isNull(input);\n      }\n    });\n\n/**\n * @ngdoc filter\n * @name after-where\n * @kind function\n *\n * @description\n * get a collection and properties object, and returns all of the items\n * in the collection after the first that found with the given properties.\n *\n */\nangular.module('a8m.after-where', [])\n    .filter('afterWhere', function() {\n      return function (collection, object) {\n\n        collection = (isObject(collection))\n          ? toArray(collection)\n          : collection;\n\n        if(!isArray(collection) || isUndefined(object))\n          return collection;\n\n        var index = collection.map( function( elm ) {\n          return objectContains(object, elm);\n        }).indexOf( true );\n\n        return collection.slice((index === -1) ? 0 : index);\n      }\n    });\n\n/**\n * @ngdoc filter\n * @name after\n * @kind function\n *\n * @description\n * get a collection and specified count, and returns all of the items\n * in the collection after the specified count.\n *\n */\n\nangular.module('a8m.after', [])\n    .filter('after', function() {\n      return function (collection, count) {\n        collection = (isObject(collection))\n          ? toArray(collection)\n          : collection;\n\n        return (isArray(collection))\n          ? collection.slice(count)\n          : collection;\n      }\n    });\n\n/**\n * @ngdoc filter\n * @name before-where\n * @kind function\n *\n * @description\n * get a collection and properties object, and returns all of the items\n * in the collection before the first that found with the given properties.\n */\nangular.module('a8m.before-where', [])\n  .filter('beforeWhere', function() {\n    return function (collection, object) {\n\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection) || isUndefined(object))\n        return collection;\n\n      var index = collection.map( function( elm ) {\n        return objectContains(object, elm);\n      }).indexOf( true );\n\n      return collection.slice(0, (index === -1) ? collection.length : ++index);\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name before\n * @kind function\n *\n * @description\n * get a collection and specified count, and returns all of the items\n * in the collection before the specified count.\n */\nangular.module('a8m.before', [])\n    .filter('before', function() {\n      return function (collection, count) {\n        collection = (isObject(collection))\n          ? toArray(collection)\n          : collection;\n\n        return (isArray(collection))\n          ? collection.slice(0, (!count) ? count : --count)\n          : collection;\n      }\n    });\n\n/**\n * @ngdoc filter\n * @name concat\n * @kind function\n *\n * @description\n * get (array/object, object/array) and return merged collection\n */\nangular.module('a8m.concat', [])\n  //TODO(Ariel):unique option ? or use unique filter to filter result\n  .filter('concat', [function () {\n    return function (collection, joined) {\n\n      if (isUndefined(joined)) {\n        return collection;\n      }\n      if (isArray(collection)) {\n        return (isObject(joined))\n          ? collection.concat(toArray(joined))\n          : collection.concat(joined);\n      }\n\n      if (isObject(collection)) {\n        var array = toArray(collection);\n        return (isObject(joined))\n          ? array.concat(toArray(joined))\n          : array.concat(joined);\n      }\n      return collection;\n    };\n  }\n]);\n\n/**\n * @ngdoc filter\n * @name contains\n * @kind function\n *\n * @description\n * Checks if given expression is present in one or more object in the collection\n */\nangular.module('a8m.contains', [])\n  .filter({\n    contains: ['$parse', containsFilter],\n    some: ['$parse', containsFilter]\n  });\n\nfunction containsFilter( $parse ) {\n    return function (collection, expression) {\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(expression)) {\n        return false;\n      }\n\n      return collection.some(function(elm) {\n        return (isObject(elm) || isFunction(expression))\n          ? $parse(expression)(elm)\n          : elm === expression;\n      });\n\n    }\n }\n\n/**\n * @ngdoc filter\n * @name countBy\n * @kind function\n *\n * @description\n * Sorts a list into groups and returns a count for the number of objects in each group.\n */\n\nangular.module('a8m.count-by', [])\n\n  .filter('countBy', [ '$parse', function ( $parse ) {\n    return function (collection, property) {\n\n      var result = {},\n        get = $parse(property),\n        prop;\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(property)) {\n        return collection;\n      }\n\n      collection.forEach( function( elm ) {\n        prop = get(elm);\n\n        if(!result[prop]) {\n          result[prop] = 0;\n        }\n\n        result[prop]++;\n      });\n\n      return result;\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name defaults\n * @kind function\n *\n * @description\n * defaultsFilter allows to specify a default fallback value for properties that resolve to undefined.\n */\nangular.module('a8m.defaults', [])\n  .filter('defaults', ['$parse', function( $parse ) {\n    return function(collection, defaults) {\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || !isObject(defaults)) {\n        return collection;\n      }\n\n      var keys = deepKeys(defaults);\n\n      collection.forEach(function(elm) {\n        //loop through all the keys\n        keys.forEach(function(key) {\n          var getter = $parse(key);\n          var setter = getter.assign;\n          //if it's not exist\n          if(isUndefined(getter(elm))) {\n            //get from defaults, and set to the returned object\n            setter(elm, getter(defaults))\n          }\n        });\n      });\n\n      return collection;\n    }\n  }]);\n/**\n * @ngdoc filter\n * @name every\n * @kind function\n *\n * @description\n * Checks if given expression is present in all members in the collection\n *\n */\nangular.module('a8m.every', [])\n  .filter('every', ['$parse', function($parse) {\n    return function (collection, expression) {\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(expression)) {\n        return true;\n      }\n\n      return collection.every( function(elm) {\n        return (isObject(elm) || isFunction(expression))\n          ? $parse(expression)(elm)\n          : elm === expression;\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name filterBy\n * @kind function\n *\n * @description\n * filter by specific properties, avoid the rest\n */\nangular.module('a8m.filter-by', [])\n  .filter('filterBy', ['$parse', function( $parse ) {\n    return function(collection, properties, search) {\n\n      var comparator;\n\n      search = (isString(search) || isNumber(search)) ?\n        String(search).toLowerCase() : undefined;\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(search)) {\n        return collection;\n      }\n\n      return collection.filter(function(elm) {\n        return properties.some(function(prop) {\n\n          /**\n           * check if there is concatenate properties\n           * example:\n           * object: { first: 'foo', last:'bar' }\n           * filterBy: ['first + last'] => search by full name(i.e 'foo bar')\n           */\n          if(!~prop.indexOf('+')) {\n            comparator = $parse(prop)(elm)\n          } else {\n            var propList = prop.replace(new RegExp('\\\\s', 'g'), '').split('+');\n            comparator = propList.reduce(function(prev, cur, index) {\n              return (index === 1) ? $parse(prev)(elm) + ' ' + $parse(cur)(elm) :\n                prev + ' ' + $parse(cur)(elm);\n            });\n          }\n\n          return (isString(comparator) || isNumber(comparator))\n            ? String(comparator).toLowerCase().contains(search)\n            : false;\n        });\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name first\n * @kind function\n *\n * @description\n * Gets the first element or first n elements of an array\n * if callback is provided, is returns as long the callback return truthy\n */\nangular.module('a8m.first', [])\n  .filter('first', ['$parse', function( $parse ) {\n    return function(collection) {\n\n      var n\n        , getter\n        , args;\n\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection)) {\n        return collection;\n      }\n\n      args = Array.prototype.slice.call(arguments, 1);\n      n = (isNumber(args[0])) ? args[0] : 1;\n      getter = (!isNumber(args[0]))  ? args[0] : (!isNumber(args[1])) ? args[1] : undefined;\n\n      return (args.length) ? getFirstMatches(collection, n,(getter) ? $parse(getter) : getter) :\n        collection[0];\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name flatten\n * @kind function\n *\n * @description\n * Flattens a nested array (the nesting can be to any depth).\n * If you pass shallow, the array will only be flattened a single level\n */\nangular.module('a8m.flatten', [])\n  .filter('flatten', function () {\n    return function(collection, shallow) {\n\n      shallow = shallow || false;\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection)) {\n        return collection;\n      }\n\n      return !shallow\n        ? flatten(collection, 0)\n        : [].concat.apply([], collection);\n    }\n  });\n\n/**\n * flatten nested array (the nesting can be to any depth).\n * @param array {Array}\n * @param i {int}\n * @returns {Array}\n * @private\n */\nfunction flatten(array, i) {\n  i = i || 0;\n\n  if(i >= array.length)\n    return array;\n\n  if(isArray(array[i])) {\n    return flatten(array.slice(0,i)\n      .concat(array[i], array.slice(i+1)), i);\n  }\n  return flatten(array, i+1);\n}\n\n/**\n * @ngdoc filter\n * @name fuzzyByKey\n * @kind function\n *\n * @description\n * fuzzy string searching by key\n */\nangular.module('a8m.fuzzy-by', [])\n  .filter('fuzzyBy', ['$parse', function ( $parse ) {\n    return function (collection, property, search, csensitive) {\n\n      var sensitive = csensitive || false,\n        prop, getter;\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(property)\n        || isUndefined(search)) {\n        return collection;\n      }\n\n      getter = $parse(property);\n\n      return collection.filter(function(elm) {\n\n        prop = getter(elm);\n        if(!isString(prop)) {\n          return false;\n        }\n\n        prop = (sensitive) ? prop : prop.toLowerCase();\n        search = (sensitive) ? search : search.toLowerCase();\n\n        return hasApproxPattern(prop, search) !== false\n      })\n    }\n\n }]);\n/**\n * @ngdoc filter\n * @name fuzzy\n * @kind function\n *\n * @description\n * fuzzy string searching for array of strings, objects\n */\nangular.module('a8m.fuzzy', [])\n  .filter('fuzzy', function () {\n    return function (collection, search, csensitive) {\n\n      var sensitive = csensitive || false;\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if(!isArray(collection) || isUndefined(search)) {\n        return collection;\n      }\n\n      search = (sensitive) ? search : search.toLowerCase();\n\n      return collection.filter(function(elm) {\n\n        if(isString(elm)) {\n          elm = (sensitive) ? elm : elm.toLowerCase();\n          return hasApproxPattern(elm, search) !== false\n        }\n\n        return (isObject(elm)) ? _hasApproximateKey(elm, search) : false;\n\n      });\n\n      /**\n       * checks if object has key{string} that match\n       * to fuzzy search pattern\n       * @param object\n       * @param search\n       * @returns {boolean}\n       * @private\n       */\n      function _hasApproximateKey(object, search) {\n        var properties = Object.keys(object),\n          prop, flag;\n        return 0 < properties.filter(function (elm) {\n          prop = object[elm];\n\n          //avoid iteration if we found some key that equal[performance]\n          if(flag) return true;\n\n          if (isString(prop)) {\n            prop = (sensitive) ? prop : prop.toLowerCase();\n            return flag = (hasApproxPattern(prop, search) !== false);\n          }\n\n          return false;\n\n        }).length;\n      }\n\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name groupBy\n * @kind function\n *\n * @description\n * Create an object composed of keys generated from the result of running each element of a collection,\n * each key is an array of the elements.\n */\n\nangular.module('a8m.group-by', [ 'a8m.filter-watcher' ])\n\n  .filter('groupBy', [ '$parse', 'filterWatcher', function ( $parse, filterWatcher ) {\n    return function (collection, property) {\n\n      if(!isObject(collection) || isUndefined(property)) {\n        return collection;\n      }\n\n      var getterFn = $parse(property);\n\n      return filterWatcher.isMemoized('groupBy', arguments) ||\n        filterWatcher.memoize('groupBy', arguments, this,\n          _groupBy(collection, getterFn));\n\n      /**\n       * groupBy function\n       * @param collection\n       * @param getter\n       * @returns {{}}\n       */\n      function _groupBy(collection, getter) {\n        var result = {};\n        var prop;\n\n        forEach( collection, function( elm ) {\n          prop = getter(elm);\n\n          if(!result[prop]) {\n            result[prop] = [];\n          }\n          result[prop].push(elm);\n        });\n        return result;\n      }\n    }\n }]);\n\n/**\n * @ngdoc filter\n * @name isEmpty\n * @kind function\n *\n * @description\n * get collection or string and return if it empty\n */\nangular.module('a8m.is-empty', [])\n  .filter('isEmpty', function () {\n    return function(collection) {\n      return (isObject(collection))\n        ? !toArray(collection).length\n        : !collection.length;\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name join\n * @kind function\n *\n * @description\n * join a collection by a provided delimiter (space by default)\n */\nangular.module('a8m.join', [])\n  .filter('join', function () {\n    return function (input, delimiter) {\n      if (isUndefined(input) || !isArray(input)) {\n        return input;\n      }\n      if (isUndefined(delimiter)) {\n        delimiter = ' ';\n      }\n\n      return input.join(delimiter);\n    };\n  })\n;\n\n/**\n * @ngdoc filter\n * @name last\n * @kind function\n *\n * @description\n * Gets the last element or last n elements of an array\n * if callback is provided, is returns as long the callback return truthy\n */\nangular.module('a8m.last', [])\n  .filter('last', ['$parse', function( $parse ) {\n    return function(collection) {\n      var n\n        , getter\n        , args\n        //cuz reverse change our src collection\n        //and we don't want side effects\n        , reversed = copy(collection);\n\n      reversed = (isObject(reversed))\n        ? toArray(reversed)\n        : reversed;\n\n      if(!isArray(reversed)) {\n        return reversed;\n      }\n\n      args = Array.prototype.slice.call(arguments, 1);\n      n = (isNumber(args[0])) ? args[0] : 1;\n      getter = (!isNumber(args[0]))  ? args[0] : (!isNumber(args[1])) ? args[1] : undefined;\n\n      return (args.length)\n        //send reversed collection as arguments, and reverse it back as result\n        ? getFirstMatches(reversed.reverse(), n,(getter) ? $parse(getter) : getter).reverse()\n        //get the last element\n        : reversed[reversed.length-1];\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name map\n * @kind function\n *\n * @description\n * Returns a new collection of the results of each expression execution.\n */\nangular.module('a8m.map', [])\n  .filter('map', ['$parse', function($parse) {\n    return function (collection, expression) {\n\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection) || isUndefined(expression)) {\n        return collection;\n      }\n\n      return collection.map(function (elm) {\n        return $parse(expression)(elm);\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name omit\n * @kind function\n *\n * @description\n * filter collection by expression\n */\n\nangular.module('a8m.omit', [])\n\n  .filter('omit', ['$parse', function($parse) {\n    return function (collection, expression) {\n\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection) || isUndefined(expression)) {\n        return collection;\n      }\n\n      return collection.filter(function (elm) {\n        return !($parse(expression)(elm));\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name omit\n * @kind function\n *\n * @description\n * filter collection by expression\n */\n\nangular.module('a8m.pick', [])\n\n  .filter('pick', ['$parse', function($parse) {\n    return function (collection, expression) {\n\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      if(!isArray(collection) || isUndefined(expression)) {\n        return collection;\n      }\n\n      return collection.filter(function (elm) {\n        return $parse(expression)(elm);\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name removeWith\n * @kind function\n *\n * @description\n * get collection and properties object, and removed elements\n * with this properties\n */\n\nangular.module('a8m.remove-with', [])\n  .filter('removeWith', function() {\n    return function (collection, object) {\n\n      if(isUndefined(object)) {\n        return collection;\n      }\n      collection = isObject(collection)\n        ? toArray(collection)\n        : collection;\n\n      return collection.filter(function (elm) {\n        return !objectContains(object, elm);\n      });\n    }\n  });\n\n\n/**\n * @ngdoc filter\n * @name remove\n * @kind function\n *\n * @description\n * remove specific members from collection\n */\n\nangular.module('a8m.remove', [])\n\n  .filter('remove', function () {\n    return function (collection) {\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      var args = Array.prototype.slice.call(arguments, 1);\n\n      if(!isArray(collection)) {\n        return collection;\n      }\n\n      return collection.filter( function( member ) {\n        return !args.some(function(nest) {\n          return equals(nest, member);\n        })\n      });\n\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name reverse\n * @kind function\n *\n * @description\n * Reverses a string or collection\n */\nangular.module('a8m.reverse', [])\n    .filter('reverse',[ function () {\n      return function (input) {\n        input = (isObject(input)) ? toArray(input) : input;\n\n        if(isString(input)) {\n          return input.split('').reverse().join('');\n        }\n\n        return isArray(input)\n          ? input.slice().reverse()\n          : input;\n      }\n    }]);\n\n/**\n * @ngdoc filter\n * @name searchField\n * @kind function\n *\n * @description\n * for each member, join several strings field and add them to\n * new field called 'searchField' (use for search filtering)\n */\nangular.module('a8m.search-field', [])\n  .filter('searchField', ['$parse', function ($parse) {\n    return function (collection) {\n\n      var get, field;\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      var args = Array.prototype.slice.call(arguments, 1);\n\n      if(!isArray(collection) || !args.length) {\n        return collection;\n      }\n\n      return collection.map(function(member) {\n\n        field = args.map(function(field) {\n          get = $parse(field);\n          return get(member);\n        }).join(' ');\n\n        return extend(member, { searchField: field });\n      });\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name toArray\n * @kind function\n *\n * @description\n * Convert objects into stable arrays.\n * if addKey set to true,the filter also attaches a new property\n * $key to the value containing the original key that was used in\n * the object we are iterating over to reference the property\n */\nangular.module('a8m.to-array', [])\n  .filter('toArray', function() {\n    return function (collection, addKey) {\n\n      if(!isObject(collection)) {\n        return collection;\n      }\n\n      return !addKey\n        ? toArray(collection)\n        : Object.keys(collection).map(function (key) {\n            return extend(collection[key], { $key: key });\n          });\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name unique/uniq\n * @kind function\n *\n * @description\n * get collection and filter duplicate members\n * if uniqueFilter get a property(nested to) as argument it's\n * filter by this property as unique identifier\n */\n\nangular.module('a8m.unique', [])\n  .filter({\n      unique: ['$parse', uniqFilter],\n      uniq: ['$parse', uniqFilter]\n    });\n\nfunction uniqFilter($parse) {\n    return function (collection, property) {\n\n      collection = (isObject(collection)) ? toArray(collection) : collection;\n\n      if (!isArray(collection)) {\n        return collection;\n      }\n\n      //store all unique identifiers\n      var uniqueItems = [],\n          get = $parse(property);\n\n      return (isUndefined(property))\n        //if it's kind of primitive array\n        ? collection.filter(function (elm, pos, self) {\n          return self.indexOf(elm) === pos;\n        })\n        //else compare with equals\n        : collection.filter(function (elm) {\n          var prop = get(elm);\n          if(some(uniqueItems, prop)) {\n            return false;\n          }\n          uniqueItems.push(prop);\n          return true;\n      });\n\n      //checked if the unique identifier is already exist\n      function some(array, member) {\n        if(isUndefined(member)) {\n          return false;\n        }\n        return array.some(function(el) {\n          return equals(el, member);\n        });\n      }\n    }\n}\n\n/**\n * @ngdoc filter\n * @name where\n * @kind function\n *\n * @description\n * of each element in a collection to the given properties object,\n * returning an array of all elements that have equivalent property values.\n *\n */\nangular.module('a8m.where', [])\n  .filter('where', function() {\n    return function (collection, object) {\n\n      if(isUndefined(object)) {\n        return collection;\n      }\n      collection = (isObject(collection))\n        ? toArray(collection)\n        : collection;\n\n      return collection.filter(function (elm) {\n        return objectContains(object, elm);\n      });\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name xor\n * @kind function\n *\n * @description\n * Exclusive or filter by expression\n */\n\nangular.module('a8m.xor', [])\n\n  .filter('xor', ['$parse', function($parse) {\n    return function (col1, col2, expression) {\n\n      expression = expression || false;\n\n      col1 = (isObject(col1)) ? toArray(col1) : col1;\n      col2 = (isObject(col2)) ? toArray(col2) : col2;\n\n      if(!isArray(col1) || !isArray(col2)) return col1;\n\n      return col1.concat(col2)\n        .filter(function(elm) {\n          return !(some(elm, col1) && some(elm, col2));\n        });\n\n      function some(el, col) {\n        var getter = $parse(expression);\n        return col.some(function(dElm) {\n          return expression\n            ? equals(getter(dElm), getter(el))\n            : equals(dElm, el);\n        });\n      }\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name formatBytes\n * @kind function\n *\n * @description\n * Convert bytes into appropriate display \n * 1024 bytes => 1 KB\n */\nangular.module('a8m.math.byteFmt', ['a8m.math'])\n  .filter('byteFmt', ['$math', function ($math) {\n    return function (bytes, decimal) {\n\n      if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 &&\n        isNumber(bytes) && isFinite(bytes)) {\n\n        if(bytes < 1024) { // within 1 KB so B\n            return convertToDecimal(bytes, decimal, $math) + ' B';\n        } else if(bytes < 1048576) { // within 1 MB so KB\n            return convertToDecimal((bytes / 1024), decimal, $math) + ' KB';\n        } else if(bytes < 1073741824){ // within 1 GB so MB\n            return convertToDecimal((bytes / 1048576), decimal, $math) + ' MB';\n        } else { // GB or more\n            return convertToDecimal((bytes / 1073741824), decimal, $math) + ' GB';\n        }\n\n\t    }\n      return \"NaN\";\n    }\n  }]);\n/**\n * @ngdoc filter\n * @name degrees\n * @kind function\n *\n * @description\n * Convert angle from radians to degrees\n */\nangular.module('a8m.math.degrees', ['a8m.math'])\n  .filter('degrees', ['$math', function ($math) {\n    return function (radians, decimal) {\n\t  // if decimal is not an integer greater than -1, we cannot do. quit with error \"NaN\"\n\t\t// if degrees is not a real number, we cannot do also. quit with error \"NaN\"\n\t\tif(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 &&\n          isNumber(radians) && isFinite(radians)) {\n\t\t    var degrees = (radians * 180) / $math.PI;\n\t\t    return $math.round(degrees * $math.pow(10,decimal)) / ($math.pow(10,decimal));\n\t    } else {\n          return \"NaN\";\n\t\t}\n\t}\n}]);\n\n \n \n/**\n * @ngdoc filter\n * @name formatBytes\n * @kind function\n *\n * @description\n * Convert bytes into appropriate display \n * 1024 kilobytes => 1 MB\n */\nangular.module('a8m.math.kbFmt', ['a8m.math'])\n  .filter('kbFmt', ['$math', function ($math) {\n    return function (bytes, decimal) {\n\n      if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 &&\n        isNumber(bytes) && isFinite(bytes)) {\n\n        if(bytes < 1024) { // within 1 MB so KB\n            return convertToDecimal(bytes, decimal, $math) + ' KB';\n        } else if(bytes < 1048576) { // within 1 GB so MB\n            return convertToDecimal((bytes / 1024), decimal, $math) + ' MB';\n        } else {\n            return convertToDecimal((bytes / 1048576), decimal, $math) + ' GB';\n        }\n\t\t  }\n\t\t\treturn \"NaN\";\n    }\n}]);\n/**\n * @ngdoc module\n * @name math\n * @description\n * reference to global Math object\n */\nangular.module('a8m.math', [])\n  .factory('$math', ['$window', function ($window) {\n    return $window.Math;\n  }]);\n\n/**\n * @ngdoc filter\n * @name max\n * @kind function\n *\n * @description\n * Math.max will get an array and return the max value. if an expression\n * is provided, will return max value by expression.\n */\nangular.module('a8m.math.max', ['a8m.math'])\n  .filter('max', ['$math', '$parse', function ($math, $parse) {\n    return function (input, expression) {\n\n      if(!isArray(input)) {\n        return input;\n      }\n      return isUndefined(expression)\n        ? $math.max.apply($math, input)\n        : input[indexByMax(input, expression)];\n    };\n\n    /**\n     * @private\n     * @param array\n     * @param exp\n     * @returns {number|*|Number}\n     */\n    function indexByMax(array, exp) {\n      var mappedArray = array.map(function(elm){\n        return $parse(exp)(elm);\n      });\n      return mappedArray.indexOf($math.max.apply($math, mappedArray));\n    }\n  }]);\n/**\n * @ngdoc filter\n * @name min\n * @kind function\n *\n * @description\n * Math.min will get an array and return the min value. if an expression\n * is provided, will return min value by expression.\n */\nangular.module('a8m.math.min', ['a8m.math'])\n  .filter('min', ['$math', '$parse', function ($math, $parse) {\n    return function (input, expression) {\n\n      if(!isArray(input)) {\n        return input;\n      }\n      return isUndefined(expression)\n        ? $math.min.apply($math, input)\n        : input[indexByMin(input, expression)];\n    };\n\n    /**\n     * @private\n     * @param array\n     * @param exp\n     * @returns {number|*|Number}\n     */\n    function indexByMin(array, exp) {\n      var mappedArray = array.map(function(elm){\n        return $parse(exp)(elm);\n      });\n      return mappedArray.indexOf($math.min.apply($math, mappedArray));\n    }\n  }]);\n/**\n * @ngdoc filter\n * @name Percent\n * @kind function\n *\n * @description\n * percentage between two numbers\n */\nangular.module('a8m.math.percent', ['a8m.math'])\n  .filter('percent', ['$math', '$window', function ($math, $window) {\n    return function (input, divided, round) {\n\n      var divider = (isString(input)) ? $window.Number(input) : input;\n      divided = divided || 100;\n      round = round || false;\n\n      if (!isNumber(divider) || $window.isNaN(divider)) return input;\n\n      return round\n        ? $math.round((divider / divided) * 100)\n        : (divider / divided) * 100;\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name toRadians\n * @kind function\n *\n * @description\n * Convert angle from degrees to radians\n */\nangular.module('a8m.math.radians', ['a8m.math'])\n  .filter('radians', ['$math', function ($math) {\n    return function (degrees, decimal) {\n\t  // if decimal is not an integer greater than -1, we cannot do. quit with error \"NaN\"\n\t  // if degrees is not a real number, we cannot do also. quit with error \"NaN\"\n        if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 &&\n          isNumber(degrees) && isFinite(degrees)) {\n          var radians = (degrees * 3.14159265359) / 180;\n          return $math.round(radians * $math.pow(10,decimal)) / ($math.pow(10,decimal));\n\t\t}\n\t\treturn \"NaN\";\n\t}\n}]);\n\n \n \n/**\n * @ngdoc filter\n * @name Radix\n * @kind function\n *\n * @description\n * converting decimal numbers to different bases(radix)\n */\nangular.module('a8m.math.radix', [])\n  .filter('radix', function () {\n    return function (input, radix) {\n      var RANGE = /^[2-9]$|^[1-2]\\d$|^3[0-6]$/;\n\n      if(!isNumber(input) || !RANGE.test(radix)) {\n        return input;\n      }\n\n      return input.toString(radix).toUpperCase();\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name formatBytes\n * @kind function\n *\n * @description\n * Convert number into abbreviations.\n * i.e: K for one thousand, M for Million, B for billion\n * e.g: number of users:235,221, decimal:1 => 235.2 K\n */\nangular.module('a8m.math.shortFmt', ['a8m.math'])\n  .filter('shortFmt', ['$math', function ($math) {\n    return function (number, decimal) {\n      if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 &&\n        isNumber(number) && isFinite(number)){\n                    \n          if(number < 1e3) {\n              return number;\n          } else if(number < 1e6) {\n              return convertToDecimal((number / 1e3), decimal, $math) + ' K';\n          } else if(number < 1e9){\n              return convertToDecimal((number / 1e6), decimal, $math) + ' M';\n          } else {\n            return convertToDecimal((number / 1e9), decimal, $math) + ' B';\n          }\n\n\t  }\n    return \"NaN\";\n\t}\n}]);\n/**\n * @ngdoc filter\n * @name sum\n * @kind function\n *\n * @description\n * Sum up all values within an array\n */\nangular.module('a8m.math.sum', [])\n  .filter('sum', function () {\n    return function (input, initial) {\n      return !isArray(input)\n        ? input\n        : input.reduce(function(prev, curr) {\n          return prev + curr;\n        }, initial || 0);\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name endsWith\n * @kind function\n *\n * @description\n * checks whether string ends with the ends parameter.\n */\nangular.module('a8m.ends-with', [])\n\n  .filter('endsWith', function () {\n    return function (input, ends, csensitive) {\n\n      var sensitive = csensitive || false,\n        position;\n\n      if(!isString(input) || isUndefined(ends)) {\n        return input;\n      }\n\n      input = (sensitive) ? input : input.toLowerCase();\n      position = input.length - ends.length;\n\n      return input.indexOf((sensitive) ? ends : ends.toLowerCase(), position) !== -1;\n    }\n  });\n\n/**\r\n * @ngdoc filter\r\n * @name latinize\r\n * @kind function\r\n *\r\n * @description\r\n * remove accents/diacritics from a string\r\n */\r\nangular.module('a8m.latinize', [])\r\n  .filter('latinize',[ function () {\r\n    var defaultDiacriticsRemovalap = [\r\n      {'base':'A', 'letters':'\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F'},\r\n      {'base':'AA','letters':'\\uA732'},\r\n      {'base':'AE','letters':'\\u00C6\\u01FC\\u01E2'},\r\n      {'base':'AO','letters':'\\uA734'},\r\n      {'base':'AU','letters':'\\uA736'},\r\n      {'base':'AV','letters':'\\uA738\\uA73A'},\r\n      {'base':'AY','letters':'\\uA73C'},\r\n      {'base':'B', 'letters':'\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181'},\r\n      {'base':'C', 'letters':'\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E'},\r\n      {'base':'D', 'letters':'\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779'},\r\n      {'base':'DZ','letters':'\\u01F1\\u01C4'},\r\n      {'base':'Dz','letters':'\\u01F2\\u01C5'},\r\n      {'base':'E', 'letters':'\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E'},\r\n      {'base':'F', 'letters':'\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B'},\r\n      {'base':'G', 'letters':'\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E'},\r\n      {'base':'H', 'letters':'\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D'},\r\n      {'base':'I', 'letters':'\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197'},\r\n      {'base':'J', 'letters':'\\u004A\\u24BF\\uFF2A\\u0134\\u0248'},\r\n      {'base':'K', 'letters':'\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2'},\r\n      {'base':'L', 'letters':'\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780'},\r\n      {'base':'LJ','letters':'\\u01C7'},\r\n      {'base':'Lj','letters':'\\u01C8'},\r\n      {'base':'M', 'letters':'\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C'},\r\n      {'base':'N', 'letters':'\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4'},\r\n      {'base':'NJ','letters':'\\u01CA'},\r\n      {'base':'Nj','letters':'\\u01CB'},\r\n      {'base':'O', 'letters':'\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C'},\r\n      {'base':'OI','letters':'\\u01A2'},\r\n      {'base':'OO','letters':'\\uA74E'},\r\n      {'base':'OU','letters':'\\u0222'},\r\n      {'base':'OE','letters':'\\u008C\\u0152'},\r\n      {'base':'oe','letters':'\\u009C\\u0153'},\r\n      {'base':'P', 'letters':'\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754'},\r\n      {'base':'Q', 'letters':'\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A'},\r\n      {'base':'R', 'letters':'\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782'},\r\n      {'base':'S', 'letters':'\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784'},\r\n      {'base':'T', 'letters':'\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786'},\r\n      {'base':'TZ','letters':'\\uA728'},\r\n      {'base':'U', 'letters':'\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244'},\r\n      {'base':'V', 'letters':'\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245'},\r\n      {'base':'VY','letters':'\\uA760'},\r\n      {'base':'W', 'letters':'\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72'},\r\n      {'base':'X', 'letters':'\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C'},\r\n      {'base':'Y', 'letters':'\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE'},\r\n      {'base':'Z', 'letters':'\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762'},\r\n      {'base':'a', 'letters':'\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250'},\r\n      {'base':'aa','letters':'\\uA733'},\r\n      {'base':'ae','letters':'\\u00E6\\u01FD\\u01E3'},\r\n      {'base':'ao','letters':'\\uA735'},\r\n      {'base':'au','letters':'\\uA737'},\r\n      {'base':'av','letters':'\\uA739\\uA73B'},\r\n      {'base':'ay','letters':'\\uA73D'},\r\n      {'base':'b', 'letters':'\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253'},\r\n      {'base':'c', 'letters':'\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184'},\r\n      {'base':'d', 'letters':'\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A'},\r\n      {'base':'dz','letters':'\\u01F3\\u01C6'},\r\n      {'base':'e', 'letters':'\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD'},\r\n      {'base':'f', 'letters':'\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C'},\r\n      {'base':'g', 'letters':'\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F'},\r\n      {'base':'h', 'letters':'\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265'},\r\n      {'base':'hv','letters':'\\u0195'},\r\n      {'base':'i', 'letters':'\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131'},\r\n      {'base':'j', 'letters':'\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249'},\r\n      {'base':'k', 'letters':'\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3'},\r\n      {'base':'l', 'letters':'\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747'},\r\n      {'base':'lj','letters':'\\u01C9'},\r\n      {'base':'m', 'letters':'\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F'},\r\n      {'base':'n', 'letters':'\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5'},\r\n      {'base':'nj','letters':'\\u01CC'},\r\n      {'base':'o', 'letters':'\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275'},\r\n      {'base':'oi','letters':'\\u01A3'},\r\n      {'base':'ou','letters':'\\u0223'},\r\n      {'base':'oo','letters':'\\uA74F'},\r\n      {'base':'p','letters':'\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755'},\r\n      {'base':'q','letters':'\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759'},\r\n      {'base':'r','letters':'\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783'},\r\n      {'base':'s','letters':'\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B'},\r\n      {'base':'t','letters':'\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787'},\r\n      {'base':'tz','letters':'\\uA729'},\r\n      {'base':'u','letters': '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289'},\r\n      {'base':'v','letters':'\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C'},\r\n      {'base':'vy','letters':'\\uA761'},\r\n      {'base':'w','letters':'\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73'},\r\n      {'base':'x','letters':'\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D'},\r\n      {'base':'y','letters':'\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF'},\r\n      {'base':'z','letters':'\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763'}\r\n    ];\r\n\r\n    var diacriticsMap = {};\r\n    for (var i = 0; i < defaultDiacriticsRemovalap.length; i++) {\r\n      var letters = defaultDiacriticsRemovalap[i].letters.split(\"\");\r\n      for (var j = 0; j < letters.length ; j++){\r\n        diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;\r\n      }\r\n    }\r\n\r\n    // \"what?\" version ... http://jsperf.com/diacritics/12\r\n    function removeDiacritics (str) {\r\n      return str.replace(/[^\\u0000-\\u007E]/g, function(a){\r\n        return diacriticsMap[a] || a;\r\n      });\r\n    }\r\n\r\n    return function (input) {\r\n\r\n      return isString(input)\r\n        ? removeDiacritics(input)\r\n        : input;\r\n    }\r\n  }]);\r\n\n/**\n * @ngdoc filter\n * @name ltrim\n * @kind function\n *\n * @description\n * Left trim. Similar to trimFilter, but only for left side.\n */\nangular.module('a8m.ltrim', [])\n  .filter('ltrim', function () {\n    return function(input, chars) {\n\n      var trim = chars || '\\\\s';\n\n      return isString(input)\n        ? input.replace(new RegExp('^' + trim + '+'), '')\n        : input;\n    }\n  });\n\n/**\r\n * @ngdoc filter\r\n * @name match\r\n * @kind function\r\n *\r\n * @description\r\n * Return the matched pattern in a string.\r\n */\r\nangular.module('a8m.match', [])\r\n  .filter('match', function () {\r\n    return function (input, pattern, flag) {\r\n\r\n      var reg = new RegExp(pattern, flag);\r\n\r\n      return isString(input)\r\n        ? input.match(reg)\r\n        : null;\r\n    }\r\n  });\r\n\n/**\n * @ngdoc filter\n * @name repeat\n * @kind function\n *\n * @description\n * Repeats a string n times\n */\nangular.module('a8m.repeat', [])\n  .filter('repeat',[ function () {\n    return function (input, n, separator) {\n\n      var times = ~~n;\n\n      if(!isString(input)) {\n        return input;\n      }\n\n      return !times\n        ? input\n        : strRepeat(input, --n, separator || '');\n    }\n  }]);\n\n/**\n * Repeats a string n times with given separator\n * @param str string to repeat\n * @param n number of times\n * @param sep separator\n * @returns {*}\n */\nfunction strRepeat(str, n, sep) {\n  if(!n) {\n    return str;\n  }\n  return str + sep + strRepeat(str, --n, sep);\n}\n/**\n* @ngdoc filter\n* @name rtrim\n* @kind function\n*\n* @description\n* Right trim. Similar to trimFilter, but only for right side.\n*/\nangular.module('a8m.rtrim', [])\n  .filter('rtrim', function () {\n    return function(input, chars) {\n\n      var trim = chars || '\\\\s';\n\n      return isString(input)\n        ? input.replace(new RegExp(trim + '+$'), '')\n        : input;\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name slugify\n * @kind function\n *\n * @description\n * remove spaces from string, replace with \"-\" or given argument\n */\nangular.module('a8m.slugify', [])\n  .filter('slugify',[ function () {\n    return function (input, sub) {\n\n      var replace = (isUndefined(sub)) ? '-' : sub;\n\n      return isString(input)\n        ? input.toLowerCase().replace(/\\s+/g, replace)\n        : input;\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name startWith\n * @kind function\n *\n * @description\n * checks whether string starts with the starts parameter.\n */\nangular.module('a8m.starts-with', [])\n  .filter('startsWith', function () {\n    return function (input, start, csensitive) {\n\n      var sensitive = csensitive || false;\n\n      if(!isString(input) || isUndefined(start)) {\n        return input;\n      }\n\n      input = (sensitive) ? input : input.toLowerCase();\n\n      return !input.indexOf((sensitive) ? start : start.toLowerCase());\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name stringular\n * @kind function\n *\n * @description\n * get string with {n} and replace match with enumeration values\n */\nangular.module('a8m.stringular', [])\n  .filter('stringular', function () {\n    return function(input) {\n\n      var args = Array.prototype.slice.call(arguments, 1);\n\n      return input.replace(/{(\\d+)}/g, function (match, number) {\n        return isUndefined(args[number]) ? match : args[number];\n      });\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name stripTags\n * @kind function\n *\n * @description\n * strip html tags from string\n */\nangular.module('a8m.strip-tags', [])\n  .filter('stripTags', function () {\n    return function(input) {\n      return isString(input)\n        ? input.replace(/<\\S[^><]*>/g, '')\n        : input;\n    }\n  });\n\n/**\r\n * @ngdoc filter\r\n * @name test\r\n * @kind function\r\n *\r\n * @description\r\n * test if a string match a pattern.\r\n */\r\nangular.module('a8m.test', [])\r\n  .filter('test', function () {\r\n    return function (input, pattern, flag) {\r\n\r\n      var reg = new RegExp(pattern, flag);\r\n\r\n      return isString(input)\r\n        ? reg.test(input)\r\n        : input;\r\n    }\r\n  });\r\n\n/**\n * @ngdoc filter\n * @name trim\n * @kind function\n *\n * @description\n *  Strip whitespace (or other characters) from the beginning and end of a string\n */\nangular.module('a8m.trim', [])\n  .filter('trim', function () {\n    return function(input, chars) {\n\n      var trim = chars || '\\\\s';\n\n      return isString(input)\n        ? input.replace(new RegExp('^' + trim + '+|' + trim + '+$', 'g'), '')\n        : input;\n    }\n  });\n\n/**\n * @ngdoc filter\n * @name truncate\n * @kind function\n *\n * @description\n * truncates a string given a specified length, providing a custom string to denote an omission.\n */\nangular.module('a8m.truncate', [])\n  .filter('truncate', function () {\n    return function(input, length, suffix, preserve) {\n\n      length = isUndefined(length) ? input.length : length;\n      preserve = preserve || false;\n      suffix = suffix || '';\n\n      if(!isString(input) || (input.length <= length)) return input;\n\n      return input.substring(0, (preserve)\n        ? ((input.indexOf(' ', length) === -1) ? input.length : input.indexOf(' ', length))\n        : length) + suffix;\n    };\n  });\n\n/**\n * @ngdoc filter\n * @name ucfirst\n * @kind function\n *\n * @description\n * ucfirst\n */\nangular.module('a8m.ucfirst', [])\n  .filter('ucfirst', [function() {\n    return function(input) {\n      return isString(input)\n        ? input\n            .split(' ')\n            .map(function (ch) {\n              return ch.charAt(0).toUpperCase() + ch.substring(1);\n            })\n            .join(' ')\n        : input;\n    }\n  }]);\n\n/**\n * @ngdoc filter\n * @name uriComponentEncode\n * @kind function\n *\n * @description\n * get string as parameter and return encoded string\n */\nangular.module('a8m.uri-component-encode', [])\n  .filter('uriComponentEncode',['$window', function ($window) {\n      return function (input) {\n        return isString(input)\n          ? $window.encodeURIComponent(input)\n          : input;\n      }\n    }]);\n\n/**\n * @ngdoc filter\n * @name uriEncode\n * @kind function\n *\n * @description\n * get string as parameter and return encoded string\n */\nangular.module('a8m.uri-encode', [])\n  .filter('uriEncode',['$window', function ($window) {\n      return function (input) {\n        return isString(input)\n          ? $window.encodeURI(input)\n          : input;\n      }\n    }]);\n\n/**\n * @ngdoc filter\n * @name wrap\n * @kind function\n *\n * @description\n * Wrap a string with another string\n */\nangular.module('a8m.wrap', [])\n  .filter('wrap', function () {\n    return function(input, wrap, ends) {\n      return isString(input) && isDefined(wrap)\n        ? [wrap, input, ends || wrap].join('')\n        : input;\n    }\n  });\n\n/**\n * @ngdoc provider\n * @name filterWatcher\n * @kind function\n *\n * @description\n * store specific filters result in $$cache, based on scope life time(avoid memory leak).\n * on scope.$destroy remove it's cache from $$cache container\n */\n\nangular.module('a8m.filter-watcher', [])\n  .provider('filterWatcher', function() {\n\n    this.$get = ['$window', '$rootScope', function($window, $rootScope) {\n\n      /**\n       * Cache storing\n       * @type {Object}\n       */\n      var $$cache = {};\n\n      /**\n       * Scope listeners container\n       * scope.$destroy => remove all cache keys\n       * bind to current scope.\n       * @type {Object}\n       */\n      var $$listeners = {};\n\n      /**\n       * $timeout without triggering the digest cycle\n       * @type {function}\n       */\n      var $$timeout = $window.setTimeout;\n\n      /**\n       * @description\n       * get `HashKey` string based on the given arguments.\n       * @param fName\n       * @param args\n       * @returns {string}\n       */\n      function getHashKey(fName, args) {\n        return [fName, angular.toJson(args)]\n          .join('#')\n          .replace(/\"/g,'');\n      }\n\n      /**\n       * @description\n       * fir on $scope.$destroy,\n       * remove cache based scope from `$$cache`,\n       * and remove itself from `$$listeners`\n       * @param event\n       */\n      function removeCache(event) {\n        var id = event.targetScope.$id;\n        forEach($$listeners[id], function(key) {\n          delete $$cache[key];\n        });\n        delete $$listeners[id];\n      }\n\n      /**\n       * @description\n       * for angular version that greater than v.1.3.0\n       * if clear cache when the digest cycle end.\n       */\n      function cleanStateless() {\n        $$timeout(function() {\n          if(!$rootScope.$$phase)\n            $$cache = {};\n        });\n      }\n\n      /**\n       * @description\n       * Store hashKeys in $$listeners container\n       * on scope.$destroy, remove them all(bind an event).\n       * @param scope\n       * @param hashKey\n       * @returns {*}\n       */\n      function addListener(scope, hashKey) {\n        var id = scope.$id;\n        if(isUndefined($$listeners[id])) {\n          scope.$on('$destroy', removeCache);\n          $$listeners[id] = [];\n        }\n        return $$listeners[id].push(hashKey);\n      }\n\n      /**\n       * @description\n       * return the `cacheKey` or undefined.\n       * @param filterName\n       * @param args\n       * @returns {*}\n       */\n      function $$isMemoized(filterName, args) {\n        var hashKey = getHashKey(filterName, args);\n        return $$cache[hashKey];\n      }\n\n      /**\n       * @description\n       * store `result` in `$$cache` container, based on the hashKey.\n       * add $destroy listener and return result\n       * @param filterName\n       * @param args\n       * @param scope\n       * @param result\n       * @returns {*}\n       */\n      function $$memoize(filterName, args, scope, result) {\n        var hashKey = getHashKey(filterName, args);\n        //store result in `$$cache` container\n        $$cache[hashKey] = result;\n        // for angular versions that less than 1.3\n        // add to `$destroy` listener, a cleaner callback\n        if(isScope(scope)) {\n          addListener(scope, hashKey);\n        } else {\n          cleanStateless();\n        }\n        return result;\n      }\n\n      return {\n        isMemoized: $$isMemoized,\n        memoize: $$memoize\n      }\n\n    }];\n  });\n  \n\n/**\n * @ngdoc module\n * @name angular.filters\n * @description\n * Bunch of useful filters for angularJS\n */\n\nangular.module('angular.filter', [\n\n  'a8m.ucfirst',\n  'a8m.uri-encode',\n  'a8m.uri-component-encode',\n  'a8m.slugify',\n  'a8m.latinize',\n  'a8m.strip-tags',\n  'a8m.stringular',\n  'a8m.truncate',\n  'a8m.starts-with',\n  'a8m.ends-with',\n  'a8m.wrap',\n  'a8m.trim',\n  'a8m.ltrim',\n  'a8m.rtrim',\n  'a8m.repeat',\n  'a8m.test',\n  'a8m.match',\n\n  'a8m.to-array',\n  'a8m.concat',\n  'a8m.contains',\n  'a8m.unique',\n  'a8m.is-empty',\n  'a8m.after',\n  'a8m.after-where',\n  'a8m.before',\n  'a8m.before-where',\n  'a8m.defaults',\n  'a8m.where',\n  'a8m.reverse',\n  'a8m.remove',\n  'a8m.remove-with',\n  'a8m.group-by',\n  'a8m.count-by',\n  'a8m.search-field',\n  'a8m.fuzzy-by',\n  'a8m.fuzzy',\n  'a8m.omit',\n  'a8m.pick',\n  'a8m.every',\n  'a8m.filter-by',\n  'a8m.xor',\n  'a8m.map',\n  'a8m.first',\n  'a8m.last',\n  'a8m.flatten',\n  'a8m.join',\n\n  'a8m.math',\n  'a8m.math.max',\n  'a8m.math.min',\n  'a8m.math.percent',\n  'a8m.math.radix',\n  'a8m.math.sum',\n  'a8m.math.degrees',\n  'a8m.math.radians',\n  'a8m.math.byteFmt',\n  'a8m.math.kbFmt',\n  'a8m.math.shortFmt',\n\n  'a8m.angular',\n  'a8m.conditions',\n  'a8m.is-null',\n\n  'a8m.filter-watcher'\n]);\n})( window, window.angular );"
  },
  {
    "path": "third_party/ui/bower_components/angular-filter/license.md",
    "content": "The MIT License\n\nCopyright (c) 2015 Ariel Mashraki\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/.bower.json",
    "content": "{\n  \"author\": {\n    \"name\": \"Brian Park\",\n    \"email\": \"yaru22@gmail.com\"\n  },\n  \"name\": \"angular-json-human\",\n  \"description\": \"Angular directive to convert JSON into human readable table. Inspired by https://github.com/marianoguerra/json.human.js.\",\n  \"version\": \"1.2.1\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/yaru22/angular-json-human\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/yaru22/angular-json-human.git\"\n  },\n  \"main\": [\n    \"dist/angular-json-human.js\",\n    \"dist/angular-json-human.css\"\n  ],\n  \"ignore\": [\n    \".editorconfig\",\n    \".gitattributes\",\n    \".gitignore\",\n    \".gittrack\",\n    \".jshintrc\",\n    \"demo/\",\n    \"Gruntfile.js\",\n    \"karma-unit.conf.js\",\n    \"package.json\",\n    \"src/\",\n    \"template/\",\n    \"test/\"\n  ],\n  \"dependencies\": {\n    \"angular\": \"^1.2.0\",\n    \"lodash\": \"~2.4.1\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \"^1.2.0\",\n    \"chai\": \"~1.9.0\",\n    \"jquery\": \"~2.1.0\"\n  },\n  \"_release\": \"1.2.1\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"1.2.1\",\n    \"commit\": \"b778d1e1436c600c4d35e4f156fe931c765d559d\"\n  },\n  \"_source\": \"git://github.com/yaru22/angular-json-human.git\",\n  \"_target\": \"~1.2.1\",\n  \"_originalSource\": \"angular-json-human\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2014 Brian Park <yaru22@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/README.md",
    "content": "angular-json-human [![Analytics](https://ga-beacon.appspot.com/UA-2694988-7/angular-json-human/readme?pixel)](https://github.com/yaru22/angular-json-human)\n==================\nAngular directive to convert JSON into human readable table. Inspired by https://github.com/marianoguerra/json.human.js.\n\nDemo\n----\nCheck out the demo [here](http://www.brianpark.ca/projects/angular_json_human/demo/).\n\nDependency\n----------\nThis directive requires `lodash`. I'm going to remove the dependency in the future release.\n\nHow to Use\n----------\nInstall it via `bower`:\n```\n$ bower install angular-json-human\n```\n\nInclude `angular-json-human.(js|css)` in your project. Load the directive after loading `angular.js`\n\n```\n<script src=\"<path to angular.js>\"></script>\n<script src=\"<path to angular-json-human.js>\"></script>\n```\n\nSpecify angular-json-human as a dependency of your Angular module.\n\n```\nvar app = angular.module('ngApp', [\n  'yaru22.jsonHuman'\n]);\n```\n\nUse it in your project.\n\n```\n<html ng-app=\"ngApp\">\n...\n<body ng-controller=\"MainCtrl\">\n  <div json-human=\"jsonStr\"></div>\n  ...\n</body>\n</html>\n```\n\nor check out my [Plunker](http://plnkr.co/edit/0wEPmUsw5kKbBo9RjXW4?p=preview) for the minimal setup.\n\n\nHow to Contribute\n-----------------\n```\n$ git clone https://github.com/yaru22/angular-json-human.git\n$ cd angular-json-human\n$ npm install; bower install\n$ # modify the source code in src/\n$ grunt clean; grunt build\n$ # test your changes; you can modify demo/ and serve it locally to see the changes.\n$ # submit a pull request\n```\n\nTODO\n----\n- Remove the dependency on Lodash.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/bower.json",
    "content": "{\n  \"author\": {\n    \"name\": \"Brian Park\",\n    \"email\": \"yaru22@gmail.com\"\n  },\n\n  \"name\": \"angular-json-human\",\n  \"description\": \"Angular directive to convert JSON into human readable table. Inspired by https://github.com/marianoguerra/json.human.js.\",\n  \"version\": \"1.2.1\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/yaru22/angular-json-human\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/yaru22/angular-json-human.git\"\n  },\n  \"main\": [\n    \"dist/angular-json-human.js\",\n    \"dist/angular-json-human.css\"\n  ],\n  \"ignore\": [\n    \".editorconfig\",\n    \".gitattributes\",\n    \".gitignore\",\n    \".gittrack\",\n    \".jshintrc\",\n    \"demo/\",\n    \"Gruntfile.js\",\n    \"karma-unit.conf.js\",\n    \"package.json\",\n    \"src/\",\n    \"template/\",\n    \"test/\"\n  ],\n\n  \"dependencies\": {\n    \"angular\": \"^1.2.0\",\n    \"lodash\": \"~2.4.1\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \"^1.2.0\",\n    \"chai\": \"~1.9.0\",\n    \"jquery\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/dist/angular-json-human.css",
    "content": "/**\n * Angular directive to convert JSON into human readable table. Inspired by https://github.com/marianoguerra/json.human.js.\n * @version v1.2.1 - 2014-12-22\n * @link https://github.com/yaru22/angular-json-human\n * @author Brian Park <yaru22@gmail.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n/**\n * DISCLAIMER: This CSS is copied from https://github.com/marianoguerra/json.human.js\n */\n\n.jh-root,\n.jh-type-object,\n.jh-type-array,\n.jh-key,\n.jh-value,\n.jh-root tr {\n  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */\n     -moz-box-sizing: border-box; /* Firefox, other Gecko */\n          box-sizing: border-box; /* Opera/IE 8+ */\n}\n\n.jh-key,\n.jh-value {\n  margin: 0;\n  padding: 0.2em;\n}\n\n.jh-value {\n  border-left: 1px solid #ddd;\n}\n\n.jh-type-bool,\n.jh-type-number {\n  font-weight: bold;\n  text-align: center;\n  color: #5286BC;\n}\n\n.jh-type-string {\n  font-style: italic;\n  color: #839B00;\n}\n\n.jh-array-key {\n  font-style: italic;\n  font-size: small;\n  text-align: center;\n}\n\n.jh-object-key,\n.jh-array-key {\n  color: #444;\n  vertical-align: top;\n}\n\n.jh-type-object > tbody > tr:nth-child(odd),\n.jh-type-array > tbody > tr:nth-child(odd) {\n  background-color: #f5f5f5;\n}\n\n.jh-type-object > tbody > tr:nth-child(even),\n.jh-type-array > tbody > tr:nth-child(even) {\n  background-color: #fff;\n}\n\n.jh-type-object,\n.jh-type-array {\n  width: 100%;\n  border-collapse: collapse;\n}\n\n.jh-root {\n  border: 1px solid #ccc;\n  margin: 0.2em;\n}\n\nth.jh-key {\n  text-align: left;\n}\n\n.jh-type-object > tbody > tr,\n.jh-type-array > tbody > tr {\n  border: 1px solid #ddd;\n  border-bottom: none;\n}\n\n.jh-type-object > tbody > tr:last-child,\n.jh-type-array > tbody > tr:last-child {\n  border-bottom: 1px solid #ddd;\n}\n\n.jh-type-object > tbody > tr:hover,\n.jh-type-array > tbody > tr:hover {\n  border: 1px solid #F99927;\n}\n\n.jh-empty {\n  font-style: italic;\n  color: #999;\n  font-size: small;\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-json-human/dist/angular-json-human.js",
    "content": "/**\n * Angular directive to convert JSON into human readable table. Inspired by https://github.com/marianoguerra/json.human.js.\n * @version v1.2.1 - 2014-12-22\n * @link https://github.com/yaru22/angular-json-human\n * @author Brian Park <yaru22@gmail.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n/* global _, angular */\n'use strict';\nangular.module('yaru22.jsonHuman', ['yaru22.jsonHuman.tmpls']).factory('RecursionHelper', [\n  '$compile',\n  function ($compile) {\n    var RecursionHelper = {\n        compile: function (element) {\n          var contents = element.contents().remove();\n          var compiledContents;\n          return function (scope, element) {\n            if (!compiledContents) {\n              compiledContents = $compile(contents);\n            }\n            compiledContents(scope, function (clone) {\n              element.append(clone);\n            });\n            var json = scope.json;\n            scope.isBoolean = _.isBoolean(json);\n            scope.isNumber = _.isNumber(json);\n            scope.isString = _.isString(json);\n            scope.isPrimitive = scope.isBoolean || scope.isNumber || scope.isString;\n            scope.isObject = _.isPlainObject(json);\n            scope.isArray = _.isArray(json);\n            scope.isEmpty = _.isEmpty(json);\n          };\n        }\n      };\n    return RecursionHelper;\n  }\n]).directive('jsonHuman', function () {\n  return {\n    restrict: 'A',\n    scope: { data: '=jsonHuman' },\n    templateUrl: 'template/angular-json-human-root.tmpl',\n    link: function (scope) {\n      scope.$watch('data', function (json) {\n        if (typeof json === 'string') {\n          try {\n            json = JSON.parse(json);\n          } catch (e) {\n          }\n        }\n        scope.json = json;\n        scope.isObject = _.isPlainObject(json);\n        scope.isArray = _.isArray(json);\n      });\n    }\n  };\n}).directive('jsonHumanHelper', [\n  'RecursionHelper',\n  function (RecursionHelper) {\n    return {\n      restrict: 'A',\n      scope: { json: '=jsonHumanHelper' },\n      templateUrl: 'template/angular-json-human.tmpl',\n      compile: function (tElem) {\n        return RecursionHelper.compile(tElem);\n      }\n    };\n  }\n]);\nangular.module('yaru22.jsonHuman.tmpls', []).run([\n  '$templateCache',\n  function ($templateCache) {\n    'use strict';\n    $templateCache.put('template/angular-json-human-root.tmpl', '<table class=jh-root ng-class=\"{ \\'jh-type-array\\': isArray, \\'jh-type-object\\': isObject }\" json-human-helper=json></table>');\n    $templateCache.put('template/angular-json-human.tmpl', '<span ng-if=isPrimitive ng-class=\"{ \\'jh-type-bool\\': isBoolean, \\'jh-type-number\\': isNumber, \\'jh-type-string\\': isString, \\'jh-type-array\\': isArray, \\'jh-type-object\\': isObject }\">{{ json }} <span ng-if=\"isEmpty && isString\" class=jh-empty>(Empty String)</span></span> <span ng-if=\"isEmpty && isArray\" class=jh-empty>(Empty List)</span> <span ng-if=\"isEmpty && isObject\" class=jh-empty>(Empty Object)</span><table ng-if=\"!isEmpty && !isPrimitive\" ng-class=\"{ \\'jh-type-array\\': isArray, \\'jh-type-object\\': isObject }\"><tbody><tr ng-repeat=\"(key, val) in json track by $index\"><th class=jh-key ng-class=\"{ \\'jh-array-key\\': isArray, \\'jh-object-key\\': isObject }\">{{ key }}</th><td class=jh-value ng-class=\"{ \\'jh-array-value\\': isArray, \\'jh-object-value\\': isObject }\" json-human-helper=val></td></tr></tbody></table>');\n  }\n]);"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/.bower.json",
    "content": "{\n  \"name\": \"angular-material\",\n  \"version\": \"0.8.1\",\n  \"dependencies\": {\n    \"angular\": \"1.3.x\",\n    \"angular-animate\": \"1.3.x\",\n    \"angular-aria\": \"1.3.x\"\n  },\n  \"main\": [\n    \"angular-material.js\",\n    \"angular-material.css\"\n  ],\n  \"homepage\": \"https://github.com/angular/bower-material\",\n  \"_release\": \"0.8.1\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v0.8.1\",\n    \"commit\": \"53d48104a6d48b8e87bd97016acd7b5a4d7d1f3c\"\n  },\n  \"_source\": \"git://github.com/angular/bower-material.git\",\n  \"_target\": \"0.8.1\",\n  \"_originalSource\": \"angular-material\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/LICENSE",
    "content": "The MIT License\n\nCopyright (c) 2014 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/README.md",
    "content": "This repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main Angular Material repo](https://github.com/angular/material).\nPlease file issues and pull requests against that repo.\n\n## Installing Angular Material\n\nYou can install this package locally either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-material\n```\n\nNote that this package is not in CommonJS format, so doing `require('angular-material')`\nwill return `undefined`. If you're using \n[Browserify](https://github.com/substack/node-browserify), you can use\n[exposify](https://github.com/thlorenz/exposify) to have `require('angular-material')`\nreturn the `angular-material` global.\n\n### bower\n\n```shell\n# To get the latest stable version, use bower from the command line.\nbower install angular-material\n\n# To get the most recent, last committed-to-master version use:\nbower install angular-material#master \n\n# To save the bower settings for future use:\nbower install angular-material --save\n\n# Later, you can use easily update with:\nbower update\n```\n\n> Please note that Angular Material requires **Angular 1.3.x** or higher.\n\n\n### Using the Angular Material Library\n\nNow that you have installed the Angular libraries, simply include the scripts and \nstylesheet in your main HTML file, in the order shown in the example below. Note that npm \nwill install the files under `/node_modules/angular-material/` and bower will install them \nunder `/bower_components/angular-material/`.\n\n### npm\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\" />\n    <link rel=\"stylesheet\" href=\"/node_modules/angular-material/angular-material.css\">\n</head>\n\t<body ng-app=\"YourApp\">\n\n\t<div ng-controller=\"YourController\">\n\n\t</div>\n\n\t<script src=\"/node_modules/angular/angular.js\"></script>\n\t<script src=\"/node_modules/angular-aria/angular-aria.js\"></script>\n\t<script src=\"/node_modules/angular-animate/angular-animate.js\"></script>\n\t<script src=\"/node_modules/angular-material/angular-material.js\"></script>\n\t<script>\n\n\t\t// Include app dependency on ngMaterial\n\n\t\tangular.module( 'YourApp', [ 'ngMaterial' ] )\n\t\t\t.controller(\"YourController\", YourController );\n\n\t</script>\n\n</body>\n</html>\n```\n\n### bower\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\" />\n    <link rel=\"stylesheet\" href=\"/bower_components/angular-material/angular-material.css\">\n</head>\n\t<body ng-app=\"YourApp\">\n\n\t<div ng-controller=\"YourController\">\n\n\t</div>\n\n\t<script src=\"/bower_components/angular/angular.js\"></script>\n\t<script src=\"/bower_components/angular-aria/angular-aria.js\"></script>\n\t<script src=\"/bower_components/angular-animate/angular-animate.js\"></script>\n\t<script src=\"/bower_components/angular-material/angular-material.js\"></script>\n\t<script>\n\n\t\t// Include app dependency on ngMaterial\n\n\t\tangular.module( 'YourApp', [ 'ngMaterial' ] )\n\t\t\t.controller(\"YourController\", YourController );\n\n\t</script>\n\n</body>\n</html>\n```\n\n#### CDN\n\nCDN versions of Angular Material are now available at \n[Google Hosted Libraries](https://developers.google.com/speed/libraries/devguide#angularmaterial). \n\nWith the Google CDN, you will not need to download local copies of the distribution files.\nInstead simply reference the CDN urls to easily use those remote library files. \nThis is especially useful when using online tools such as CodePen, Plunkr, or jsFiddle.\n\n```html\n  <head>\n\n    <!-- Angular Material CSS now available via Google CDN; version 0.7.1 used here -->\n    <link rel=\"stylesheet\" href=\"//ajax.googleapis.com/ajax/libs/angular_material/0.7.1/angular-material.min.css\">\n\n  </head>\n  <body>\n  \n    <!-- Angular Material Dependencies -->\n    <script src=\"//cdn.jsdelivr.net/hammerjs/2.0.4/hammer.min.js\"></script>\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js\"></script>\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-animate.min.js\"></script>\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-aria.min.js\"></script>\n    \n    <!-- Angular Material Javascript now available via Google CDN; version 0.7.1 used here -->\n    <script src=\"//ajax.googleapis.com/ajax/libs/angular_material/0.7.1/angular-material.min.js\"></script>\n    \n  </body>\n```\n\n> Note that the above sample references the 0.7.1 CDN release. Your version will change \nbased on the latest stable release version.\n\nDevelopers seeking the latest, most-current build versions can use [RawGit.com](//rawgit.com) to\npull directly from the distribution GitHub\n[Bower-Material](https://github.com/angular/bower-material) repository:\n\n```html\n  <head>\n\n    <!-- Angular Material CSS using RawGit to load directly from `bower-material/master` -->\n    <link rel=\"stylesheet\" href=\"//rawgit.com/angular/bower-material/master/angular-material.css\">\n\n  </head>\n  <body>\n\n    <!-- Angular Material Dependencies -->\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.js\"></script>\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-animate.js\"></script>\n    <script src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-aria.js\"></script>\n\n    <!-- Angular Material Javascript using RawGit to load directly from `bower-material/master` -->\n    <script src=\"//rawgit.com/angular/bower-material/master/angular-material.js\"></script>\n\n  </body>\n```\n\n> Please note that the above RawGit access is intended **ONLY** for development purposes or sharing\n  low-traffic, temporary examples or demos with small numbers of people.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/angular-material.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n*, *:before, *:after {\n  box-sizing: border-box; }\n\n:focus {\n  outline: none; }\n\nhtml, body {\n  height: 100%;\n  color: rgba(0, 0, 0, 0.87);\n  background: white;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  -webkit-touch-callout: none;\n  -webkit-text-size-adjust: 100%;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility; }\n  html p, body p {\n    line-height: 1.846; }\n  html h3, body h3 {\n    display: block;\n    -webkit-margin-before: 1em;\n    -webkit-margin-after: 1em;\n    -webkit-margin-start: 0px;\n    -webkit-margin-end: 0px;\n    font-size: 1.17em;\n    font-weight: bold; }\n\nbutton, select, html, textarea, input {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\nbody {\n  margin: 0;\n  padding: 0;\n  outline: none; }\n\n.inset {\n  padding: 10px; }\n\nbutton {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\na {\n  background: transparent;\n  outline: none; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nh2 {\n  font-size: 1.5em;\n  margin: 0.83em 0; }\n\nh3 {\n  font-size: 1.17em;\n  margin: 1em 0; }\n\nh4 {\n  font-size: 1em;\n  margin: 1.33em 0; }\n\nh5 {\n  font-size: 0.83em;\n  margin: 1.67em 0; }\n\nh6 {\n  font-size: 0.75em;\n  margin: 2.33em 0; }\n\nselect, button, textarea, input {\n  margin: 0;\n  font-size: 100%;\n  font-family: inherit;\n  vertical-align: baseline; }\n\ninput[type=\"reset\"], input[type=\"submit\"], html input[type=\"button\"], button {\n  cursor: pointer;\n  -webkit-appearance: button; }\n  input[type=\"reset\"][disabled], input[type=\"submit\"][disabled], html input[type=\"button\"][disabled], button[disabled] {\n    cursor: default; }\n\ntextarea {\n  vertical-align: top;\n  overflow: auto; }\n\ninput[type=\"radio\"], input[type=\"checkbox\"] {\n  padding: 0;\n  box-sizing: border-box; }\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box; }\n  input[type=\"search\"]::-webkit-search-decoration, input[type=\"search\"]::-webkit-search-cancel-button {\n    -webkit-appearance: none; }\n\n.visually-hidden {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  text-transform: none;\n  width: 1px; }\n\n.md-shadow {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: inherit;\n  pointer-events: none; }\n\n.md-shadow-bottom-z-1, .md-button.md-raised:not([disabled]), .md-button.md-fab {\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-shadow-bottom-z-2, .md-button.md-raised:not([disabled]):focus, .md-button.md-raised:not([disabled]):hover, .md-button.md-fab:not([disabled]):focus, .md-button.md-fab:not([disabled]):hover {\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4); }\n\n.md-shadow-animated.md-shadow {\n  transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); }\n\n/*\n * A container inside of a rippling element (eg a button),\n * which contains all of the individual ripples\n */\n.md-ripple-container {\n  pointer-events: none;\n  position: absolute;\n  overflow: hidden;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1); }\n\n.md-ripple {\n  position: absolute;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n  opacity: 0;\n  border-radius: 50%; }\n  .md-ripple.md-ripple-placed {\n    transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1);\n    transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-ripple.md-ripple-scaled {\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  .md-ripple.md-ripple-active, .md-ripple.md-ripple-full, .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n\nmd-tab > .md-ripple-container .md-ripple {\n  box-sizing: content-box;\n  background-color: transparent !important;\n  border-width: 0;\n  border-style: solid;\n  opacity: 0.2;\n  -webkit-transform: none !important;\n          transform: none !important; }\n  md-tab > .md-ripple-container .md-ripple.md-ripple-active, md-tab > .md-ripple-container .md-ripple.md-ripple-full, md-tab > .md-ripple-container .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n\n/* Sizes:\n  0    <= size < 600  Phone\n  600  <= size < 960  Tablet\n  960  <= size < 1200 Tablet-Landscape\n  1200 <= size         PC\n*/\n[layout] {\n  box-sizing: border-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n[layout=column] {\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n\n[layout=row] {\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row; }\n\n[layout-padding], [layout-padding] > [flex] {\n  padding: 8px; }\n\n[layout-margin], [layout-margin] > [flex] {\n  margin: 8px; }\n\n[layout-wrap] {\n  -webkit-flex-wrap: wrap;\n      -ms-flex-wrap: wrap;\n          flex-wrap: wrap; }\n\n[layout-fill] {\n  margin: 0;\n  min-height: 100%;\n  width: 100%; }\n\n@-moz-document url-prefix() {\n  [layout-fill] {\n    margin: 0;\n    width: 100%;\n    min-height: auto;\n    height: inherit; } }\n\n[flex] {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1; }\n\n[flex=\"0\"] {\n  -webkit-flex: 0 0 0%;\n      -ms-flex: 0 0 0%;\n          flex: 0 0 0%; }\n\n[layout=\"row\"] > [flex=\"0\"] {\n  max-width: 0%; }\n\n[layout=\"column\"] > [flex=\"0\"] {\n  max-height: 0%; }\n\n[flex=\"5\"] {\n  -webkit-flex: 0 0 5%;\n      -ms-flex: 0 0 5%;\n          flex: 0 0 5%; }\n\n[layout=\"row\"] > [flex=\"5\"] {\n  max-width: 5%; }\n\n[layout=\"column\"] > [flex=\"5\"] {\n  max-height: 5%; }\n\n[flex=\"10\"] {\n  -webkit-flex: 0 0 10%;\n      -ms-flex: 0 0 10%;\n          flex: 0 0 10%; }\n\n[layout=\"row\"] > [flex=\"10\"] {\n  max-width: 10%; }\n\n[layout=\"column\"] > [flex=\"10\"] {\n  max-height: 10%; }\n\n[flex=\"15\"] {\n  -webkit-flex: 0 0 15%;\n      -ms-flex: 0 0 15%;\n          flex: 0 0 15%; }\n\n[layout=\"row\"] > [flex=\"15\"] {\n  max-width: 15%; }\n\n[layout=\"column\"] > [flex=\"15\"] {\n  max-height: 15%; }\n\n[flex=\"20\"] {\n  -webkit-flex: 0 0 20%;\n      -ms-flex: 0 0 20%;\n          flex: 0 0 20%; }\n\n[layout=\"row\"] > [flex=\"20\"] {\n  max-width: 20%; }\n\n[layout=\"column\"] > [flex=\"20\"] {\n  max-height: 20%; }\n\n[flex=\"25\"] {\n  -webkit-flex: 0 0 25%;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%; }\n\n[layout=\"row\"] > [flex=\"25\"] {\n  max-width: 25%; }\n\n[layout=\"column\"] > [flex=\"25\"] {\n  max-height: 25%; }\n\n[flex=\"30\"] {\n  -webkit-flex: 0 0 30%;\n      -ms-flex: 0 0 30%;\n          flex: 0 0 30%; }\n\n[layout=\"row\"] > [flex=\"30\"] {\n  max-width: 30%; }\n\n[layout=\"column\"] > [flex=\"30\"] {\n  max-height: 30%; }\n\n[flex=\"35\"] {\n  -webkit-flex: 0 0 35%;\n      -ms-flex: 0 0 35%;\n          flex: 0 0 35%; }\n\n[layout=\"row\"] > [flex=\"35\"] {\n  max-width: 35%; }\n\n[layout=\"column\"] > [flex=\"35\"] {\n  max-height: 35%; }\n\n[flex=\"40\"] {\n  -webkit-flex: 0 0 40%;\n      -ms-flex: 0 0 40%;\n          flex: 0 0 40%; }\n\n[layout=\"row\"] > [flex=\"40\"] {\n  max-width: 40%; }\n\n[layout=\"column\"] > [flex=\"40\"] {\n  max-height: 40%; }\n\n[flex=\"45\"] {\n  -webkit-flex: 0 0 45%;\n      -ms-flex: 0 0 45%;\n          flex: 0 0 45%; }\n\n[layout=\"row\"] > [flex=\"45\"] {\n  max-width: 45%; }\n\n[layout=\"column\"] > [flex=\"45\"] {\n  max-height: 45%; }\n\n[flex=\"50\"] {\n  -webkit-flex: 0 0 50%;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%; }\n\n[layout=\"row\"] > [flex=\"50\"] {\n  max-width: 50%; }\n\n[layout=\"column\"] > [flex=\"50\"] {\n  max-height: 50%; }\n\n[flex=\"55\"] {\n  -webkit-flex: 0 0 55%;\n      -ms-flex: 0 0 55%;\n          flex: 0 0 55%; }\n\n[layout=\"row\"] > [flex=\"55\"] {\n  max-width: 55%; }\n\n[layout=\"column\"] > [flex=\"55\"] {\n  max-height: 55%; }\n\n[flex=\"60\"] {\n  -webkit-flex: 0 0 60%;\n      -ms-flex: 0 0 60%;\n          flex: 0 0 60%; }\n\n[layout=\"row\"] > [flex=\"60\"] {\n  max-width: 60%; }\n\n[layout=\"column\"] > [flex=\"60\"] {\n  max-height: 60%; }\n\n[flex=\"65\"] {\n  -webkit-flex: 0 0 65%;\n      -ms-flex: 0 0 65%;\n          flex: 0 0 65%; }\n\n[layout=\"row\"] > [flex=\"65\"] {\n  max-width: 65%; }\n\n[layout=\"column\"] > [flex=\"65\"] {\n  max-height: 65%; }\n\n[flex=\"70\"] {\n  -webkit-flex: 0 0 70%;\n      -ms-flex: 0 0 70%;\n          flex: 0 0 70%; }\n\n[layout=\"row\"] > [flex=\"70\"] {\n  max-width: 70%; }\n\n[layout=\"column\"] > [flex=\"70\"] {\n  max-height: 70%; }\n\n[flex=\"75\"] {\n  -webkit-flex: 0 0 75%;\n      -ms-flex: 0 0 75%;\n          flex: 0 0 75%; }\n\n[layout=\"row\"] > [flex=\"75\"] {\n  max-width: 75%; }\n\n[layout=\"column\"] > [flex=\"75\"] {\n  max-height: 75%; }\n\n[flex=\"80\"] {\n  -webkit-flex: 0 0 80%;\n      -ms-flex: 0 0 80%;\n          flex: 0 0 80%; }\n\n[layout=\"row\"] > [flex=\"80\"] {\n  max-width: 80%; }\n\n[layout=\"column\"] > [flex=\"80\"] {\n  max-height: 80%; }\n\n[flex=\"85\"] {\n  -webkit-flex: 0 0 85%;\n      -ms-flex: 0 0 85%;\n          flex: 0 0 85%; }\n\n[layout=\"row\"] > [flex=\"85\"] {\n  max-width: 85%; }\n\n[layout=\"column\"] > [flex=\"85\"] {\n  max-height: 85%; }\n\n[flex=\"90\"] {\n  -webkit-flex: 0 0 90%;\n      -ms-flex: 0 0 90%;\n          flex: 0 0 90%; }\n\n[layout=\"row\"] > [flex=\"90\"] {\n  max-width: 90%; }\n\n[layout=\"column\"] > [flex=\"90\"] {\n  max-height: 90%; }\n\n[flex=\"95\"] {\n  -webkit-flex: 0 0 95%;\n      -ms-flex: 0 0 95%;\n          flex: 0 0 95%; }\n\n[layout=\"row\"] > [flex=\"95\"] {\n  max-width: 95%; }\n\n[layout=\"column\"] > [flex=\"95\"] {\n  max-height: 95%; }\n\n[flex=\"100\"] {\n  -webkit-flex: 0 0 100%;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%; }\n\n[layout=\"row\"] > [flex=\"100\"] {\n  max-width: 100%; }\n\n[layout=\"column\"] > [flex=\"100\"] {\n  max-height: 100%; }\n\n[layout=\"row\"] > [flex=\"33\"], [layout=\"row\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-width: 33.33%; }\n[layout=\"row\"] > [flex=\"66\"], [layout=\"row\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-width: 66.66%; }\n\n[layout=\"column\"] > [flex=\"33\"], [layout=\"column\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-height: 33.33%; }\n[layout=\"column\"] > [flex=\"66\"], [layout=\"column\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-height: 66.66%; }\n\n[layout-align=\"center\"], [layout-align=\"center center\"], [layout-align=\"center start\"], [layout-align=\"center end\"] {\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n[layout-align=\"end\"], [layout-align=\"end center\"], [layout-align=\"end start\"], [layout-align=\"end end\"] {\n  -webkit-justify-content: flex-end;\n      -ms-flex-pack: end;\n          justify-content: flex-end; }\n\n[layout-align=\"space-around\"], [layout-align=\"space-around center\"], [layout-align=\"space-around start\"], [layout-align=\"space-around end\"] {\n  -webkit-justify-content: space-around;\n      -ms-flex-pack: distribute;\n          justify-content: space-around; }\n\n[layout-align=\"space-between\"], [layout-align=\"space-between center\"], [layout-align=\"space-between start\"], [layout-align=\"space-between end\"] {\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between; }\n\n[layout-align=\"center center\"], [layout-align=\"start center\"], [layout-align=\"end center\"], [layout-align=\"space-between center\"], [layout-align=\"space-around center\"] {\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center; }\n\n[layout-align=\"center start\"], [layout-align=\"start start\"], [layout-align=\"end start\"], [layout-align=\"space-between start\"], [layout-align=\"space-around start\"] {\n  -webkit-align-items: flex-start;\n      -ms-flex-align: start;\n          align-items: flex-start; }\n\n[layout-align=\"center end\"], [layout-align=\"start end\"], [layout-align=\"end end\"], [layout-align=\"space-between end\"], [layout-align=\"space-around end\"] {\n  -webkit-align-items: flex-end;\n      -ms-flex-align: end;\n          align-items: flex-end; }\n\n[flex-order=\"0\"] {\n  -webkit-order: 0;\n      -ms-flex-order: 0;\n          order: 0; }\n\n[flex-order=\"1\"] {\n  -webkit-order: 1;\n      -ms-flex-order: 1;\n          order: 1; }\n\n[flex-order=\"2\"] {\n  -webkit-order: 2;\n      -ms-flex-order: 2;\n          order: 2; }\n\n[flex-order=\"3\"] {\n  -webkit-order: 3;\n      -ms-flex-order: 3;\n          order: 3; }\n\n[flex-order=\"4\"] {\n  -webkit-order: 4;\n      -ms-flex-order: 4;\n          order: 4; }\n\n[flex-order=\"5\"] {\n  -webkit-order: 5;\n      -ms-flex-order: 5;\n          order: 5; }\n\n[flex-order=\"6\"] {\n  -webkit-order: 6;\n      -ms-flex-order: 6;\n          order: 6; }\n\n[flex-order=\"7\"] {\n  -webkit-order: 7;\n      -ms-flex-order: 7;\n          order: 7; }\n\n[flex-order=\"8\"] {\n  -webkit-order: 8;\n      -ms-flex-order: 8;\n          order: 8; }\n\n[flex-order=\"9\"] {\n  -webkit-order: 9;\n      -ms-flex-order: 9;\n          order: 9; }\n\n/**\n * `hide-gt-sm show-gt-lg` should hide from 600px to 1200px\n * `show-md hide-gt-sm` should show from 0px to 960px and hide at >960px\n * `hide-gt-md show-gt-sm` should show everywhere (show overrides hide)`\n */\n@media (max-width: 599px) {\n  [hide-sm]:not([show-sm]):not([show]), [hide]:not([show-sm]):not([show]) {\n    display: none; }\n\n  [flex-order-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-sm=\"center\"], [layout-align-sm=\"center center\"], [layout-align-sm=\"center start\"], [layout-align-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-sm=\"end\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-sm=\"space-around\"], [layout-align-sm=\"space-around center\"], [layout-align-sm=\"space-around start\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-sm=\"space-between\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-sm=\"center center\"], [layout-align-sm=\"start center\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-sm=\"center start\"], [layout-align-sm=\"start start\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-sm=\"center end\"], [layout-align-sm=\"start end\"], [layout-align-sm=\"end end\"], [layout-align-sm=\"space-between end\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"33\"], [layout=\"row\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-sm=\"66\"], [layout=\"row\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-sm=\"33\"], [layout=\"column\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-sm=\"66\"], [layout=\"column\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) {\n  [flex-order-gt-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-sm=\"center\"], [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-sm=\"end\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-sm=\"space-around\"], [layout-align-gt-sm=\"space-around center\"], [layout-align-gt-sm=\"space-around start\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-sm=\"space-between\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"start center\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"start start\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-sm=\"center end\"], [layout-align-gt-sm=\"start end\"], [layout-align-gt-sm=\"end end\"], [layout-align-gt-sm=\"space-between end\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"33\"], [layout=\"row\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-sm=\"66\"], [layout=\"row\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"33\"], [layout=\"column\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-sm=\"66\"], [layout=\"column\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) and (max-width: 959px) {\n  [hide]:not([show-gt-sm]):not([show-md]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]) {\n    display: none; }\n\n  [hide-md]:not([show-md]):not([show]) {\n    display: none; }\n\n  [flex-order-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-md=\"center\"], [layout-align-md=\"center center\"], [layout-align-md=\"center start\"], [layout-align-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-md=\"end\"], [layout-align-md=\"end center\"], [layout-align-md=\"end start\"], [layout-align-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-md=\"space-around\"], [layout-align-md=\"space-around center\"], [layout-align-md=\"space-around start\"], [layout-align-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-md=\"space-between\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-md=\"center center\"], [layout-align-md=\"start center\"], [layout-align-md=\"end center\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-md=\"center start\"], [layout-align-md=\"start start\"], [layout-align-md=\"end start\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-md=\"center end\"], [layout-align-md=\"start end\"], [layout-align-md=\"end end\"], [layout-align-md=\"space-between end\"], [layout-align-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-md=\"33\"], [layout=\"row\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-md=\"66\"], [layout=\"row\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-md=\"33\"], [layout=\"column\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-md=\"66\"], [layout=\"column\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) {\n  [flex-order-gt-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-md=\"center\"], [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-md=\"end\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-md=\"space-around\"], [layout-align-gt-md=\"space-around center\"], [layout-align-gt-md=\"space-around start\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-md=\"space-between\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"start center\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"start start\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-md=\"center end\"], [layout-align-gt-md=\"start end\"], [layout-align-gt-md=\"end end\"], [layout-align-gt-md=\"space-between end\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"33\"], [layout=\"row\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-md=\"66\"], [layout=\"row\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"33\"], [layout=\"column\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-md=\"66\"], [layout=\"column\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) and (max-width: 1199px) {\n  [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]) {\n    display: none; }\n\n  [hide-lg]:not([show-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-lg=\"center\"], [layout-align-lg=\"center center\"], [layout-align-lg=\"center start\"], [layout-align-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-lg=\"end\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-lg=\"space-around\"], [layout-align-lg=\"space-around center\"], [layout-align-lg=\"space-around start\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-lg=\"space-between\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-lg=\"center center\"], [layout-align-lg=\"start center\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-lg=\"center start\"], [layout-align-lg=\"start start\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-lg=\"center end\"], [layout-align-lg=\"start end\"], [layout-align-lg=\"end end\"], [layout-align-lg=\"space-between end\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"33\"], [layout=\"row\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-lg=\"66\"], [layout=\"row\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-lg=\"33\"], [layout=\"column\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-lg=\"66\"], [layout=\"column\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 1200px) {\n  [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-gt-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-lg=\"center\"], [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-lg=\"end\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-lg=\"space-around\"], [layout-align-gt-lg=\"space-around center\"], [layout-align-gt-lg=\"space-around start\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-lg=\"space-between\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"start center\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"start start\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-lg=\"center end\"], [layout-align-gt-lg=\"start end\"], [layout-align-gt-lg=\"end end\"], [layout-align-gt-lg=\"space-between end\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"33\"], [layout=\"row\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-lg=\"66\"], [layout=\"row\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"33\"], [layout=\"column\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-lg=\"66\"], [layout=\"column\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@-webkit-keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@-webkit-keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\n@keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\nmd-content {\n  overflow: visible; }\n\nmd-autocomplete {\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n  border-radius: 2px;\n  display: block;\n  height: 40px;\n  position: relative;\n  overflow: visible; }\n  md-autocomplete md-autocomplete-wrap {\n    display: block;\n    position: relative;\n    overflow: visible;\n    height: 40px; }\n    md-autocomplete md-autocomplete-wrap md-progress-linear {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      width: 100%;\n      height: 3px;\n      transition: none; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear .md-container {\n        transition: none;\n        top: auto;\n        height: 3px; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter.ng-enter-active {\n          opacity: 1; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave.ng-leave-active {\n          opacity: 0; }\n  md-autocomplete input {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    box-sizing: border-box;\n    border: none;\n    box-shadow: none;\n    padding: 0 15px;\n    font-size: 14px;\n    line-height: 40px;\n    height: 40px;\n    outline: none;\n    z-index: 2;\n    background: transparent; }\n    md-autocomplete input::-ms-clear {\n      display: none; }\n  md-autocomplete button {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    line-height: 20px;\n    z-index: 2;\n    text-align: center;\n    width: 20px;\n    height: 20px;\n    cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    padding: 0;\n    font-size: 12px;\n    background: transparent; }\n    md-autocomplete button:after {\n      content: '';\n      position: absolute;\n      top: -6px;\n      right: -6px;\n      bottom: -6px;\n      left: -6px;\n      border-radius: 50%;\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      opacity: 0;\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      z-index: -1; }\n    md-autocomplete button:focus:after {\n      -webkit-transform: scale(1);\n              transform: scale(1);\n      opacity: 1; }\n    md-autocomplete button md-icon {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      -webkit-transform: translate3d(-50%, -50%, 0) scale(0.9);\n              transform: translate3d(-50%, -50%, 0) scale(0.9); }\n      md-autocomplete button md-icon path {\n        stroke-width: 0; }\n    md-autocomplete button.ng-enter {\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-enter.ng-enter-active {\n        -webkit-transform: scale(1);\n                transform: scale(1); }\n    md-autocomplete button.ng-leave {\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-leave.ng-leave-active {\n        -webkit-transform: scale(0);\n                transform: scale(0); }\n  md-autocomplete ul {\n    position: absolute;\n    top: 100%;\n    left: 0;\n    right: 0;\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n    margin: 0;\n    list-style: none;\n    padding: 0;\n    overflow: auto;\n    max-height: 225.5px;\n    z-index: 49; }\n    md-autocomplete ul li {\n      border-top: 1px solid #ddd;\n      padding: 0 15px;\n      line-height: 40px;\n      font-size: 14px;\n      overflow: hidden;\n      height: 40px;\n      transition: background 0.15s linear;\n      cursor: pointer;\n      margin: 0; }\n      md-autocomplete ul li.ng-enter, md-autocomplete ul li.ng-hide-remove {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-in 0.2s;\n                animation: md-autocomplete-list-in 0.2s; }\n      md-autocomplete ul li.ng-leave, md-autocomplete ul li.ng-hide-add {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-out 0.2s;\n                animation: md-autocomplete-list-out 0.2s; }\n\nmd-backdrop {\n  z-index: 50;\n  background-color: rgba(0, 0, 0, 0);\n  position: fixed;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0; }\n  md-backdrop.md-select-backdrop {\n    z-index: 81; }\n  md-backdrop.md-dialog-backdrop {\n    z-index: 79; }\n  md-backdrop.md-bottom-sheet-backdrop {\n    z-index: 69; }\n  md-backdrop.md-sidenav-backdrop {\n    z-index: 59; }\n  md-backdrop.ng-enter {\n    -webkit-animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both;\n            animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both; }\n  md-backdrop.ng-leave {\n    -webkit-animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both;\n            animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both; }\n\n@-webkit-keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@-webkit-keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n\n@keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n\nmd-bottom-sheet {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 8px 16px 88px 16px;\n  z-index: 70;\n  border-top: 1px solid;\n  -webkit-transform: translate3d(0, 80px, 0);\n          transform: translate3d(0, 80px, 0);\n  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  transition-property: -webkit-transform;\n  transition-property: transform; }\n  md-bottom-sheet.md-has-header {\n    padding-top: 0; }\n  md-bottom-sheet.ng-enter {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n  md-bottom-sheet.ng-enter-active {\n    opacity: 1;\n    display: block;\n    -webkit-transform: translate3d(0, 80px, 0) !important;\n            transform: translate3d(0, 80px, 0) !important; }\n  md-bottom-sheet.ng-leave-active {\n    -webkit-transform: translate3d(0, 100%, 0) !important;\n            transform: translate3d(0, 100%, 0) !important;\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-bottom-sheet .md-subheader {\n    background-color: transparent;\n    font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif;\n    line-height: 56px;\n    padding: 0;\n    white-space: nowrap; }\n  md-bottom-sheet md-inline-icon {\n    display: inline-block;\n    height: 24px;\n    width: 24px;\n    fill: #444; }\n  md-bottom-sheet md-item {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    outline: none; }\n    md-bottom-sheet md-item:hover {\n      cursor: pointer; }\n  md-bottom-sheet.md-list md-item {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    height: 48px; }\n    md-bottom-sheet.md-list md-item div.md-icon-container {\n      display: inline-block;\n      height: 24px;\n      margin-right: 32px; }\n  md-bottom-sheet.md-grid {\n    padding-left: 24px;\n    padding-right: 24px;\n    padding-top: 0; }\n    md-bottom-sheet.md-grid md-list {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-flex-direction: row;\n          -ms-flex-direction: row;\n              flex-direction: row;\n      -webkit-flex-wrap: wrap;\n          -ms-flex-wrap: wrap;\n              flex-wrap: wrap;\n      transition: all 0.5s;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center; }\n    md-bottom-sheet.md-grid md-item {\n      -webkit-flex-direction: column;\n          -ms-flex-direction: column;\n              flex-direction: column;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      transition: all 0.5s;\n      height: 96px;\n      margin-top: 8px;\n      margin-bottom: 8px;\n      /* Mixin for how many grid items to show per row */ }\n      @media screen and (max-width: 600px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 33.33333%;\n              -ms-flex: 1 1 33.33333%;\n                  flex: 1 1 33.33333%;\n          max-width: 33.33333%; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n+1) {\n            -webkit-align-items: flex-start;\n                -ms-flex-align: start;\n                    align-items: flex-start; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n) {\n            -webkit-align-items: flex-end;\n                -ms-flex-align: end;\n                    align-items: flex-end; } }\n      @media screen and (min-width: 600px) and (max-width: 960px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 25%;\n              -ms-flex: 1 1 25%;\n                  flex: 1 1 25%;\n          max-width: 25%; } }\n      @media screen and (min-width: 960px) and (max-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 16.66667%;\n              -ms-flex: 1 1 16.66667%;\n                  flex: 1 1 16.66667%;\n          max-width: 16.66667%; } }\n      @media screen and (min-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 14.28571%;\n              -ms-flex: 1 1 14.28571%;\n                  flex: 1 1 14.28571%;\n          max-width: 14.28571%; } }\n      md-bottom-sheet.md-grid md-item .md-item-content {\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 48px;\n        padding-bottom: 16px; }\n      md-bottom-sheet.md-grid md-item .md-grid-item-content {\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 80px; }\n      md-bottom-sheet.md-grid md-item .md-icon-container {\n        display: inline-block;\n        box-sizing: border-box;\n        height: 48px;\n        width: 48px;\n        margin: 0 0; }\n      md-bottom-sheet.md-grid md-item p.md-grid-text {\n        font-weight: 300;\n        line-height: 16px;\n        font-size: 13px;\n        margin: 0;\n        white-space: nowrap;\n        width: 64px;\n        text-align: center;\n        padding-top: 8px; }\n\nmd-card {\n  box-sizing: border-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  margin: 8px;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n  md-card > img, md-card > :not(md-card-content) img {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0;\n    width: 100%; }\n  md-card md-card-content {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 16px; }\n\n/**\n * Position a FAB button.\n */\n.md-button {\n  color: currentColor;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  position: relative;\n  outline: none;\n  border: 0;\n  padding: 6px;\n  margin: 0;\n  background: transparent;\n  white-space: nowrap;\n  text-align: center;\n  text-transform: uppercase;\n  font-weight: 500;\n  font-style: inherit;\n  font-variant: inherit;\n  font-size: inherit;\n  font-family: inherit;\n  line-height: inherit;\n  text-decoration: none;\n  cursor: pointer;\n  overflow: hidden;\n  transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-button:focus {\n    outline: none; }\n  .md-button:hover {\n    text-decoration: none; }\n  .md-button.ng-hide {\n    transition: none; }\n  .md-button.md-cornered {\n    border-radius: 0; }\n  .md-button.md-icon {\n    padding: 0;\n    background: none; }\n  .md-button.md-raised {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  .md-button.md-fab {\n    z-index: 20;\n    width: 56px;\n    height: 56px;\n    border-radius: 50%;\n    border-radius: 50%;\n    overflow: hidden;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    transition: 0.2s linear;\n    transition-property: -webkit-transform, box-shadow;\n    transition-property: transform, box-shadow; }\n    .md-button.md-fab.md-fab-bottom-right {\n      top: auto;\n      right: 20px;\n      bottom: 20px;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-bottom-left {\n      top: auto;\n      right: auto;\n      bottom: 20px;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-right {\n      top: 20px;\n      right: 20px;\n      bottom: auto;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-left {\n      top: 20px;\n      right: auto;\n      bottom: auto;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab md-icon {\n      margin-top: 0; }\n    .md-button.md-fab.md-mini {\n      width: 40px;\n      height: 40px; }\n  .md-button:not([disabled]).md-raised:focus, .md-button:not([disabled]).md-raised:hover, .md-button:not([disabled]).md-fab:focus, .md-button:not([disabled]).md-fab:hover {\n    -webkit-transform: translate3d(0, -1px, 0);\n            transform: translate3d(0, -1px, 0); }\n\n.md-toast-open-top .md-button.md-fab-top-left, .md-toast-open-top .md-button.md-fab-top-right {\n  -webkit-transform: translate3d(0, 42px, 0);\n          transform: translate3d(0, 42px, 0); }\n  .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, 41px, 0);\n            transform: translate3d(0, 41px, 0); }\n\n.md-toast-open-bottom .md-button.md-fab-bottom-left, .md-toast-open-bottom .md-button.md-fab-bottom-right {\n  -webkit-transform: translate3d(0, -42px, 0);\n          transform: translate3d(0, -42px, 0); }\n  .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, -43px, 0);\n            transform: translate3d(0, -43px, 0); }\n\n.md-button-group {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  width: 100%; }\n\n.md-button-group > .md-button {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  display: block;\n  overflow: hidden;\n  width: 0;\n  border-width: 1px 0px 1px 1px;\n  border-radius: 0;\n  text-align: center;\n  text-overflow: ellipsis;\n  white-space: nowrap; }\n  .md-button-group > .md-button:first-child {\n    border-radius: 2px 0px 0px 2px; }\n  .md-button-group > .md-button:last-child {\n    border-right-width: 1px;\n    border-radius: 0px 2px 2px 0px; }\n\nmd-checkbox {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-checkbox .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 18px;\n    height: 18px; }\n    md-checkbox .md-container:after {\n      content: '';\n      position: absolute;\n      top: -10px;\n      right: -10px;\n      bottom: -10px;\n      left: -10px; }\n    md-checkbox .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -15px;\n      top: -15px;\n      right: -15px;\n      bottom: -15px; }\n  md-checkbox .md-icon {\n    transition: 240ms;\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 18px;\n    height: 18px;\n    border: 2px solid;\n    border-radius: 2px; }\n  md-checkbox.md-checked .md-icon {\n    border: none; }\n  md-checkbox[disabled] {\n    cursor: no-drop; }\n  md-checkbox:focus .md-label:not(:empty) {\n    border-color: black; }\n  md-checkbox.md-checked .md-icon:after {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg);\n    position: absolute;\n    left: 6px;\n    top: 2px;\n    display: table;\n    width: 6px;\n    height: 12px;\n    border: 2px solid;\n    border-top: 0;\n    border-left: 0;\n    content: ' '; }\n  md-checkbox .md-label {\n    border: 1px dotted transparent;\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    -webkit-user-select: text;\n       -moz-user-select: text;\n        -ms-user-select: text;\n            user-select: text; }\n\nmd-content {\n  display: block;\n  position: relative;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch; }\n  md-content[md-scroll-y] {\n    overflow-y: auto;\n    overflow-x: hidden; }\n  md-content[md-scroll-x] {\n    overflow-x: auto;\n    overflow-y: hidden; }\n  md-content.md-padding {\n    padding: 8px; }\n\n@media (min-width: 600px) {\n  md-content.md-padding {\n    padding: 16px; }\n }\n\n.md-dialog-container {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 80; }\n\nmd-dialog {\n  opacity: 0;\n  min-width: 240px;\n  max-width: 80%;\n  max-height: 80%;\n  position: relative;\n  overflow: hidden;\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2);\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-dialog.transition-in {\n    opacity: 1;\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0) scale(1);\n            transform: translate3d(0, 0, 0) scale(1); }\n  md-dialog.transition-out {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 100%, 0) scale(0.2);\n            transform: translate3d(0, 100%, 0) scale(0.2); }\n  md-dialog md-content {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 24px;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch; }\n    md-dialog md-content:not([layout=row]) > *:first-child:not(.md-subheader) {\n      margin-top: 0px; }\n  md-dialog .md-actions {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    box-sizing: border-box;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end;\n    padding: 16px 16px;\n    min-height: 40px; }\n    md-dialog .md-actions > * {\n      margin-left: 8px; }\n  md-dialog.md-content-overflow .md-actions {\n    border-top: 1px solid; }\n\nmd-divider {\n  display: block;\n  border-top: 1px solid;\n  margin: 0; }\n  md-divider[md-inset] {\n    margin-left: 80px; }\n\nmd-grid-list {\n  display: block;\n  position: relative; }\n  md-grid-list md-grid-tile {\n    display: block;\n    position: absolute; }\n    md-grid-list md-grid-tile figure {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      -webkit-justify-content: center;\n          -ms-flex-pack: center;\n              justify-content: center;\n      height: 100%;\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      padding: 0;\n      margin: 0; }\n    md-grid-list md-grid-tile md-grid-tile-header, md-grid-list md-grid-tile md-grid-tile-footer {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-flex-direction: row;\n          -ms-flex-direction: row;\n              flex-direction: row;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      height: 48px;\n      color: #fff;\n      background: rgba(0, 0, 0, 0.18);\n      overflow: hidden;\n      position: absolute;\n      left: 0;\n      right: 0; }\n      md-grid-list md-grid-tile md-grid-tile-header h3, md-grid-list md-grid-tile md-grid-tile-header h4, md-grid-list md-grid-tile md-grid-tile-footer h3, md-grid-list md-grid-tile md-grid-tile-footer h4 {\n        font-weight: 400;\n        margin: 0 0 0 16px; }\n      md-grid-list md-grid-tile md-grid-tile-header h3, md-grid-list md-grid-tile md-grid-tile-footer h3 {\n        font-size: 14px; }\n      md-grid-list md-grid-tile md-grid-tile-header h4, md-grid-list md-grid-tile md-grid-tile-footer h4 {\n        font-size: 12px; }\n    md-grid-list md-grid-tile md-grid-tile-header {\n      top: 0; }\n    md-grid-list md-grid-tile md-grid-tile-footer {\n      bottom: 0; }\n\nmd-icon {\n  margin: auto;\n  background-repeat: no-repeat no-repeat;\n  display: inline-block;\n  vertical-align: middle;\n  fill: currentcolor;\n  height: 24px;\n  width: 24px; }\n\nmd-input-container {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: relative;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  overflow-x: hidden;\n  padding: 2px;\n  padding-bottom: 26px;\n  /*\n   * The .md-input class is added to the input/textarea\n   */ }\n  md-input-container textarea, md-input-container input[type=\"text\"], md-input-container input[type=\"password\"], md-input-container input[type=\"datetime\"], md-input-container input[type=\"datetime-local\"], md-input-container input[type=\"date\"], md-input-container input[type=\"month\"], md-input-container input[type=\"time\"], md-input-container input[type=\"week\"], md-input-container input[type=\"number\"], md-input-container input[type=\"email\"], md-input-container input[type=\"url\"], md-input-container input[type=\"search\"], md-input-container input[type=\"tel\"], md-input-container input[type=\"color\"] {\n    /* remove default appearance from all input/textarea */\n    -moz-appearance: none;\n    -webkit-appearance: none; }\n  md-input-container textarea {\n    resize: none;\n    overflow: hidden; }\n  md-input-container label:not(.md-no-float), md-input-container .md-placeholder {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased;\n    padding-left: 2px;\n    z-index: 1;\n    -webkit-transform: translate3d(0, 24px, 0) scale(1);\n            transform: translate3d(0, 24px, 0) scale(1);\n    -webkit-transform-origin: left top;\n            transform-origin: left top;\n    transition: -webkit-transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s;\n    transition: transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s; }\n  md-input-container .md-placeholder {\n    position: absolute;\n    top: 0;\n    opacity: 0;\n    transition-property: opacity, -webkit-transform;\n    transition-property: opacity, transform;\n    -webkit-transform: translate3d(0, 30px, 0);\n            transform: translate3d(0, 30px, 0); }\n  md-input-container.md-input-focused .md-placeholder {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 24px, 0);\n            transform: translate3d(0, 24px, 0); }\n  md-input-container.md-input-has-value .md-placeholder {\n    transition: none;\n    opacity: 0; }\n  md-input-container:not(.md-input-has-value) input:not(:focus) {\n    color: transparent; }\n  md-input-container .md-input {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    display: block;\n    background: none;\n    padding-top: 2px;\n    padding-bottom: 1px;\n    padding-left: 2px;\n    padding-right: 2px;\n    border-width: 0 0 1px 0;\n    line-height: 26px;\n    -ms-flex-preferred-size: 26px;\n    border-radius: 0; }\n    md-input-container .md-input:focus {\n      outline: none; }\n    md-input-container .md-input:invalid {\n      outline: none;\n      box-shadow: none; }\n  md-input-container ng-messages, md-input-container data-ng-messages, md-input-container x-ng-messages, md-input-container [ng-messages], md-input-container [data-ng-messages], md-input-container [x-ng-messages] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3;\n    position: relative; }\n  md-input-container ng-message, md-input-container data-ng-message, md-input-container x-ng-message, md-input-container [ng-message], md-input-container [data-ng-message], md-input-container [x-ng-message], md-input-container .md-char-counter {\n    -webkit-font-smoothing: antialiased;\n    position: absolute;\n    font-size: 12px;\n    line-height: 24px; }\n    md-input-container ng-message.ng-enter, md-input-container data-ng-message.ng-enter, md-input-container x-ng-message.ng-enter, md-input-container [ng-message].ng-enter, md-input-container [data-ng-message].ng-enter, md-input-container [x-ng-message].ng-enter, md-input-container .md-char-counter.ng-enter {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition-delay: 0.2s; }\n    md-input-container ng-message.ng-leave, md-input-container data-ng-message.ng-leave, md-input-container x-ng-message.ng-leave, md-input-container [ng-message].ng-leave, md-input-container [data-ng-message].ng-leave, md-input-container [x-ng-message].ng-leave, md-input-container .md-char-counter.ng-leave {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n    md-input-container ng-message.ng-enter, md-input-container ng-message.ng-leave.ng-leave-active, md-input-container data-ng-message.ng-enter, md-input-container data-ng-message.ng-leave.ng-leave-active, md-input-container x-ng-message.ng-enter, md-input-container x-ng-message.ng-leave.ng-leave-active, md-input-container [ng-message].ng-enter, md-input-container [ng-message].ng-leave.ng-leave-active, md-input-container [data-ng-message].ng-enter, md-input-container [data-ng-message].ng-leave.ng-leave-active, md-input-container [x-ng-message].ng-enter, md-input-container [x-ng-message].ng-leave.ng-leave-active, md-input-container .md-char-counter.ng-enter, md-input-container .md-char-counter.ng-leave.ng-leave-active {\n      opacity: 0;\n      -webkit-transform: translate3d(0, -20%, 0);\n              transform: translate3d(0, -20%, 0); }\n    md-input-container ng-message.ng-leave, md-input-container ng-message.ng-enter.ng-enter-active, md-input-container data-ng-message.ng-leave, md-input-container data-ng-message.ng-enter.ng-enter-active, md-input-container x-ng-message.ng-leave, md-input-container x-ng-message.ng-enter.ng-enter-active, md-input-container [ng-message].ng-leave, md-input-container [ng-message].ng-enter.ng-enter-active, md-input-container [data-ng-message].ng-leave, md-input-container [data-ng-message].ng-enter.ng-enter-active, md-input-container [x-ng-message].ng-leave, md-input-container [x-ng-message].ng-enter.ng-enter-active, md-input-container .md-char-counter.ng-leave, md-input-container .md-char-counter.ng-enter.ng-enter-active {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0); }\n  md-input-container .md-char-counter {\n    bottom: 2px;\n    right: 2px; }\n  md-input-container.md-input-focused label:not(.md-no-float), md-input-container.md-input-has-value label:not(.md-no-float) {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-container.md-input-focused .md-input, md-input-container .md-input.ng-invalid.ng-dirty {\n    padding-bottom: 0px;\n    border-width: 0 0 2px 0; }\n  md-input-container .md-input[disabled], [disabled] md-input-container .md-input {\n    background-position: 0 bottom;\n    background-size: 3px 1px;\n    background-repeat: repeat-x; }\n\nmd-list {\n  padding: 8px 0px 8px 0px; }\n\nmd-item-content {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  box-sizing: border-box;\n  position: relative;\n  padding: 0px 0px 0px 0px; }\n\n/**\n * The left tile for a list item.\n */\n.md-tile-left {\n  min-width: 56px;\n  margin-right: -16px; }\n\n/**\n * The center content tile for a list item.\n */\n.md-tile-content {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  padding: 16px;\n  text-overflow: ellipsis; }\n  .md-tile-content h3 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 1.1em; }\n  .md-tile-content h4 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 0.9em; }\n  .md-tile-content p {\n    margin: 0 0 3px 0;\n    font-size: 0.75em; }\n\n/**\n * The right tile for a list item.\n */\n.md-tile-right {\n  padding-right: 0px; }\n\n@-webkit-keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@-webkit-keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@-webkit-keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@-webkit-keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\n@keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\nmd-progress-circular {\n  width: 50px;\n  height: 50px;\n  display: block;\n  position: relative;\n  padding-top: 0 !important;\n  margin-bottom: 0 !important;\n  overflow: hidden; }\n  md-progress-circular .md-inner {\n    width: 50px;\n    height: 50px;\n    position: relative; }\n    md-progress-circular .md-inner .md-gap {\n      position: absolute;\n      left: 24px;\n      right: 24px;\n      top: 0;\n      bottom: 0;\n      border-top: 5px solid black;\n      box-sizing: border-box; }\n    md-progress-circular .md-inner .md-left, md-progress-circular .md-inner .md-right {\n      position: absolute;\n      top: 0;\n      height: 50px;\n      width: 25px;\n      overflow: hidden; }\n      md-progress-circular .md-inner .md-left .md-half-circle, md-progress-circular .md-inner .md-right .md-half-circle {\n        position: absolute;\n        top: 0;\n        width: 50px;\n        height: 50px;\n        box-sizing: border-box;\n        border-width: 5px;\n        border-style: solid;\n        border-color: black black transparent;\n        border-radius: 50%; }\n    md-progress-circular .md-inner .md-left {\n      left: 0; }\n      md-progress-circular .md-inner .md-left .md-half-circle {\n        left: 0;\n        border-right-color: transparent; }\n    md-progress-circular .md-inner .md-right {\n      right: 0; }\n      md-progress-circular .md-inner .md-right .md-half-circle {\n        right: 0;\n        border-left-color: transparent; }\n  md-progress-circular[value=\"0\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-135deg);\n            transform: rotate(-135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"1\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-131.4deg);\n            transform: rotate(-131.4deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"2\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-127.8deg);\n            transform: rotate(-127.8deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"3\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-124.2deg);\n            transform: rotate(-124.2deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"4\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-120.6deg);\n            transform: rotate(-120.6deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"5\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-117deg);\n            transform: rotate(-117deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"6\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-113.4deg);\n            transform: rotate(-113.4deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"7\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-109.8deg);\n            transform: rotate(-109.8deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"8\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-106.2deg);\n            transform: rotate(-106.2deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"9\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-102.6deg);\n            transform: rotate(-102.6deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"10\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-99deg);\n            transform: rotate(-99deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"11\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-95.4deg);\n            transform: rotate(-95.4deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"12\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-91.8deg);\n            transform: rotate(-91.8deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"13\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-88.2deg);\n            transform: rotate(-88.2deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"14\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-84.6deg);\n            transform: rotate(-84.6deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"15\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-81deg);\n            transform: rotate(-81deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"16\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-77.4deg);\n            transform: rotate(-77.4deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"17\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-73.8deg);\n            transform: rotate(-73.8deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"18\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-70.2deg);\n            transform: rotate(-70.2deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"19\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-66.6deg);\n            transform: rotate(-66.6deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"20\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-63deg);\n            transform: rotate(-63deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"21\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-59.4deg);\n            transform: rotate(-59.4deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"22\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-55.8deg);\n            transform: rotate(-55.8deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"23\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-52.2deg);\n            transform: rotate(-52.2deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"24\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-48.6deg);\n            transform: rotate(-48.6deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"25\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-45deg);\n            transform: rotate(-45deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"26\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-41.4deg);\n            transform: rotate(-41.4deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"27\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-37.8deg);\n            transform: rotate(-37.8deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"28\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-34.2deg);\n            transform: rotate(-34.2deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"29\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-30.6deg);\n            transform: rotate(-30.6deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"30\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-27deg);\n            transform: rotate(-27deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"31\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-23.4deg);\n            transform: rotate(-23.4deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"32\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-19.8deg);\n            transform: rotate(-19.8deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"33\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-16.2deg);\n            transform: rotate(-16.2deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"34\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-12.6deg);\n            transform: rotate(-12.6deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"35\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-9deg);\n            transform: rotate(-9deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"36\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-5.4deg);\n            transform: rotate(-5.4deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"37\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-1.8deg);\n            transform: rotate(-1.8deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"38\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(1.8deg);\n            transform: rotate(1.8deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"39\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(5.4deg);\n            transform: rotate(5.4deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"40\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(9deg);\n            transform: rotate(9deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"41\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(12.6deg);\n            transform: rotate(12.6deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"42\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(16.2deg);\n            transform: rotate(16.2deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"43\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(19.8deg);\n            transform: rotate(19.8deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"44\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(23.4deg);\n            transform: rotate(23.4deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"45\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(27deg);\n            transform: rotate(27deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"46\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(30.6deg);\n            transform: rotate(30.6deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"47\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(34.2deg);\n            transform: rotate(34.2deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"48\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(37.8deg);\n            transform: rotate(37.8deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"49\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(41.4deg);\n            transform: rotate(41.4deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"50\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"51\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(138.6deg);\n            transform: rotate(138.6deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"52\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(142.2deg);\n            transform: rotate(142.2deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"53\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(145.8deg);\n            transform: rotate(145.8deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"54\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(149.4deg);\n            transform: rotate(149.4deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"55\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(153deg);\n            transform: rotate(153deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"56\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(156.6deg);\n            transform: rotate(156.6deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"57\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(160.2deg);\n            transform: rotate(160.2deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"58\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(163.8deg);\n            transform: rotate(163.8deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"59\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(167.4deg);\n            transform: rotate(167.4deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"60\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(171deg);\n            transform: rotate(171deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"61\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(174.6deg);\n            transform: rotate(174.6deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"62\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(178.2deg);\n            transform: rotate(178.2deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"63\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(181.8deg);\n            transform: rotate(181.8deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"64\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(185.4deg);\n            transform: rotate(185.4deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"65\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(189deg);\n            transform: rotate(189deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"66\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(192.6deg);\n            transform: rotate(192.6deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"67\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(196.2deg);\n            transform: rotate(196.2deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"68\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(199.8deg);\n            transform: rotate(199.8deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"69\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(203.4deg);\n            transform: rotate(203.4deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"70\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(207deg);\n            transform: rotate(207deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"71\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(210.6deg);\n            transform: rotate(210.6deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"72\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(214.2deg);\n            transform: rotate(214.2deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"73\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(217.8deg);\n            transform: rotate(217.8deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"74\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(221.4deg);\n            transform: rotate(221.4deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"75\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(225deg);\n            transform: rotate(225deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"76\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(228.6deg);\n            transform: rotate(228.6deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"77\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(232.2deg);\n            transform: rotate(232.2deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"78\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(235.8deg);\n            transform: rotate(235.8deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"79\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(239.4deg);\n            transform: rotate(239.4deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"80\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(243deg);\n            transform: rotate(243deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"81\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(246.6deg);\n            transform: rotate(246.6deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"82\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(250.2deg);\n            transform: rotate(250.2deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"83\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(253.8deg);\n            transform: rotate(253.8deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"84\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(257.4deg);\n            transform: rotate(257.4deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"85\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(261deg);\n            transform: rotate(261deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"86\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(264.6deg);\n            transform: rotate(264.6deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"87\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(268.2deg);\n            transform: rotate(268.2deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"88\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(271.8deg);\n            transform: rotate(271.8deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"89\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(275.4deg);\n            transform: rotate(275.4deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"90\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(279deg);\n            transform: rotate(279deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"91\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(282.6deg);\n            transform: rotate(282.6deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"92\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(286.2deg);\n            transform: rotate(286.2deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"93\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(289.8deg);\n            transform: rotate(289.8deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"94\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(293.4deg);\n            transform: rotate(293.4deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"95\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(297deg);\n            transform: rotate(297deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"96\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(300.6deg);\n            transform: rotate(300.6deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"97\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(304.2deg);\n            transform: rotate(304.2deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"98\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(307.8deg);\n            transform: rotate(307.8deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"99\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(311.4deg);\n            transform: rotate(311.4deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"100\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(315deg);\n            transform: rotate(315deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper {\n    -webkit-animation: outer-rotate 2.91667s linear infinite;\n            animation: outer-rotate 2.91667s linear infinite; }\n    md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner {\n      -webkit-animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite;\n              animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle, md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-iteration-count: infinite;\n                animation-iteration-count: infinite;\n        -webkit-animation-duration: 1.3125s;\n                animation-duration: 1.3125s;\n        -webkit-animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1);\n                animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1); }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle {\n        -webkit-animation-name: left-wobble;\n                animation-name: left-wobble; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-name: right-wobble;\n                animation-name: right-wobble; }\n\nmd-progress-linear {\n  display: block;\n  width: 100%;\n  height: 5px; }\n  md-progress-linear .md-container {\n    overflow: hidden;\n    position: relative;\n    height: 5px;\n    top: 5px;\n    -webkit-transform: translate(0, 5px) scale(1, 0);\n            transform: translate(0, 5px) scale(1, 0);\n    transition: all 0.3s linear; }\n  md-progress-linear .md-container.md-ready {\n    -webkit-transform: translate(0, 0) scale(1, 1);\n            transform: translate(0, 0) scale(1, 1); }\n  md-progress-linear .md-bar {\n    height: 5px;\n    position: absolute;\n    width: 100%; }\n  md-progress-linear .md-bar1, md-progress-linear .md-bar2 {\n    transition: all 0.2s linear; }\n  md-progress-linear[md-mode=determinate] .md-bar1 {\n    display: none; }\n  md-progress-linear[md-mode=indeterminate] .md-bar1 {\n    -webkit-animation: indeterminate1 4s infinite linear;\n            animation: indeterminate1 4s infinite linear; }\n  md-progress-linear[md-mode=indeterminate] .md-bar2 {\n    -webkit-animation: indeterminate2 4s infinite linear;\n            animation: indeterminate2 4s infinite linear; }\n  md-progress-linear[md-mode=buffer] .md-container {\n    background-color: transparent !important; }\n  md-progress-linear[md-mode=buffer] .md-dashed:before {\n    content: \"\";\n    display: block;\n    height: 5px;\n    width: 100%;\n    margin-top: 0px;\n    position: absolute;\n    background-color: transparent;\n    background-size: 10px 10px !important;\n    background-position: 0px -23px;\n    -webkit-animation: buffer 3s infinite linear;\n            animation: buffer 3s infinite linear; }\n  md-progress-linear[md-mode=query] .md-bar2 {\n    -webkit-animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1);\n            animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1); }\n\n@-webkit-keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@-webkit-keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@-webkit-keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@-webkit-keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n\n@keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n\nmd-radio-button, .md-switch-thumb {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer; }\n  md-radio-button input, .md-switch-thumb input {\n    display: none; }\n  md-radio-button .md-container, .md-switch-thumb .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    cursor: pointer; }\n    md-radio-button .md-container .md-ripple-container, .md-switch-thumb .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: 48px;\n      height: 48px;\n      left: -16px;\n      top: -16px; }\n  md-radio-button .md-off, .md-switch-thumb .md-off {\n    position: absolute;\n    top: 0px;\n    left: 0px;\n    width: 16px;\n    height: 16px;\n    border: solid 2px;\n    border-radius: 50%;\n    transition: border-color ease 0.28s; }\n  md-radio-button .md-on, .md-switch-thumb .md-on {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 16px;\n    height: 16px;\n    border-radius: 50%;\n    transition: -webkit-transform ease 0.28s;\n    transition: transform ease 0.28s;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n  md-radio-button.md-checked .md-on, .md-switch-thumb.md-checked .md-on {\n    -webkit-transform: scale(0.55);\n            transform: scale(0.55); }\n  md-radio-button .md-label, .md-switch-thumb .md-label {\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    margin-right: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    width: auto; }\n  md-radio-button .circle, .md-switch-thumb .circle {\n    border-radius: 50%; }\n\nmd-radio-group {\n  border: 1px dotted transparent;\n  display: block;\n  outline: none; }\n\n.radioButtondemoBasicUsage md-radio-group {\n  border: none; }\n\n.md-select-menu-container {\n  position: absolute;\n  left: 0;\n  top: 0;\n  z-index: 99;\n  opacity: 0; }\n  .md-select-menu-container:not(.md-clickable) {\n    pointer-events: none; }\n  .md-select-menu-container md-progress-circular {\n    display: table;\n    margin: 24px auto !important; }\n  .md-select-menu-container.md-active {\n    opacity: 1; }\n    .md-select-menu-container.md-active md-select-menu {\n      transition: -webkit-transform all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition: transform all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition-duration: 200ms; }\n      .md-select-menu-container.md-active md-select-menu > * {\n        opacity: 1;\n        transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n        transition-duration: 200ms;\n        transition-delay: 100ms; }\n  .md-select-menu-container.md-leave {\n    opacity: 0;\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    transition-duration: 250ms; }\n\nmd-select {\n  display: inline-block;\n  margin-top: 20px; }\n  md-select[disabled]:hover {\n    cursor: default; }\n  md-select:not([disabled]):hover {\n    cursor: pointer; }\n  md-select:not([disabled]):focus .md-select-label {\n    border-bottom: 2px solid;\n    padding-bottom: 7px; }\n\n.md-select-label {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  padding-top: 9px;\n  padding-right: 32px;\n  padding-bottom: 8px;\n  border-bottom: 1px solid;\n  font-size: 0.875em;\n  line-height: 0.8em;\n  position: relative;\n  box-sizing: border-box;\n  min-width: 64px; }\n  .md-select-label .md-select-icon:after {\n    content: '\\25BC';\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    position: absolute;\n    height: 100%;\n    top: 0px;\n    right: 2px;\n    speak: none;\n    -webkit-transform: scaleY(0.6) scaleX(1);\n            transform: scaleY(0.6) scaleX(1); }\n\nmd-select-menu {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0;\n  -webkit-transform: scale(1);\n          transform: scale(1);\n  max-height: 256px;\n  overflow-y: scroll; }\n  md-select-menu.md-reverse {\n    -webkit-flex-direction: column-reverse;\n        -ms-flex-direction: column-reverse;\n            flex-direction: column-reverse; }\n  md-select-menu:not(.md-overflow) md-content {\n    padding-top: 8px;\n    padding-bottom: 8px; }\n  md-select-menu md-content {\n    min-width: 136px; }\n  md-select-menu > * {\n    opacity: 0; }\n\nmd-option {\n  cursor: pointer;\n  position: relative;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  width: auto;\n  padding: 0 16px 0 16px;\n  height: 48px; }\n  md-option .md-text {\n    width: auto;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    font-size: 0.875em; }\n\nmd-optgroup {\n  display: block; }\n  md-optgroup label {\n    display: block;\n    font-size: 0.75em;\n    text-transform: uppercase;\n    padding: 16px 8px; }\n  md-optgroup md-option {\n    padding-left: 24px; }\n\nmd-sidenav {\n  position: absolute;\n  width: 304px;\n  min-width: 304px;\n  max-width: 304px;\n  bottom: 0;\n  z-index: 60;\n  background-color: white;\n  overflow: auto;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-sidenav.md-closed {\n    display: none; }\n  md-sidenav.md-closed-add, md-sidenav.md-closed-remove {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    /* this is required as of 1.3x to properly\n       apply all styling in a show/hide animation */\n    transition: 0s all; }\n  md-sidenav.md-closed-add.md-closed-add-active, md-sidenav.md-closed-remove.md-closed-remove-active {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-sidenav.md-locked-open-add, md-sidenav.md-locked-open-remove {\n    position: static;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open {\n    width: 304px;\n    min-width: 304px;\n    max-width: 304px; }\n  md-sidenav.md-locked-open, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-left, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-right, md-sidenav.md-locked-open-remove.md-closed {\n    position: static;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open-remove-active {\n    transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 0;\n    min-width: 0; }\n  md-sidenav.md-closed.md-locked-open-add {\n    width: 0;\n    min-width: 0;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n  md-sidenav.md-closed.md-locked-open-add-active {\n    transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 304px;\n    min-width: 304px;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n\n.md-sidenav-backdrop.md-locked-open {\n  display: none; }\n\n.md-sidenav-left, md-sidenav {\n  left: 0;\n  top: 0;\n  -webkit-transform: translate3d(0%, 0, 0);\n          transform: translate3d(0%, 0, 0); }\n  .md-sidenav-left.md-closed, md-sidenav.md-closed {\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0); }\n\n.md-sidenav-right {\n  left: 100%;\n  top: 0;\n  -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0); }\n  .md-sidenav-right.md-closed {\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n\n@media (max-width: 360px) {\n  md-sidenav {\n    width: 85%; }\n }\n\n@-webkit-keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\nmd-slider {\n  height: 48px;\n  position: relative;\n  display: block;\n  margin-left: 4px;\n  margin-right: 4px;\n  padding: 0;\n  /**\n   * Track\n   */\n  /**\n   * Slider thumb\n   */\n  /* The sign that's focused in discrete mode */\n  /**\n   * The border/background that comes in when focused in non-discrete mode\n   */\n  /* Don't animate left/right while panning */ }\n  md-slider .md-slider-wrapper {\n    position: relative; }\n  md-slider .md-track-container {\n    width: 100%;\n    position: absolute;\n    top: 23px;\n    height: 2px; }\n  md-slider .md-track {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-track-fill {\n    transition: width 0.05s linear; }\n  md-slider .md-track-ticks {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-thumb-container {\n    position: absolute;\n    left: 0;\n    top: 50%;\n    -webkit-transform: translate3d(-50%, -50%, 0);\n            transform: translate3d(-50%, -50%, 0);\n    transition: left 0.1s linear; }\n  md-slider .md-thumb {\n    z-index: 1;\n    position: absolute;\n    left: -19px;\n    top: 5px;\n    width: 38px;\n    height: 38px;\n    border-radius: 38px;\n    -webkit-transform: scale(0.5);\n            transform: scale(0.5);\n    transition: all 0.1s linear; }\n    md-slider .md-thumb:after {\n      content: '';\n      position: absolute;\n      left: 3px;\n      top: 3px;\n      width: 32px;\n      height: 32px;\n      border-radius: 32px;\n      border: 3px solid; }\n  md-slider .md-sign {\n    /* Center the children (slider-thumb-text) */\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n    position: absolute;\n    left: -14px;\n    top: -20px;\n    width: 28px;\n    height: 28px;\n    border-radius: 28px;\n    -webkit-transform: scale(0.4) translate3d(0, 70px, 0);\n            transform: scale(0.4) translate3d(0, 70px, 0);\n    transition: all 0.2s ease-in-out;\n    /* The arrow pointing down under the sign */ }\n    md-slider .md-sign:after {\n      position: absolute;\n      content: '';\n      left: 0px;\n      border-radius: 16px;\n      top: 19px;\n      border-left: 14px solid transparent;\n      border-right: 14px solid transparent;\n      border-top: 16px solid;\n      opacity: 0;\n      -webkit-transform: translate3d(0, -8px, 0);\n              transform: translate3d(0, -8px, 0);\n      transition: all 0.2s ease-in-out; }\n    md-slider .md-sign .md-thumb-text {\n      z-index: 1;\n      font-size: 12px;\n      font-weight: bold; }\n  md-slider .md-focus-thumb {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    display: none;\n    opacity: 0;\n    background-color: #C0C0C0;\n    -webkit-animation: sliderFocusThumb 0.4s linear;\n            animation: sliderFocusThumb 0.4s linear; }\n  md-slider .md-focus-ring {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    border: 2px solid #D6D6D6;\n    background-color: transparent;\n    -webkit-transform: scale(0);\n            transform: scale(0);\n    transition: all 0.2s linear; }\n  md-slider .md-disabled-thumb {\n    position: absolute;\n    left: -22px;\n    top: 2px;\n    width: 44px;\n    height: 44px;\n    border-radius: 44px;\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    border: 6px solid;\n    display: none; }\n  md-slider.md-min .md-thumb:after {\n    background-color: white; }\n  md-slider.md-min .md-sign {\n    opacity: 0; }\n  md-slider:focus {\n    outline: none; }\n  md-slider.dragging .md-thumb-container, md-slider.dragging .md-track-fill {\n    transition: none; }\n  md-slider:not([md-discrete]) {\n    /* Hide the sign and ticks in non-discrete mode */ }\n    md-slider:not([md-discrete]) .md-track-ticks, md-slider:not([md-discrete]) .md-sign {\n      display: none; }\n    md-slider:not([md-discrete]):not([disabled]):hover .md-thumb {\n      -webkit-transform: scale(0.6);\n              transform: scale(0.6); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-focus-thumb {\n      display: block; }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-ring, md-slider:not([md-discrete]):not([disabled]).active .md-focus-ring {\n      -webkit-transform: scale(1);\n              transform: scale(1); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-thumb {\n      -webkit-transform: scale(0.85);\n              transform: scale(0.85); }\n  md-slider[md-discrete] {\n    /* Hide the focus thumb in discrete mode */ }\n    md-slider[md-discrete] .md-focus-thumb, md-slider[md-discrete] .md-focus-ring {\n      display: none; }\n    md-slider[md-discrete]:not([disabled]):focus .md-sign, md-slider[md-discrete]:not([disabled]):focus .md-sign:after, md-slider[md-discrete]:not([disabled]).active .md-sign, md-slider[md-discrete]:not([disabled]).active .md-sign:after {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0) scale(1);\n              transform: translate3d(0, 0, 0) scale(1); }\n  md-slider[disabled] .md-track-fill {\n    display: none; }\n  md-slider[disabled] .md-sign {\n    display: none; }\n  md-slider[disabled] .md-thumb {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35); }\n  md-slider[disabled] .md-disabled-thumb {\n    display: block; }\n\n.md-sticky-clone {\n  z-index: 2;\n  top: 0;\n  left: 0;\n  right: 0;\n  position: absolute !important;\n  -webkit-transform: translate3d(-9999px, -9999px, 0);\n          transform: translate3d(-9999px, -9999px, 0); }\n  .md-sticky-clone[sticky-state=\"active\"] {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n    .md-sticky-clone[sticky-state=\"active\"]:not(.md-sticky-no-effect):after {\n      -webkit-animation: subheaderStickyHoverIn 0.3s ease-out both;\n              animation: subheaderStickyHoverIn 0.3s ease-out both; }\n\n@-webkit-keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@-webkit-keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n@keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n.md-subheader {\n  display: block;\n  font-size: 0.9em;\n  font-weight: 400;\n  line-height: 1em;\n  padding: 16px 0px 16px 16px;\n  margin: 0 0 0 0;\n  margin-right: 16px;\n  position: relative; }\n  .md-subheader:not(.md-sticky-no-effect) {\n    transition: 0.2s ease-out margin; }\n    .md-subheader:not(.md-sticky-no-effect):after {\n      position: absolute;\n      left: 0;\n      bottom: 0;\n      top: 0;\n      right: -16px;\n      content: ''; }\n    .md-subheader:not(.md-sticky-no-effect).md-sticky-clone {\n      z-index: 2; }\n    .md-subheader:not(.md-sticky-no-effect)[sticky-state=\"active\"] {\n      margin-top: -2px; }\n    .md-subheader:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state=\"active\"]:after {\n      -webkit-animation: subheaderStickyHoverOut 0.3s ease-out both;\n              animation: subheaderStickyHoverOut 0.3s ease-out both; }\n  .md-subheader .md-subheader-content {\n    z-index: 1;\n    position: relative; }\n\nmd-switch {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-switch .md-container {\n    cursor: -webkit-grab;\n    cursor: grab;\n    width: 36px;\n    height: 24px;\n    position: relative;\n    -webkit-user-select: none;\n       -moz-user-select: none;\n        -ms-user-select: none;\n            user-select: none;\n    margin-right: 8px; }\n  md-switch:not([disabled]) .md-dragging, md-switch:not([disabled]).md-dragging .md-container {\n    cursor: -webkit-grabbing;\n    cursor: grabbing; }\n  md-switch .md-label {\n    border-color: transparent;\n    border-width: 0px; }\n  md-switch .md-bar {\n    left: 1px;\n    width: 34px;\n    top: 5px;\n    height: 14px;\n    border-radius: 8px;\n    position: absolute; }\n  md-switch .md-thumb-container {\n    top: 2px;\n    left: 0;\n    width: 16px;\n    position: absolute;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    z-index: 1; }\n  md-switch.md-checked .md-thumb-container {\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0); }\n  md-switch .md-thumb {\n    position: absolute;\n    margin: 0;\n    left: 0;\n    top: 0;\n    outline: none;\n    height: 20px;\n    width: 20px;\n    border-radius: 50%;\n    box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n    md-switch .md-thumb .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -20px;\n      top: -20px;\n      right: -20px;\n      bottom: -20px; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb-container, md-switch:not(.md-dragging) .md-thumb {\n    transition: all 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    transition-property: -webkit-transform, background-color;\n    transition-property: transform, background-color; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb {\n    transition-delay: 0.05s; }\n\nmd-tabs {\n  display: block;\n  width: 100%;\n  font-weight: 500;\n  overflow: auto; }\n\n.md-header {\n  width: 100%;\n  height: 48px;\n  box-sizing: border-box;\n  position: relative; }\n\n.md-paginator {\n  z-index: 1;\n  margin-right: -2px;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  width: 32px;\n  min-height: 100%;\n  cursor: pointer;\n  border: none;\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: center center;\n  position: absolute; }\n  .md-paginator.md-prev {\n    left: 0; }\n  .md-paginator.md-next {\n    right: 0; }\n    .md-paginator.md-next md-icon {\n      -webkit-transform: rotate(180deg);\n              transform: rotate(180deg); }\n\n/* If `center` justified, change to left-justify if paginating */\nmd-tabs[center] .md-header:not(.md-paginating) .md-header-items {\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n.md-paginating .md-header-items-container {\n  left: 32px;\n  right: 32px; }\n\n.md-header-items-container {\n  overflow: hidden;\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 100%;\n  white-space: nowrap;\n  font-size: 14px;\n  font-weight: 500;\n  text-transform: uppercase;\n  margin: auto; }\n  .md-header-items-container .md-header-items {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    box-sizing: border-box;\n    transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    height: 100%;\n    width: 99999px; }\n\n.md-tabs-content {\n  overflow: hidden;\n  width: 100%;\n  position: relative; }\n  .md-tabs-content .md-tab-content {\n    height: 100%; }\n    .md-tabs-content .md-tab-content.ng-hide.ng-animate {\n      display: block !important; }\n    .md-tabs-content .md-tab-content.ng-animate {\n      transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n      transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n      -webkit-transform: translateX(0);\n              transform: translateX(0); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-add {\n        -webkit-transform: translateX(-100%);\n                transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-add.md-transition-rtl {\n          -webkit-transform: translateX(100%);\n                  transform: translateX(100%); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove {\n        position: absolute;\n        -webkit-transform: translateX(100%);\n                transform: translateX(100%);\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0; }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.md-transition-rtl {\n          -webkit-transform: translateX(-100%);\n                  transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.ng-hide-remove-active {\n          -webkit-transform: translateX(0);\n                  transform: translateX(0); }\n\nmd-tabs-ink-bar {\n  z-index: 1;\n  display: none;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  box-sizing: border-box;\n  height: 2px;\n  margin-top: -2px;\n  -webkit-transform: scaleX(1);\n          transform: scaleX(1);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0; }\n  md-tabs-ink-bar.md-transition-right {\n    transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1), left 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s; }\n  md-tabs-ink-bar.md-transition-left {\n    transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s, left 0.25s cubic-bezier(0.35, 0, 0.25, 1); }\n\nmd-tab {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  position: relative;\n  z-index: 0;\n  overflow: hidden;\n  height: 100%;\n  text-align: center;\n  cursor: pointer;\n  padding: 20px 24px;\n  box-sizing: border-box;\n  transition: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-tab.md-tab-themed {\n    transition: background 0.35s cubic-bezier(0.35, 0, 0.25, 1), color 0.35s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-tab[disabled] {\n    pointer-events: none;\n    cursor: default; }\n  md-tab:focus {\n    outline: none; }\n  md-tab md-tab-label {\n    -webkit-flex: 1 1 auto;\n        -ms-flex: 1 1 auto;\n            flex: 1 1 auto;\n    z-index: 100;\n    opacity: 1;\n    overflow: hidden; }\n\nmd-input-group label, .md-input-group label {\n  display: block;\n  font-size: 0.75em; }\nmd-input-group textarea, md-input-group input[type=\"text\"], md-input-group input[type=\"password\"], md-input-group input[type=\"datetime\"], md-input-group input[type=\"datetime-local\"], md-input-group input[type=\"date\"], md-input-group input[type=\"month\"], md-input-group input[type=\"time\"], md-input-group input[type=\"week\"], md-input-group input[type=\"number\"], md-input-group input[type=\"email\"], md-input-group input[type=\"url\"], md-input-group input[type=\"search\"], md-input-group input[type=\"tel\"], md-input-group input[type=\"color\"], .md-input-group textarea, .md-input-group input[type=\"text\"], .md-input-group input[type=\"password\"], .md-input-group input[type=\"datetime\"], .md-input-group input[type=\"datetime-local\"], .md-input-group input[type=\"date\"], .md-input-group input[type=\"month\"], .md-input-group input[type=\"time\"], .md-input-group input[type=\"week\"], .md-input-group input[type=\"number\"], .md-input-group input[type=\"email\"], .md-input-group input[type=\"url\"], .md-input-group input[type=\"search\"], .md-input-group input[type=\"tel\"], .md-input-group input[type=\"color\"] {\n  display: block;\n  border-width: 0 0 1px 0;\n  padding-top: 2px;\n  line-height: 26px;\n  padding-bottom: 1px; }\n  md-input-group textarea:focus, md-input-group input[type=\"text\"]:focus, md-input-group input[type=\"password\"]:focus, md-input-group input[type=\"datetime\"]:focus, md-input-group input[type=\"datetime-local\"]:focus, md-input-group input[type=\"date\"]:focus, md-input-group input[type=\"month\"]:focus, md-input-group input[type=\"time\"]:focus, md-input-group input[type=\"week\"]:focus, md-input-group input[type=\"number\"]:focus, md-input-group input[type=\"email\"]:focus, md-input-group input[type=\"url\"]:focus, md-input-group input[type=\"search\"]:focus, md-input-group input[type=\"tel\"]:focus, md-input-group input[type=\"color\"]:focus, .md-input-group textarea:focus, .md-input-group input[type=\"text\"]:focus, .md-input-group input[type=\"password\"]:focus, .md-input-group input[type=\"datetime\"]:focus, .md-input-group input[type=\"datetime-local\"]:focus, .md-input-group input[type=\"date\"]:focus, .md-input-group input[type=\"month\"]:focus, .md-input-group input[type=\"time\"]:focus, .md-input-group input[type=\"week\"]:focus, .md-input-group input[type=\"number\"]:focus, .md-input-group input[type=\"email\"]:focus, .md-input-group input[type=\"url\"]:focus, .md-input-group input[type=\"search\"]:focus, .md-input-group input[type=\"tel\"]:focus, .md-input-group input[type=\"color\"]:focus {\n    outline: 0; }\nmd-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n  background: none; }\n\nmd-input-group, .md-input-group {\n  padding-bottom: 2px;\n  margin: 10px 0 8px 0;\n  position: relative;\n  display: block; }\n  md-input-group label, .md-input-group label {\n    font-size: 1em;\n    z-index: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased; }\n    md-input-group label:hover, .md-input-group label:hover {\n      cursor: text; }\n  md-input-group label, .md-input-group label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n    border-bottom-width: 1px;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group.md-input-focused label, .md-input-group.md-input-focused label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-focused input, md-input-group.md-input-focused textarea, .md-input-group.md-input-focused input, .md-input-group.md-input-focused textarea {\n    border-bottom-width: 2px; }\n  md-input-group.md-input-focused input, .md-input-group.md-input-focused input {\n    padding-bottom: 0px; }\n  md-input-group.md-input-has-value label, .md-input-group.md-input-has-value label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-has-value:not(.md-input-focused) label, .md-input-group.md-input-has-value:not(.md-input-focused) label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    border-bottom-width: 0px; }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    background-size: 3px 1px;\n    background-position: 0 bottom;\n    background-size: 2px 1px;\n    background-repeat: repeat-x;\n    pointer-events: none; }\n  md-input-group[disabled] label, .md-input-group[disabled] label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] *:not(.md-input-has-value) label, .md-input-group[disabled] *:not(.md-input-has-value) label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n\nmd-toast {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: absolute;\n  box-sizing: border-box;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  min-height: 48px;\n  padding-left: 24px;\n  padding-right: 24px;\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n  border-radius: 2px;\n  font-size: 14px;\n  cursor: default;\n  max-width: 879px;\n  max-height: 40px;\n  height: 24px;\n  z-index: 90;\n  opacity: 1;\n  -webkit-transform: translate3d(0, 0, 0) rotateZ(0deg);\n          transform: translate3d(0, 0, 0) rotateZ(0deg);\n  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  /* Transition differently when swiping */ }\n  md-toast.md-capsule {\n    border-radius: 24px; }\n  md-toast.ng-leave-active {\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-toast.md-swipeleft, md-toast.md-swiperight, md-toast.md-swipeup, md-toast.md-swipedown {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-toast.ng-enter {\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n    opacity: 0; }\n    md-toast.ng-enter.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-enter.ng-enter-active {\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0);\n      opacity: 1; }\n  md-toast.ng-leave.ng-leave-active {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0%, 0);\n              transform: translate3d(-100%, 0%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 0%, 0);\n              transform: translate3d(100%, 0%, 0); }\n  md-toast .md-action {\n    line-height: 19px;\n    margin-left: 24px;\n    cursor: pointer;\n    text-transform: uppercase;\n    float: right; }\n\n@media (max-width: 600px) {\n  md-toast {\n    left: 0;\n    right: 0;\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    border-radius: 0;\n    bottom: 0; }\n    md-toast.md-top {\n      bottom: auto;\n      top: 0; }\n }\n\n@media (min-width: 600px) {\n  md-toast {\n    min-width: 288px;\n    /* \n     * When the toast doesn't take up the whole screen,\n     * make it rotate when the user swipes it away\n     */ }\n    md-toast.md-bottom {\n      bottom: 8px; }\n    md-toast.md-left {\n      left: 8px; }\n    md-toast.md-right {\n      right: 8px; }\n    md-toast.md-top {\n      top: 8px; }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 25%, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 25%, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 25%, 0) rotateZ(15deg);\n              transform: translate3d(100%, 25%, 0) rotateZ(15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 0, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swiperight {\n      -webkit-transform: translate3d(100%, 0, 0) rotateZ(15deg);\n              transform: translate3d(100%, 0, 0) rotateZ(15deg); }\n }\n\nmd-toolbar {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  position: relative;\n  z-index: 2;\n  font-size: 1.3em;\n  min-height: 64px;\n  width: 100%;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n  md-toolbar.md-tall {\n    height: 128px;\n    min-height: 128px;\n    max-height: 128px; }\n  md-toolbar.md-medium-tall {\n    height: 88px;\n    min-height: 88px;\n    max-height: 88px; }\n    md-toolbar.md-medium-tall .md-toolbar-tools {\n      height: 48px;\n      min-height: 48px;\n      max-height: 48px; }\n  md-toolbar .md-indent {\n    margin-left: 64px; }\n\n.md-toolbar-tools {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  width: 100%;\n  height: 64px;\n  max-height: 64px;\n  font-size: inherit;\n  font-weight: normal;\n  padding: 0 16px;\n  margin: 0; }\n  .md-toolbar-tools > * {\n    font-size: inherit; }\n  .md-toolbar-tools h2, .md-toolbar-tools h3 {\n    font-weight: normal; }\n  .md-toolbar-tools a {\n    color: inherit;\n    text-decoration: none; }\n  .md-toolbar-tools .fill-height {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n  .md-toolbar-tools .md-tools {\n    margin-left: auto; }\n  .md-toolbar-tools .md-button {\n    font-size: 14px; }\n\nmd-tooltip {\n  position: absolute;\n  font-size: 14px;\n  z-index: 100;\n  overflow: hidden;\n  pointer-events: none;\n  border-radius: 4px; }\n  md-tooltip .md-background {\n    position: absolute;\n    border-radius: 50%;\n    -webkit-transform: translate(-50%, -50%) scale(0);\n            transform: translate(-50%, -50%) scale(0);\n    opacity: 1; }\n    md-tooltip .md-background.md-show-add {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      -webkit-transform: translate(-50%, -50%) scale(0);\n              transform: translate(-50%, -50%) scale(0);\n      opacity: 0; }\n    md-tooltip .md-background.md-show, md-tooltip .md-background.md-show-add-active {\n      -webkit-transform: translate(-50%, -50%) scale(1);\n              transform: translate(-50%, -50%) scale(1);\n      opacity: 1; }\n    md-tooltip .md-background.md-show-remove {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n      md-tooltip .md-background.md-show-remove.md-show-remove-active {\n        -webkit-transform: translate(-50%, -50%) scale(0);\n                transform: translate(-50%, -50%) scale(0);\n        opacity: 0; }\n  md-tooltip .md-content {\n    position: relative;\n    max-width: 240px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    padding: 8px;\n    background: transparent;\n    opacity: 0; }\n    md-tooltip .md-content.md-show-add {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      opacity: 0; }\n    md-tooltip .md-content.md-show, md-tooltip .md-content.md-show-add-active {\n      opacity: 1; }\n    md-tooltip .md-content.md-show-remove {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n      md-tooltip .md-content.md-show-remove.md-show-remove-active {\n        opacity: 0; }\n  md-tooltip.md-hide {\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-tooltip.md-show {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    pointer-events: auto;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n\n.md-whiteframe-z1 {\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-whiteframe-z2 {\n  box-shadow: 0px 8px 17px rgba(0, 0, 0, 0.2); }\n\n.md-whiteframe-z3 {\n  box-shadow: 0px 17px 50px rgba(0, 0, 0, 0.19); }\n\n.md-whiteframe-z4 {\n  box-shadow: 0px 16px 28px 0 rgba(0, 0, 0, 0.22); }\n\n.md-whiteframe-z5 {\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/angular-material.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nangular.module('ngMaterial', [\"ng\",\"ngAnimate\",\"ngAria\",\"material.core\",\"material.core.theming.palette\",\"material.core.theming\",\"material.components.autocomplete\",\"material.components.backdrop\",\"material.components.bottomSheet\",\"material.components.card\",\"material.components.button\",\"material.components.checkbox\",\"material.components.content\",\"material.components.dialog\",\"material.components.divider\",\"material.components.gridList\",\"material.components.icon\",\"material.components.input\",\"material.components.list\",\"material.components.progressCircular\",\"material.components.progressLinear\",\"material.components.radioButton\",\"material.components.select\",\"material.components.sidenav\",\"material.components.slider\",\"material.components.sticky\",\"material.components.subheader\",\"material.components.swipe\",\"material.components.switch\",\"material.components.tabs\",\"material.components.textField\",\"material.components.toast\",\"material.components.toolbar\",\"material.components.tooltip\",\"material.components.whiteframe\"]);\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * Initialization function that validates environment\n * requirements.\n */\nangular\n  .module('material.core', [ 'material.core.theming' ])\n  .config( MdCoreConfigure );\n\n\nfunction MdCoreConfigure($provide, $mdThemingProvider) {\n\n  $provide.decorator('$$rAF', [\"$delegate\", rAFDecorator]);\n\n  $mdThemingProvider.theme('default')\n    .primaryPalette('indigo')\n    .accentPalette('pink')\n    .warnPalette('red')\n    .backgroundPalette('grey');\n}\nMdCoreConfigure.$inject = [\"$provide\", \"$mdThemingProvider\"];\n\nfunction rAFDecorator( $delegate ) {\n  /**\n   * Use this to throttle events that come in often.\n   * The throttled function will always use the *last* invocation before the\n   * coming frame.\n   *\n   * For example, window resize events that fire many times a second:\n   * If we set to use an raf-throttled callback on window resize, then\n   * our callback will only be fired once per frame, with the last resize\n   * event that happened before that frame.\n   *\n   * @param {function} callback function to debounce\n   */\n  $delegate.throttle = function(cb) {\n    var queueArgs, alreadyQueued, queueCb, context;\n    return function debounced() {\n      queueArgs = arguments;\n      context = this;\n      queueCb = cb;\n      if (!alreadyQueued) {\n        alreadyQueued = true;\n        $delegate(function() {\n          queueCb.apply(context, queueArgs);\n          alreadyQueued = false;\n        });\n      }\n    };\n  };\n  return $delegate;\n}\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core')\n.factory('$mdConstant', MdConstantFactory);\n\nfunction MdConstantFactory($$rAF, $sniffer) {\n\n  var webkit = /webkit/i.test($sniffer.vendorPrefix);\n  function vendorProperty(name) {\n    return webkit ?  ('webkit' + name.charAt(0).toUpperCase() + name.substring(1)) : name;\n  }\n\n  return {\n    KEY_CODE: {\n      ENTER: 13,\n      ESCAPE: 27,\n      SPACE: 32,\n      LEFT_ARROW : 37,\n      UP_ARROW : 38,\n      RIGHT_ARROW : 39,\n      DOWN_ARROW : 40,\n      TAB : 9\n    },\n    CSS: {\n      /* Constants */\n      TRANSITIONEND: 'transitionend' + (webkit ? ' webkitTransitionEnd' : ''),\n      ANIMATIONEND: 'animationend' + (webkit ? ' webkitAnimationEnd' : ''),\n\n      TRANSFORM: vendorProperty('transform'),\n      TRANSFORM_ORIGIN: vendorProperty('transformOrigin'),\n      TRANSITION: vendorProperty('transition'),\n      TRANSITION_DURATION: vendorProperty('transitionDuration'),\n      ANIMATION_PLAY_STATE: vendorProperty('animationPlayState'),\n      ANIMATION_DURATION: vendorProperty('animationDuration'),\n      ANIMATION_NAME: vendorProperty('animationName'),\n      ANIMATION_TIMING: vendorProperty('animationTimingFunction'),\n      ANIMATION_DIRECTION: vendorProperty('animationDirection')\n    },\n    MEDIA: {\n      'sm': '(max-width: 600px)',\n      'gt-sm': '(min-width: 600px)',\n      'md': '(min-width: 600px) and (max-width: 960px)',\n      'gt-md': '(min-width: 960px)',\n      'lg': '(min-width: 960px) and (max-width: 1200px)',\n      'gt-lg': '(min-width: 1200px)'\n    },\n    MEDIA_PRIORITY: [\n      'gt-lg',\n      'lg',\n      'gt-md',\n      'md',\n      'gt-sm',\n      'sm'\n    ]\n  };\n}\nMdConstantFactory.$inject = [\"$$rAF\", \"$sniffer\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function(){\n\n  angular\n    .module('material.core')\n    .config( [\"$provide\", function($provide){\n       $provide.decorator('$mdUtil', ['$delegate', function ($delegate){\n           /**\n            * Inject the iterator facade to easily support iteration and accessors\n            * @see iterator below\n            */\n           $delegate.iterator = Iterator;\n\n           return $delegate;\n         }\n       ]);\n     }]);\n\n  /**\n   * iterator is a list facade to easily support iteration and accessors\n   *\n   * @param items Array list which this iterator will enumerate\n   * @param reloop Boolean enables iterator to consider the list as an endless reloop\n   */\n  function Iterator(items, reloop) {\n    var trueFn = function() { return true; };\n\n    if (items && !angular.isArray(items)) {\n      items = Array.prototype.slice.call(items);\n    }\n\n    reloop = !!reloop;\n    var _items = items || [ ];\n\n    // Published API\n    return {\n      items: getItems,\n      count: count,\n\n      inRange: inRange,\n      contains: contains,\n      indexOf: indexOf,\n      itemAt: itemAt,\n\n      findBy: findBy,\n\n      add: add,\n      remove: remove,\n\n      first: first,\n      last: last,\n      next: angular.bind(null, findSubsequentItem, false),\n      previous: angular.bind(null, findSubsequentItem, true),\n\n      hasPrevious: hasPrevious,\n      hasNext: hasNext\n\n    };\n\n    /**\n     * Publish copy of the enumerable set\n     * @returns {Array|*}\n     */\n    function getItems() {\n      return [].concat(_items);\n    }\n\n    /**\n     * Determine length of the list\n     * @returns {Array.length|*|number}\n     */\n    function count() {\n      return _items.length;\n    }\n\n    /**\n     * Is the index specified valid\n     * @param index\n     * @returns {Array.length|*|number|boolean}\n     */\n    function inRange(index) {\n      return _items.length && ( index > -1 ) && (index < _items.length );\n    }\n\n    /**\n     * Can the iterator proceed to the next item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasNext(item) {\n      return item ? inRange(indexOf(item) + 1) : false;\n    }\n\n    /**\n     * Can the iterator proceed to the previous item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasPrevious(item) {\n      return item ? inRange(indexOf(item) - 1) : false;\n    }\n\n    /**\n     * Get item at specified index/position\n     * @param index\n     * @returns {*}\n     */\n    function itemAt(index) {\n      return inRange(index) ? _items[index] : null;\n    }\n\n    /**\n     * Find all elements matching the key/value pair\n     * otherwise return null\n     *\n     * @param val\n     * @param key\n     *\n     * @return array\n     */\n    function findBy(key, val) {\n      return _items.filter(function(item) {\n        return item[key] === val;\n      });\n    }\n\n    /**\n     * Add item to list\n     * @param item\n     * @param index\n     * @returns {*}\n     */\n    function add(item, index) {\n      if ( !item ) return -1;\n\n      if (!angular.isNumber(index)) {\n        index = _items.length;\n      }\n\n      _items.splice(index, 0, item);\n\n      return indexOf(item);\n    }\n\n    /**\n     * Remove item from list...\n     * @param item\n     */\n    function remove(item) {\n      if ( contains(item) ){\n        _items.splice(indexOf(item), 1);\n      }\n    }\n\n    /**\n     * Get the zero-based index of the target item\n     * @param item\n     * @returns {*}\n     */\n    function indexOf(item) {\n      return _items.indexOf(item);\n    }\n\n    /**\n     * Boolean existence check\n     * @param item\n     * @returns {boolean}\n     */\n    function contains(item) {\n      return item && (indexOf(item) > -1);\n    }\n\n    /**\n     * Return first item in the list\n     * @returns {*}\n     */\n    function first() {\n      return _items.length ? _items[0] : null;\n    }\n\n    /**\n     * Return last item in the list...\n     * @returns {*}\n     */\n    function last() {\n      return _items.length ? _items[_items.length - 1] : null;\n    }\n\n    /**\n     * Find the next item. If reloop is true and at the end of the list, it will go back to the\n     * first item. If given, the `validate` callback will be used to determine whether the next item\n     * is valid. If not valid, it will try to find the next item again.\n     *\n     * @param {boolean} backwards Specifies the direction of searching (forwards/backwards)\n     * @param {*} item The item whose subsequent item we are looking for\n     * @param {Function=} validate The `validate` function\n     * @param {integer=} limit The recursion limit\n     *\n     * @returns {*} The subsequent item or null\n     */\n    function findSubsequentItem(backwards, item, validate, limit) {\n      validate = validate || trueFn;\n\n      var curIndex = indexOf(item);\n      while (true) {\n        if (!inRange(curIndex)) return null;\n\n        var nextIndex = curIndex + (backwards ? -1 : 1);\n        var foundItem = null;\n        if (inRange(nextIndex)) {\n          foundItem = _items[nextIndex];\n        } else if (reloop) {\n          foundItem = backwards ? last() : first();\n          nextIndex = indexOf(foundItem);\n        }\n\n        if ((foundItem === null) || (nextIndex === limit)) return null;\n        if (validate(foundItem)) return foundItem;\n\n        if (angular.isUndefined(limit)) limit = nextIndex;\n\n        curIndex = nextIndex;\n      }\n    }\n  }\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nangular.module('material.core')\n.factory('$mdMedia', mdMediaFactory);\n\n/**\n * Exposes a function on the '$mdMedia' service which will return true or false,\n * whether the given media query matches. Re-evaluates on resize. Allows presets\n * for 'sm', 'md', 'lg'.\n *\n * @example $mdMedia('sm') == true if device-width <= sm\n * @example $mdMedia('(min-width: 1200px)') == true if device-width >= 1200px\n * @example $mdMedia('max-width: 300px') == true if device-width <= 300px (sanitizes input, adding parens)\n */\nfunction mdMediaFactory($mdConstant, $rootScope, $window) {\n  var queries = {};\n  var mqls = {};\n  var results = {};\n  var normalizeCache = {};\n\n  $mdMedia.getResponsiveAttribute = getResponsiveAttribute;\n  $mdMedia.getQuery = getQuery;\n  $mdMedia.watchResponsiveAttributes = watchResponsiveAttributes;\n\n  return $mdMedia;\n\n  function $mdMedia(query) {\n    var validated = queries[query];\n    if (angular.isUndefined(validated)) {\n      validated = queries[query] = validate(query);\n    }\n\n    var result = results[validated];\n    if (angular.isUndefined(result)) {\n      result = add(validated);\n    }\n\n    return result;\n  }\n\n  function validate(query) {\n    return $mdConstant.MEDIA[query] ||\n           ((query.charAt(0) !== '(') ? ('(' + query + ')') : query);\n  }\n\n  function add(query) {\n    var result = mqls[query] = $window.matchMedia(query);\n    result.addListener(onQueryChange);\n    return (results[result.media] = !!result.matches);\n  }\n\n  function onQueryChange(query) {\n    $rootScope.$evalAsync(function() {\n      results[query.media] = !!query.matches;\n    });\n  }\n\n  function getQuery(name) {\n    return mqls[name];\n  }\n\n  function getResponsiveAttribute(attrs, attrName) {\n    for (var i = 0; i < $mdConstant.MEDIA_PRIORITY.length; i++) {\n      var mediaName = $mdConstant.MEDIA_PRIORITY[i];\n      if (!mqls[queries[mediaName]].matches) {\n        continue;\n      }\n\n      var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n      if (attrs[normalizedName]) {\n        return attrs[normalizedName];\n      }\n    }\n\n    // fallback on unprefixed\n    return attrs[getNormalizedName(attrs, attrName)];\n  }\n\n  function watchResponsiveAttributes(attrNames, attrs, watchFn) {\n    var unwatchFns = [];\n    attrNames.forEach(function(attrName) {\n      var normalizedName = getNormalizedName(attrs, attrName);\n      if (attrs[normalizedName]) {\n        unwatchFns.push(\n            attrs.$observe(normalizedName, angular.bind(void 0, watchFn, null)));\n      }\n\n      for (var mediaName in $mdConstant.MEDIA) {\n        var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n        if (!attrs[normalizedName]) {\n          return;\n        }\n\n        unwatchFns.push(attrs.$observe(normalizedName, angular.bind(void 0, watchFn, mediaName)));\n      }\n    });\n\n    return function unwatch() {\n      unwatchFns.forEach(function(fn) { fn(); })\n    };\n  }\n\n  // Improves performance dramatically\n  function getNormalizedName(attrs, attrName) {\n    return normalizeCache[attrName] ||\n        (normalizeCache[attrName] = attrs.$normalize(attrName));\n  }\n}\nmdMediaFactory.$inject = [\"$mdConstant\", \"$rootScope\", \"$window\"];\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/*\n * This var has to be outside the angular factory, otherwise when\n * there are multiple material apps on the same page, each app\n * will create its own instance of this array and the app's IDs\n * will not be unique.\n */\nvar nextUniqueId = ['0','0','0'];\n\nangular.module('material.core')\n.factory('$mdUtil', [\"$cacheFactory\", \"$document\", \"$timeout\", \"$q\", \"$window\", \"$mdConstant\", function($cacheFactory, $document, $timeout, $q, $window, $mdConstant) {\n  var Util;\n\n  function getNode(el) {\n    return el[0] || el;\n  }\n\n  return Util = {\n    now: window.performance ?\n      angular.bind(window.performance, window.performance.now) : \n      Date.now,\n\n    clientRect: function(element, offsetParent, isOffsetRect) {\n      var node = getNode(element);\n      offsetParent = getNode(offsetParent || node.offsetParent || document.body);\n      var nodeRect = node.getBoundingClientRect();\n\n      // The user can ask for an offsetRect: a rect relative to the offsetParent,\n      // or a clientRect: a rect relative to the page\n      var offsetRect = isOffsetRect ?\n        offsetParent.getBoundingClientRect() : \n        { left: 0, top: 0, width: 0, height: 0 };\n      return {\n        left: nodeRect.left - offsetRect.left + offsetParent.scrollLeft,\n        top: nodeRect.top - offsetRect.top + offsetParent.scrollTop,\n        width: nodeRect.width,\n        height: nodeRect.height\n      };\n    },\n    offsetRect: function(element, offsetParent) {\n      return Util.clientRect(element, offsetParent, true);\n    },\n\n    floatingScrollbars: function() {\n      if (this.floatingScrollbars.cached === undefined) {\n        var tempNode = angular.element('<div style=\"z-index: -1; position: absolute; height: 1px; overflow-y: scroll\"><div style=\"height: 2px;\"></div></div>');\n        $document[0].body.appendChild(tempNode[0]);\n        this.floatingScrollbars.cached = (tempNode[0].offsetWidth == tempNode[0].childNodes[0].offsetWidth);\n        tempNode.remove();\n      }\n      return this.floatingScrollbars.cached;\n    },\n\n    // Mobile safari only allows you to set focus in click event listeners...\n    forceFocus: function(element) {\n      var node = element[0] || element;\n\n      document.addEventListener('click', function focusOnClick(ev) {\n        if (ev.target === node && ev.$focus) {\n          node.focus();\n          ev.stopImmediatePropagation();\n          ev.preventDefault();\n          node.removeEventListener('click', focusOnClick);\n        }\n      }, true);\n\n      var newEvent = document.createEvent('MouseEvents');\n      newEvent.initMouseEvent('click', false, true, window, {}, 0, 0, 0, 0,\n                       false, false, false, false, 0, null);\n      newEvent.$material = true;\n      newEvent.$focus = true;\n      node.dispatchEvent(newEvent);\n    },\n\n    transitionEndPromise: function(element) {\n      var deferred = $q.defer();\n      element.on($mdConstant.CSS.TRANSITIONEND, finished);\n      function finished(ev) {\n        // Make sure this transitionend didn't bubble up from a child\n        if (ev.target === element[0]) {\n          element.off($mdConstant.CSS.TRANSITIONEND, finished);\n          deferred.resolve();\n        }\n      }\n      return deferred.promise;\n    },\n\n    fakeNgModel: function() {\n      return {\n        $fake: true,\n        $setTouched : angular.noop,\n        $setViewValue: function(value) {\n          this.$viewValue = value;\n          this.$render(value);\n          this.$viewChangeListeners.forEach(function(cb) { cb(); });\n        },\n        $isEmpty: function(value) {\n          return (''+value).length === 0;\n        },\n        $parsers: [],\n        $formatters: [],\n        $viewChangeListeners: [],\n        $render: angular.noop\n      };\n    },\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds.\n    // @param wait Integer value of msecs to delay (since last debounce reset); default value 10 msecs\n    // @param invokeApply should the $timeout trigger $digest() dirty checking\n    debounce: function (func, wait, scope, invokeApply) {\n      var timer;\n\n      return function debounced() {\n        var context = scope,\n          args = Array.prototype.slice.call(arguments);\n\n        $timeout.cancel(timer);\n        timer = $timeout(function() {\n\n          timer = undefined;\n          func.apply(context, args);\n\n        }, wait || 10, invokeApply );\n      };\n    },\n\n    // Returns a function that can only be triggered every `delay` milliseconds.\n    // In other words, the function will not be called unless it has been more\n    // than `delay` milliseconds since the last call.\n    throttle: function throttle(func, delay) {\n      var recent;\n      return function throttled() {\n        var context = this;\n        var args = arguments;\n        var now = Util.now();\n\n        if (!recent || (now - recent > delay)) {\n          func.apply(context, args);\n          recent = now;\n        }\n      };\n    },\n\n    /**\n     * Measures the number of milliseconds taken to run the provided callback\n     * function. Uses a high-precision timer if available.\n     */\n    time: function time(cb) {\n      var start = Util.now();\n      cb();\n      return Util.now() - start;\n    },\n\n    /**\n     * nextUid, from angular.js.\n     * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\n     * characters such as '012ABC'. The reason why we are not using simply a number counter is that\n     * the number string gets longer over time, and it can also overflow, where as the nextId\n     * will grow much slower, it is a string, and it will never overflow.\n     *\n     * @returns an unique alpha-numeric string\n     */\n    nextUid: function() {\n      var index = nextUniqueId.length;\n      var digit;\n\n      while(index) {\n        index--;\n        digit = nextUniqueId[index].charCodeAt(0);\n        if (digit == 57 /*'9'*/) {\n          nextUniqueId[index] = 'A';\n          return nextUniqueId.join('');\n        }\n        if (digit == 90  /*'Z'*/) {\n          nextUniqueId[index] = '0';\n        } else {\n          nextUniqueId[index] = String.fromCharCode(digit + 1);\n          return nextUniqueId.join('');\n        }\n      }\n      nextUniqueId.unshift('0');\n      return nextUniqueId.join('');\n    },\n\n    // Stop watchers and events from firing on a scope without destroying it,\n    // by disconnecting it from its parent and its siblings' linked lists.\n    disconnectScope: function disconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't destroy the root scope or a scope that has been already destroyed\n      if (scope.$root === scope) return;\n      if (scope.$$destroyed ) return;\n\n      var parent = scope.$parent;\n      scope.$$disconnected = true;\n\n      // See Scope.$destroy\n      if (parent.$$childHead === scope) parent.$$childHead = scope.$$nextSibling;\n      if (parent.$$childTail === scope) parent.$$childTail = scope.$$prevSibling;\n      if (scope.$$prevSibling) scope.$$prevSibling.$$nextSibling = scope.$$nextSibling;\n      if (scope.$$nextSibling) scope.$$nextSibling.$$prevSibling = scope.$$prevSibling;\n\n      scope.$$nextSibling = scope.$$prevSibling = null;\n\n    },\n\n    // Undo the effects of disconnectScope above.\n    reconnectScope: function reconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't disconnect the root node or scope already disconnected\n      if (scope.$root === scope) return;\n      if (!scope.$$disconnected) return;\n\n      var child = scope;\n\n      var parent = child.$parent;\n      child.$$disconnected = false;\n      // See Scope.$new for this logic...\n      child.$$prevSibling = parent.$$childTail;\n      if (parent.$$childHead) {\n        parent.$$childTail.$$nextSibling = child;\n        parent.$$childTail = child;\n      } else {\n        parent.$$childHead = parent.$$childTail = child;\n      }\n    },\n  /*\n   * getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName\n   *\n   * @param el Element to start walking the DOM from\n   * @param tagName Tag name to find closest to el, such as 'form'\n   */\n    getClosest: function getClosest(el, tagName) {\n      tagName = tagName.toUpperCase();\n      do {\n        if (el.nodeName === tagName) {\n          return el;\n        }\n      } while (el = el.parentNode);\n      return null;\n    }\n  };\n\n}]);\n\n/*\n * Since removing jQuery from the demos, some code that uses `element.focus()` is broken.\n *\n * We need to add `element.focus()`, because it's testable unlike `element[0].focus`.\n *\n * TODO(ajoslin): This should be added in a better place later.\n */\n\nangular.element.prototype.focus = angular.element.prototype.focus || function() {\n  if (this.length) {\n    this[0].focus();\n  }\n  return this;\n};\nangular.element.prototype.blur = angular.element.prototype.blur || function() {\n  if (this.length) {\n    this[0].blur();\n  }\n  return this;\n};\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdAria', AriaService);\n\nfunction AriaService($$rAF, $log, $window) {\n\n  return {\n    expect: expect,\n    expectAsync: expectAsync,\n    expectWithText: expectWithText\n  };\n\n  /**\n   * Check if expected attribute has been specified on the target element or child\n   * @param element\n   * @param attrName\n   * @param {optional} defaultValue What to set the attr to if no value is found\n   */\n  function expect(element, attrName, defaultValue) {\n    var node = element[0];\n\n    if (!node.hasAttribute(attrName) && !childHasAttribute(node, attrName)) {\n\n      defaultValue = angular.isString(defaultValue) ? defaultValue.trim() : '';\n      if (defaultValue.length) {\n        element.attr(attrName, defaultValue);\n      } else {\n        $log.warn('ARIA: Attribute \"', attrName, '\", required for accessibility, is missing on node:', node);\n      }\n\n    }\n  }\n\n  function expectAsync(element, attrName, defaultValueGetter) {\n    // Problem: when retrieving the element's contents synchronously to find the label,\n    // the text may not be defined yet in the case of a binding.\n    // There is a higher chance that a binding will be defined if we wait one frame.\n    $$rAF(function() {\n      expect(element, attrName, defaultValueGetter());\n    });\n  }\n\n  function expectWithText(element, attrName) {\n    expectAsync(element, attrName, function() {\n      return getText(element);\n    });\n  }\n\n  function getText(element) {\n    return element.text().trim();\n  }\n\n  function childHasAttribute(node, attrName) {\n    var hasChildren = node.hasChildNodes(),\n        hasAttr = false;\n\n    function isHidden(el) {\n      var style = el.currentStyle ? el.currentStyle : $window.getComputedStyle(el);\n      return (style.display === 'none');\n    }\n\n    if(hasChildren) {\n      var children = node.childNodes;\n      for(var i=0; i<children.length; i++){\n        var child = children[i];\n        if(child.nodeType === 1 && child.hasAttribute(attrName)) {\n          if(!isHidden(child)){\n            hasAttr = true;\n          }\n        }\n      }\n    }\n    return hasAttr;\n  }\n}\nAriaService.$inject = [\"$$rAF\", \"$log\", \"$window\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/*\n * TODO: Add support for multiple fingers on the `pointer` object (enables pinch gesture)\n */\n\nvar START_EVENTS = 'mousedown touchstart pointerdown';\nvar MOVE_EVENTS = 'mousemove touchmove pointermove';\nvar END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';\nvar HANDLERS;\n\ndocument.contains || (document.contains = function(node) {\n  return document.body.contains(node);\n});\n\n// TODO add windows phone to this\nvar userAgent = navigator.userAgent || navigator.vendor || window.opera;\nvar isIos = userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/iPod/i);\nvar isAndroid = userAgent.match(/Android/i);\nvar shouldHijackClicks = isIos || isAndroid;\n\nif (shouldHijackClicks) {\n  document.addEventListener('click', function(ev) {\n    // Space/enter on a button, and submit events, can send clicks\n    var isKeyClick = ev.clientX === 0 && ev.clientY === 0;\n    if (isKeyClick || ev.$material) return;\n\n    // Prevent clicks unless they're sent by material\n    ev.preventDefault();\n    ev.stopPropagation();\n  }, true);\n}\n\nangular.element(document)\n  .on(START_EVENTS, gestureStart)\n  .on(MOVE_EVENTS, gestureMove)\n  .on(END_EVENTS, gestureEnd)\n  // For testing\n  .on('$$mdGestureReset', function() {\n    lastPointer = pointer = null;\n  });\n\n// The state of the current and previous 'pointer' (user's hand)\nvar pointer, lastPointer;\n\nfunction runHandlers(handlerEvent, event) {\n  var handler;\n  for (var handlerName in HANDLERS) {\n    handler = HANDLERS[handlerName];\n    if (handlerEvent === 'start') {\n      // Run cancel to reset any handlers' state\n      handler.cancel();\n    }\n    handler[handlerEvent](event, pointer);\n  }\n}\n\nfunction gestureStart(ev) {\n  // If we're already touched down, abort\n  if (pointer) return;\n\n  var now = +Date.now();\n\n  // iOS & old android bug: after a touch event, a click event is sent 350 ms later.\n  // If <400ms have passed, don't allow an event of a different type than the previous event\n  if (lastPointer && !typesMatch(ev, lastPointer) && (now - lastPointer.endTime < 1500)) {\n    return;\n  }\n\n  pointer = makeStartPointer(ev);\n\n  runHandlers('start', ev);\n}\n\nfunction gestureMove(ev) {\n  if (!pointer || !typesMatch(ev, pointer)) return;\n\n  updatePointerState(ev, pointer);\n  runHandlers('move', ev);\n}\n\nfunction gestureEnd(ev) {\n  if (!pointer || !typesMatch(ev, pointer)) return;\n\n  updatePointerState(ev, pointer);\n  pointer.endTime = +Date.now();\n\n  runHandlers('end', ev);\n\n  lastPointer = pointer;\n  pointer = null;\n}\n\n/******** Helpers *********/\nfunction typesMatch(ev, pointer) {\n  return ev && pointer && ev.type.charAt(0) === pointer.type;\n}\n\nfunction getEventPoint(ev) {\n  ev = ev.originalEvent || ev; // support jQuery events\n  return (ev.touches && ev.touches[0]) ||\n    (ev.changedTouches && ev.changedTouches[0]) ||\n    ev;\n}\n\nfunction updatePointerState(ev, pointer) {\n  var point = getEventPoint(ev);\n  var x = pointer.x = point.pageX;\n  var y = pointer.y = point.pageY;\n\n  pointer.distanceX = x - pointer.startX;\n  pointer.distanceY = y - pointer.startY;\n  pointer.distance = Math.sqrt(\n    pointer.distanceX * pointer.distanceX + pointer.distanceY * pointer.distanceY\n  );\n\n  pointer.directionX = pointer.distanceX > 0 ? 'right' : pointer.distanceX < 0 ? 'left' : '';\n  pointer.directionY = pointer.distanceY > 0 ? 'up' : pointer.distanceY < 0 ? 'down' : '';\n\n  pointer.duration = +Date.now() - pointer.startTime;\n  pointer.velocityX = pointer.distanceX / pointer.duration;\n  pointer.velocityY = pointer.distanceY / pointer.duration;\n}\n\n\nfunction makeStartPointer(ev) {\n  var point = getEventPoint(ev);\n  var startPointer = {\n    startTime: +Date.now(),\n    target: ev.target,\n    // 'p' for pointer, 'm' for mouse, 't' for touch\n    type: ev.type.charAt(0)\n  };\n  startPointer.startX = startPointer.x = point.pageX;\n  startPointer.startY = startPointer.y = point.pageY;\n  return startPointer;\n}\n\nangular.module('material.core')\n.run([\"$mdGesture\", function($mdGesture) {}]) // make sure $mdGesture is always instantiated\n.factory('$mdGesture', [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\", function($$MdGestureHandler, $$rAF, $timeout) {\n  HANDLERS = {};\n\n  if (shouldHijackClicks) {\n    addHandler('click', {\n      options: {\n        maxDistance: 6\n      },\n      onEnd: function(ev, pointer) {\n        if (pointer.distance < this.state.options.maxDistance) {\n          this.dispatchEvent(ev, 'click');\n        }\n      }\n    });\n  }\n\n  addHandler('press', {\n    onStart: function(ev, pointer) {\n      this.dispatchEvent(ev, '$md.pressdown');\n    },\n    onEnd: function(ev, pointer) {\n      this.dispatchEvent(ev, '$md.pressup');\n    }\n  });\n\n\n  addHandler('hold', {\n    options: {\n      // If the user keeps his finger within the same <maxDistance> area for\n      // <delay> ms, dispatch a hold event.\n      maxDistance: 6,\n      delay: 500,\n    },\n    onCancel: function() {\n      $timeout.cancel(this.state.timeout);\n    },\n    onStart: function(ev, pointer) {\n      // For hold, require a parent to be registered with $mdGesture.register()\n      // Because we prevent scroll events, this is necessary.\n      if (!this.state.registeredParent) return this.cancel();\n\n      this.state.pos = {x: pointer.x, y: pointer.y};\n      this.state.timeout = $timeout(angular.bind(this, function holdDelayFn() {\n        this.dispatchEvent(ev, '$md.hold');\n        this.cancel(); //we're done!\n      }), this.state.options.delay, false);\n    },\n    onMove: function(ev, pointer) {\n      // Don't scroll while waiting for hold\n      ev.preventDefault();\n      var dx = this.state.pos.x - pointer.x;\n      var dy = this.state.pos.y - pointer.y;\n      if (Math.sqrt(dx*dx + dy*dy) > this.options.maxDistance) {\n        this.cancel();\n      }\n    },\n    onEnd: function(ev, pointer) {\n      this.onCancel();\n    },\n  });\n\n  addHandler('drag', {\n    options: {\n      minDistance: 6,\n      horizontal: true,\n    },\n    onStart: function(ev) {\n      // For drag, require a parent to be registered with $mdGesture.register()\n      if (!this.state.registeredParent) this.cancel();\n    },\n    onMove: function(ev, pointer) {\n      var shouldStartDrag, shouldCancel;\n      // Don't allow touch events to scroll while we're dragging or\n      // deciding if this touchmove is a proper drag\n      ev.preventDefault();\n\n      if (!this.state.dragPointer) {\n        if (this.state.options.horizontal) {\n          shouldStartDrag = Math.abs(pointer.distanceX) > this.state.options.minDistance;\n          shouldCancel = Math.abs(pointer.distanceY) > this.state.options.minDistance * 1.5;\n        } else {\n          shouldStartDrag = Math.abs(pointer.distanceY) > this.state.options.minDistance;\n          shouldCancel = Math.abs(pointer.distanceX) > this.state.options.minDistance * 1.5;\n        }\n\n        if (shouldStartDrag) {\n          // Create a new pointer, starting at this point where the drag started.\n          this.state.dragPointer = makeStartPointer(ev);\n          updatePointerState(ev, this.state.dragPointer);\n          this.dispatchEvent(ev, '$md.dragstart', this.state.dragPointer);\n\n        } else if (shouldCancel) {\n          this.cancel();\n        }\n      } else {\n        this.dispatchDragMove(ev);\n      }\n    },\n    // Only dispatch these every frame; any more is unnecessray\n    dispatchDragMove: $$rAF.throttle(function(ev) {\n      // Make sure the drag didn't stop while waiting for the next frame\n      if (this.state.isRunning) {\n        updatePointerState(ev, this.state.dragPointer);\n        this.dispatchEvent(ev, '$md.drag', this.state.dragPointer);\n      }\n    }),\n    onEnd: function(ev, pointer) {\n      if (this.state.dragPointer) {\n        updatePointerState(ev, this.state.dragPointer);\n        this.dispatchEvent(ev, '$md.dragend', this.state.dragPointer);\n      }\n    }\n  });\n\n  addHandler('swipe', {\n    options: {\n      minVelocity: 0.65,\n      minDistance: 10,\n    },\n    onEnd: function(ev, pointer) {\n      if (Math.abs(pointer.velocityX) > this.state.options.minVelocity &&\n          Math.abs(pointer.distanceX) > this.state.options.minDistance) {\n        var eventType = pointer.directionX == 'left' ? '$md.swipeleft' : '$md.swiperight';\n        this.dispatchEvent(ev, eventType);\n      }\n    }\n  });\n\n  var self;\n  return self = {\n    handler: addHandler,\n    register: register\n  };\n\n  function addHandler(name, definition) {\n    var handler = new $$MdGestureHandler(name);\n    angular.extend(handler, definition);\n    HANDLERS[name] = handler;\n    return self;\n  }\n\n  function register(element, handlerName, options) {\n    var handler = HANDLERS[ handlerName.replace(/^\\$md./, '') ];\n    if (!handler) {\n      throw new Error('Failed to register element with handler ' + handlerName + '. ' +\n                      'Available handlers: ' + Object.keys(HANDLERS).join(', '));\n    }\n    return handler.registerElement(element, options);\n  }\n}])\n.factory('$$MdGestureHandler', [\"$$rAF\", function($$rAF) {\n\n  function GestureHandler(name) {\n    this.name = name;\n    this.state = {};\n  }\n  GestureHandler.prototype = {\n    onStart: angular.noop,\n    onMove: angular.noop,\n    onEnd: angular.noop,\n    onCancel: angular.noop,\n    options: {},\n\n    dispatchEvent: typeof window.jQuery !== 'undefined' && angular.element === window.jQuery ?\n      jQueryDispatchEvent :\n      nativeDispatchEvent,\n\n    start: function(ev, pointer) {\n      if (this.state.isRunning) return;\n      var parentTarget = this.getNearestParent(ev.target);\n      var parentTargetOptions = parentTarget && parentTarget.$mdGesture[this.name] || {};\n\n      this.state = {\n        isRunning: true,\n        options: angular.extend({}, this.options, parentTargetOptions),\n        registeredParent: parentTarget\n      };\n      this.onStart(ev, pointer);\n    },\n    move: function(ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onMove(ev, pointer);\n    },\n    end: function(ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onEnd(ev, pointer);\n      this.state.isRunning = false;\n    },\n    cancel: function(ev, pointer) {\n      this.onCancel(ev, pointer);\n      this.state = {};\n    },\n\n    // Find and return the nearest parent element that has been registered via\n    // $mdGesture.register(element, 'handlerName').\n    getNearestParent: function(node) {\n      var current = node;\n      while (current) {\n        if ( (current.$mdGesture || {})[this.name] ) {\n          return current;\n        }\n        current = current.parentNode;\n      }\n    },\n\n    registerElement: function(element, options) {\n      var self = this;\n      element[0].$mdGesture = element[0].$mdGesture || {};\n      element[0].$mdGesture[this.name] = options || {};\n      element.on('$destroy', onDestroy);\n\n      return onDestroy;\n\n      function onDestroy() {\n        delete element[0].$mdGesture[self.name];\n        element.off('$destroy', onDestroy);\n      }\n    },\n  };\n\n  function jQueryDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj = new angular.element.Event(eventType)\n\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n\n    angular.extend(eventObj, {\n      clientX: eventPointer.x,\n      clientY: eventPointer.y,\n      screenX: eventPointer.x,\n      screenY: eventPointer.y,\n      pageX: eventPointer.x,\n      pageY: eventPointer.y,\n      ctrlKey: srcEvent.ctrlKey,\n      altKey: srcEvent.altKey,\n      shiftKey: srcEvent.shiftKey,\n      metaKey: srcEvent.metaKey\n    });\n    angular.element(eventPointer.target).trigger(eventObj);\n  }\n\n  /*\n   * NOTE: nativeDispatchEvent is very performance sensitive.\n   */\n  function nativeDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj;\n\n    if (eventType === 'click') {\n      eventObj = document.createEvent('MouseEvents');\n      eventObj.initMouseEvent(\n        'click', true, true, window, srcEvent.detail,\n        eventPointer.x, eventPointer.y, eventPointer.x, eventPointer.y,\n        srcEvent.ctrlKey, srcEvent.altKey, srcEvent.shiftKey, srcEvent.metaKey,\n        srcEvent.button, srcEvent.relatedTarget || null\n      );\n\n    } else {\n      eventObj = document.createEvent('CustomEvent');\n      eventObj.initCustomEvent(eventType, true, true, {});\n    }\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n    eventPointer.target.dispatchEvent(eventObj);\n  }\n\n  return GestureHandler;\n}]);\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdCompiler', mdCompilerService);\n\nfunction mdCompilerService($q, $http, $injector, $compile, $controller, $templateCache) {\n  /* jshint validthis: true */\n\n  /*\n   * @ngdoc service\n   * @name $mdCompiler\n   * @module material.core\n   * @description\n   * The $mdCompiler service is an abstraction of angular's compiler, that allows the developer\n   * to easily compile an element with a templateUrl, controller, and locals.\n   *\n   * @usage\n   * <hljs lang=\"js\">\n   * $mdCompiler.compile({\n   *   templateUrl: 'modal.html',\n   *   controller: 'ModalCtrl',\n   *   locals: {\n   *     modal: myModalInstance;\n   *   }\n   * }).then(function(compileData) {\n   *   compileData.element; // modal.html's template in an element\n   *   compileData.link(myScope); //attach controller & scope to element\n   * });\n   * </hljs>\n   */\n\n   /*\n    * @ngdoc method\n    * @name $mdCompiler#compile\n    * @description A helper to compile an HTML template/templateUrl with a given controller,\n    * locals, and scope.\n    * @param {object} options An options object, with the following properties:\n    *\n    *    - `controller` - `{(string=|function()=}` Controller fn that should be associated with\n    *      newly created scope or the name of a registered controller if passed as a string.\n    *    - `controllerAs` - `{string=}` A controller alias name. If present the controller will be\n    *      published to scope under the `controllerAs` name.\n    *    - `template` - `{string=}` An html template as a string.\n    *    - `templateUrl` - `{string=}` A path to an html template.\n    *    - `transformTemplate` - `{function(template)=}` A function which transforms the template after\n    *      it is loaded. It will be given the template string as a parameter, and should\n    *      return a a new string representing the transformed template.\n    *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n    *      be injected into the controller. If any of these dependencies are promises, the compiler\n    *      will wait for them all to be resolved, or if one is rejected before the controller is\n    *      instantiated `compile()` will fail..\n    *      * `key` - `{string}`: a name of a dependency to be injected into the controller.\n    *      * `factory` - `{string|function}`: If `string` then it is an alias for a service.\n    *        Otherwise if function, then it is injected and the return value is treated as the\n    *        dependency. If the result is a promise, it is resolved before its value is \n    *        injected into the controller.\n    *\n    * @returns {object=} promise A promise, which will be resolved with a `compileData` object.\n    * `compileData` has the following properties: \n    *\n    *   - `element` - `{element}`: an uncompiled element matching the provided template.\n    *   - `link` - `{function(scope)}`: A link function, which, when called, will compile\n    *     the element and instantiate the provided controller (if given).\n    *   - `locals` - `{object}`: The locals which will be passed into the controller once `link` is\n    *     called. If `bindToController` is true, they will be coppied to the ctrl instead\n    *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n    */\n  this.compile = function(options) {\n    var templateUrl = options.templateUrl;\n    var template = options.template || '';\n    var controller = options.controller;\n    var controllerAs = options.controllerAs;\n    var resolve = options.resolve || {};\n    var locals = options.locals || {};\n    var transformTemplate = options.transformTemplate || angular.identity;\n    var bindToController = options.bindToController;\n\n    // Take resolve values and invoke them.  \n    // Resolves can either be a string (value: 'MyRegisteredAngularConst'),\n    // or an invokable 'factory' of sorts: (value: function ValueGetter($dependency) {})\n    angular.forEach(resolve, function(value, key) {\n      if (angular.isString(value)) {\n        resolve[key] = $injector.get(value);\n      } else {\n        resolve[key] = $injector.invoke(value);\n      }\n    });\n    //Add the locals, which are just straight values to inject\n    //eg locals: { three: 3 }, will inject three into the controller\n    angular.extend(resolve, locals);\n\n    if (templateUrl) {\n      resolve.$template = $http.get(templateUrl, {cache: $templateCache})\n        .then(function(response) {\n          return response.data;\n        });\n    } else {\n      resolve.$template = $q.when(template);\n    }\n\n    // Wait for all the resolves to finish if they are promises\n    return $q.all(resolve).then(function(locals) {\n\n      var template = transformTemplate(locals.$template);\n      var element = options.element || angular.element('<div>').html(template.trim()).contents();\n      var linkFn = $compile(element);\n\n      //Return a linking function that can be used later when the element is ready\n      return {\n        locals: locals,\n        element: element,\n        link: function link(scope) {\n          locals.$scope = scope;\n\n          //Instantiate controller if it exists, because we have scope\n          if (controller) {\n            var ctrl = $controller(controller, locals);\n            if (bindToController) {\n              angular.extend(ctrl, locals);\n            }\n            //See angular-route source for this logic\n            element.data('$ngControllerController', ctrl);\n            element.children().data('$ngControllerController', ctrl);\n\n            if (controllerAs) {\n              scope[controllerAs] = ctrl;\n            }\n          }\n          return linkFn(scope);\n        }\n      };\n    });\n\n  };\n}\nmdCompilerService.$inject = [\"$q\", \"$http\", \"$injector\", \"$compile\", \"$controller\", \"$templateCache\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .provider('$$interimElement', InterimElementProvider);\n\n/*\n * @ngdoc service\n * @name $$interimElement\n * @module material.core\n *\n * @description\n *\n * Factory that contructs `$$interimElement.$service` services.\n * Used internally in material design for elements that appear on screen temporarily.\n * The service provides a promise-like API for interacting with the temporary\n * elements.\n *\n * ```js\n * app.service('$mdToast', function($$interimElement) {\n *   var $mdToast = $$interimElement(toastDefaultOptions);\n *   return $mdToast;\n * });\n * ```\n * @param {object=} defaultOptions Options used by default for the `show` method on the service.\n *\n * @returns {$$interimElement.$service}\n *\n */\n\nfunction InterimElementProvider() {\n  createInterimElementProvider.$get = InterimElementFactory;\n  InterimElementFactory.$inject = [\"$document\", \"$q\", \"$rootScope\", \"$timeout\", \"$rootElement\", \"$animate\", \"$interpolate\", \"$mdCompiler\", \"$mdTheming\"];\n  return createInterimElementProvider;\n\n  /**\n   * Returns a new provider which allows configuration of a new interimElement\n   * service. Allows configuration of default options & methods for options,\n   * as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)\n   */\n  function createInterimElementProvider(interimFactoryName) {\n    var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];\n\n    var customMethods = {};\n    var providerConfig = {\n      presets: {}\n    };\n\n    var provider = {\n      setDefaults: setDefaults,\n      addPreset: addPreset,\n      addMethod: addMethod,\n      $get: factory\n    };\n\n    /**\n     * all interim elements will come with the 'build' preset\n     */\n    provider.addPreset('build', {\n      methods: ['controller', 'controllerAs', 'resolve',\n        'template', 'templateUrl', 'themable', 'transformTemplate', 'parent']\n    });\n\n    factory.$inject = [\"$$interimElement\", \"$animate\", \"$injector\"];\n    return provider;\n\n    /**\n     * Save the configured defaults to be used when the factory is instantiated\n     */\n    function setDefaults(definition) {\n      providerConfig.optionsFactory = definition.options;\n      providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);\n      return provider;\n    }\n\n    /**\n     * Add a method to the factory that isn't specific to any interim element operations\n     */\n\n    function addMethod(name, fn) {\n      customMethods[name] = fn;\n      return provider;\n    }\n\n    /**\n     * Save the configured preset to be used when the factory is instantiated\n     */\n    function addPreset(name, definition) {\n      definition = definition || {};\n      definition.methods = definition.methods || [];\n      definition.options = definition.options || function() { return {}; };\n\n      if (/^cancel|hide|show$/.test(name)) {\n        throw new Error(\"Preset '\" + name + \"' in \" + interimFactoryName + \" is reserved!\");\n      }\n      if (definition.methods.indexOf('_options') > -1) {\n        throw new Error(\"Method '_options' in \" + interimFactoryName + \" is reserved!\");\n      }\n      providerConfig.presets[name] = {\n        methods: definition.methods.concat(EXPOSED_METHODS),\n        optionsFactory: definition.options,\n        argOption: definition.argOption\n      };\n      return provider;\n    }\n\n    /**\n     * Create a factory that has the given methods & defaults implementing interimElement\n     */\n    /* @ngInject */\n    function factory($$interimElement, $animate, $injector) {\n      var defaultMethods;\n      var defaultOptions;\n      var interimElementService = $$interimElement();\n\n      /*\n       * publicService is what the developer will be using.\n       * It has methods hide(), cancel(), show(), build(), and any other\n       * presets which were set during the config phase.\n       */\n      var publicService = {\n        hide: interimElementService.hide,\n        cancel: interimElementService.cancel,\n        show: showInterimElement\n      };\n\n      defaultMethods = providerConfig.methods || [];\n      // This must be invoked after the publicService is initialized\n      defaultOptions = invokeFactory(providerConfig.optionsFactory, {});\n\n      // Copy over the simple custom methods\n      angular.forEach(customMethods, function(fn, name) {\n        publicService[name] = fn;\n      });\n\n      angular.forEach(providerConfig.presets, function(definition, name) {\n        var presetDefaults = invokeFactory(definition.optionsFactory, {});\n        var presetMethods = (definition.methods || []).concat(defaultMethods);\n\n        // Every interimElement built with a preset has a field called `$type`,\n        // which matches the name of the preset.\n        // Eg in preset 'confirm', options.$type === 'confirm'\n        angular.extend(presetDefaults, { $type: name });\n\n        // This creates a preset class which has setter methods for every\n        // method given in the `.addPreset()` function, as well as every\n        // method given in the `.setDefaults()` function.\n        //\n        // @example\n        // .setDefaults({\n        //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n        //   options: dialogDefaultOptions\n        // })\n        // .addPreset('alert', {\n        //   methods: ['title', 'ok'],\n        //   options: alertDialogOptions\n        // })\n        //\n        // Set values will be passed to the options when interimElemnt.show() is called.\n        function Preset(opts) {\n          this._options = angular.extend({}, presetDefaults, opts);\n        }\n        angular.forEach(presetMethods, function(name) {\n          Preset.prototype[name] = function(value) {\n            this._options[name] = value;\n            return this;\n          };\n        });\n\n        // Create shortcut method for one-linear methods\n        if (definition.argOption) {\n          var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);\n          publicService[methodName] = function(arg) {\n            var config = publicService[name](arg);\n            return publicService.show(config);\n          };\n        }\n\n        // eg $mdDialog.alert() will return a new alert preset\n        publicService[name] = function(arg) {\n          // If argOption is supplied, eg `argOption: 'content'`, then we assume\n          // if the argument is not an options object then it is the `argOption` option.\n          //\n          // @example `$mdToast.simple('hello')` // sets options.content to hello\n          //                                     // because argOption === 'content'\n          if (arguments.length && definition.argOption && !angular.isObject(arg) &&\n              !angular.isArray(arg)) {\n            return (new Preset())[definition.argOption](arg);\n          } else {\n            return new Preset(arg);\n          }\n\n        };\n      });\n\n      return publicService;\n\n      function showInterimElement(opts) {\n        // opts is either a preset which stores its options on an _options field,\n        // or just an object made up of options\n        if (opts && opts._options) opts = opts._options;\n        return interimElementService.show(\n          angular.extend({}, defaultOptions, opts)\n        );\n      }\n\n      /**\n       * Helper to call $injector.invoke with a local of the factory name for\n       * this provider.\n       * If an $mdDialog is providing options for a dialog and tries to inject\n       * $mdDialog, a circular dependency error will happen.\n       * We get around that by manually injecting $mdDialog as a local.\n       */\n      function invokeFactory(factory, defaultVal) {\n        var locals = {};\n        locals[interimFactoryName] = publicService;\n        return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);\n      }\n\n    }\n\n  }\n\n  /* @ngInject */\n  function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate,\n                                 $interpolate, $mdCompiler, $mdTheming ) {\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        usesStandardSymbols = ((startSymbol === '{{') && (endSymbol === '}}')),\n        processTemplate  = usesStandardSymbols ? angular.identity : replaceInterpolationSymbols;\n\n    return function createInterimElementService() {\n      /*\n       * @ngdoc service\n       * @name $$interimElement.$service\n       *\n       * @description\n       * A service used to control inserting and removing an element into the DOM.\n       *\n       */\n      var stack = [];\n      var service;\n      return service = {\n        show: show,\n        hide: hide,\n        cancel: cancel\n      };\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#show\n       * @kind function\n       *\n       * @description\n       * Adds the `$interimElement` to the DOM and returns a promise that will be resolved or rejected\n       * with hide or cancel, respectively.\n       *\n       * @param {*} options is hashMap of settings\n       * @returns a Promise\n       *\n       */\n      function show(options) {\n        if (stack.length) {\n          return service.cancel().then(function() {\n            return show(options);\n          });\n        } else {\n          var interimElement = new InterimElement(options);\n          stack.push(interimElement);\n          return interimElement.show().then(function() {\n            return interimElement.deferred.promise;\n          });\n        }\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#hide\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and resolves the promise returned from `show`\n       *\n       * @param {*} resolveParam Data to resolve the promise with\n       * @returns a Promise that will be resolved after the element has been removed.\n       *\n       */\n      function hide(response) {\n        var interimElement = stack.shift();\n        return interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.resolve(response);\n        });\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#cancel\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and rejects the promise returned from `show`\n       *\n       * @param {*} reason Data to reject the promise with\n       * @returns Promise that will be resolved after the element has been removed.\n       *\n       */\n      function cancel(reason) {\n        var interimElement = stack.shift();\n        return $q.when(interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.reject(reason);\n        }));\n      }\n\n\n      /*\n       * Internal Interim Element Object\n       * Used internally to manage the DOM element and related data\n       */\n      function InterimElement(options) {\n        var self;\n        var hideTimeout, element, showDone, removeDone;\n\n        options = options || {};\n        options = angular.extend({\n          preserveScope: false,\n          scope: options.scope || $rootScope.$new(options.isolateScope),\n          onShow: function(scope, element, options) {\n            return $animate.enter(element, options.parent);\n          },\n          onRemove: function(scope, element, options) {\n            // Element could be undefined if a new element is shown before\n            // the old one finishes compiling.\n            return element && $animate.leave(element) || $q.when();\n          }\n        }, options);\n\n        if (options.template) {\n          options.template = processTemplate(options.template);\n        }\n\n        return self = {\n          options: options,\n          deferred: $q.defer(),\n          show: function() {\n            return showDone = $mdCompiler.compile(options).then(function(compileData) {\n              angular.extend(compileData.locals, self.options);\n\n              element = compileData.link(options.scope);\n\n              // Search for parent at insertion time, if not specified\n              if (angular.isFunction(options.parent)) {\n                options.parent = options.parent(options.scope, element, options);\n              } else if (angular.isString(options.parent)) {\n                options.parent = angular.element($document[0].querySelector(options.parent));\n              }\n\n              // If parent querySelector/getter function fails, or it's just null,\n              // find a default.\n              if (!(options.parent || {}).length) {\n                options.parent = $rootElement.find('body');\n                if (!options.parent.length) options.parent = $rootElement;\n              }\n\n              if (options.themable) $mdTheming(element);\n              var ret = options.onShow(options.scope, element, options);\n              return $q.when(ret)\n                .then(function(){\n                  // Issue onComplete callback when the `show()` finishes\n                  (options.onComplete || angular.noop)(options.scope, element, options);\n                  startHideTimeout();\n                });\n\n              function startHideTimeout() {\n                if (options.hideDelay) {\n                  hideTimeout = $timeout(service.cancel, options.hideDelay) ;\n                }\n              }\n            }, function(reason) { showDone = true; self.deferred.reject(reason); });\n          },\n          cancelTimeout: function() {\n            if (hideTimeout) {\n              $timeout.cancel(hideTimeout);\n              hideTimeout = undefined;\n            }\n          },\n          remove: function() {\n            self.cancelTimeout();\n            return removeDone = $q.when(showDone).then(function() {\n              var ret = element ? options.onRemove(options.scope, element, options) : true;\n              return $q.when(ret).then(function() {\n                if (!options.preserveScope) options.scope.$destroy();\n                removeDone = true;\n              });\n            });\n          }\n        };\n      }\n    };\n\n    /*\n     * Replace `{{` and `}}` in a string (usually a template) with the actual start-/endSymbols used\n     * for interpolation. This allows pre-defined templates (for components such as dialog, toast etc)\n     * to continue to work in apps that use custom interpolation start-/endSymbols.\n     *\n     * @param {string} text The text in which to replace `{{` / `}}`\n     * @returns {string} The modified string using the actual interpolation start-/endSymbols\n     */\n    function replaceInterpolationSymbols(text) {\n      if (!text || !angular.isString(text)) return text;\n      return text.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n    }\n  }\n\n}\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.core.componentRegistry\n   *\n   * @description\n   * A component instance registration service.\n   * Note: currently this as a private service in the SideNav component.\n   */\n  angular.module('material.core')\n    .factory('$mdComponentRegistry', ComponentRegistry);\n\n  /*\n   * @private\n   * @ngdoc factory\n   * @name ComponentRegistry\n   * @module material.core.componentRegistry\n   *\n   */\n  function ComponentRegistry($log, $q) {\n\n    var self;\n    var instances = [ ];\n    var pendings = { };\n\n    return self = {\n      /**\n       * Used to print an error when an instance for a handle isn't found.\n       */\n      notFoundError: function(handle) {\n        $log.error('No instance found for handle', handle);\n      },\n      /**\n       * Return all registered instances as an array.\n       */\n      getInstances: function() {\n        return instances;\n      },\n\n      /**\n       * Get a registered instance.\n       * @param handle the String handle to look up for a registered instance.\n       */\n      get: function(handle) {\n        if ( !isValidID(handle) ) return null;\n\n        var i, j, instance;\n        for(i = 0, j = instances.length; i < j; i++) {\n          instance = instances[i];\n          if(instance.$$mdHandle === handle) {\n            return instance;\n          }\n        }\n        return null;\n      },\n\n      /**\n       * Register an instance.\n       * @param instance the instance to register\n       * @param handle the handle to identify the instance under.\n       */\n      register: function(instance, handle) {\n        if ( !handle ) return angular.noop;\n\n        instance.$$mdHandle = handle;\n        instances.push(instance);\n        resolveWhen();\n\n        return deregister;\n\n        /**\n         * Remove registration for an instance\n         */\n        function deregister() {\n          var index = instances.indexOf(instance);\n          if (index !== -1) {\n            instances.splice(index, 1);\n          }\n        }\n\n        /**\n         * Resolve any pending promises for this instance\n         */\n        function resolveWhen() {\n          var dfd = pendings[handle];\n          if ( dfd ) {\n            dfd.resolve( instance );\n            delete pendings[handle];\n          }\n        }\n      },\n\n      /**\n       * Async accessor to registered component instance\n       * If not available then a promise is created to notify\n       * all listeners when the instance is registered.\n       */\n      when : function(handle) {\n        if ( isValidID(handle) ) {\n          var deferred = $q.defer();\n          var instance = self.get(handle);\n\n          if ( instance )  {\n            deferred.resolve( instance );\n          } else {\n            pendings[handle] = deferred;\n          }\n\n          return deferred.promise;\n        }\n        return $q.reject(\"Invalid `md-component-id` value.\");\n      }\n\n    };\n\n    function isValidID(handle){\n      return handle && (handle !== \"\");\n    }\n\n  }\n  ComponentRegistry.$inject = [\"$log\", \"$q\"];\n\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .factory('$mdInkRipple', InkRippleService)\n  .directive('mdInkRipple', InkRippleDirective)\n  .directive('mdNoInk', attrNoDirective())\n  .directive('mdNoBar', attrNoDirective())\n  .directive('mdNoStretch', attrNoDirective());\n\nfunction InkRippleDirective($mdInkRipple) {\n  return {\n    controller: angular.noop,\n    link: function (scope, element, attr) {\n      if (attr.hasOwnProperty('mdInkRippleCheckbox')) {\n        $mdInkRipple.attachCheckboxBehavior(scope, element);\n      } else {\n        $mdInkRipple.attachButtonBehavior(scope, element);\n      }\n    }\n  };\n}\nInkRippleDirective.$inject = [\"$mdInkRipple\"];\n\nfunction InkRippleService($window, $timeout) {\n\n  return {\n    attachButtonBehavior: attachButtonBehavior,\n    attachCheckboxBehavior: attachCheckboxBehavior,\n    attachTabBehavior: attachTabBehavior,\n    attach: attach\n  };\n\n  function attachButtonBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      isFAB: element.hasClass('md-fab'),\n      isMenuItem: element.hasClass('md-menu-item'),\n      center: false,\n      dimBackground: true\n    }, options));\n  }\n\n  function attachCheckboxBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: true,\n      dimBackground: false,\n      fitRipple: true\n    }, options));\n  }\n\n  function attachTabBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: false,\n      dimBackground: true,\n      outline: true\n    }, options));\n  }\n\n  function attach(scope, element, options) {\n    if (element.controller('mdNoInk')) return angular.noop;\n\n    options = angular.extend({\n      colorElement: element,\n      mousedown: true,\n      hover: true,\n      focus: true,\n      center: false,\n      mousedownPauseTime: 150,\n      dimBackground: false,\n      outline: false,\n      isFAB: false,\n      isMenuItem: false,\n      fitRipple: false\n    }, options);\n\n    var rippleSize,\n        controller = element.controller('mdInkRipple') || {},\n        counter = 0,\n        ripples = [],\n        states = [],\n        isActiveExpr = element.attr('md-highlight'),\n        isActive = false,\n        isHeld = false,\n        node = element[0],\n        rippleSizeSetting = element.attr('md-ripple-size'),\n        color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n    switch (rippleSizeSetting) {\n      case 'full':\n        options.isFAB = true;\n        break;\n      case 'partial':\n        options.isFAB = false;\n        break;\n    }\n\n    // expose onInput for ripple testing\n    if (options.mousedown) {\n      element.on('$md.pressdown', onPressDown)\n        .on('$md.pressup', onPressUp);\n    }\n\n    controller.createRipple = createRipple;\n\n    if (isActiveExpr) {\n      scope.$watch(isActiveExpr, function watchActive(newValue) {\n        isActive = newValue;\n        if (isActive && !ripples.length) {\n          $timeout(function () { createRipple(0, 0); }, 0, false);\n        }\n        angular.forEach(ripples, updateElement);\n      });\n    }\n\n    // Publish self-detach method if desired...\n    return function detach() {\n      element.off('$md.pressdown', onPressDown)\n        .off('$md.pressup', onPressUp);\n      getRippleContainer().remove();\n    };\n\n    /**\n     * Gets the current ripple container\n     * If there is no ripple container, it creates one and returns it\n     *\n     * @returns {angular.element} ripple container element\n     */\n    function getRippleContainer() {\n      var container = element.data('$mdRippleContainer');\n      if (container) return container;\n      container = angular.element('<div class=\"md-ripple-container\">');\n      element.append(container);\n      element.data('$mdRippleContainer', container);\n      return container;\n    }\n\n    function parseColor(color) {\n      if (!color) return;\n      if (color.indexOf('rgba') === 0) return color.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/, '0.1)');\n      if (color.indexOf('rgb')  === 0) return rgbToRGBA(color);\n      if (color.indexOf('#')    === 0) return hexToRGBA(color);\n\n      /**\n       * Converts a hex value to an rgba string\n       *\n       * @param {string} hex value (3 or 6 digits) to be converted\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function hexToRGBA(color) {\n        var hex = color.charAt(0) === '#' ? color.substr(1) : color,\n          dig = hex.length / 3,\n          red = hex.substr(0, dig),\n          grn = hex.substr(dig, dig),\n          blu = hex.substr(dig * 2);\n        if (dig === 1) {\n          red += red;\n          grn += grn;\n          blu += blu;\n        }\n        return 'rgba(' + parseInt(red, 16) + ',' + parseInt(grn, 16) + ',' + parseInt(blu, 16) + ',0.1)';\n      }\n\n      /**\n       * Converts rgb value to rgba string\n       *\n       * @param {string} rgb color string\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function rgbToRGBA(color) {\n        return color.replace(')', ', 0.1)').replace('(', 'a(');\n      }\n\n    }\n\n    function removeElement(elem, wait) {\n      ripples.splice(ripples.indexOf(elem), 1);\n      if (ripples.length === 0) {\n        getRippleContainer().css({ backgroundColor: '' });\n      }\n      $timeout(function () { elem.remove(); }, wait, false);\n    }\n\n    function updateElement(elem) {\n      var index = ripples.indexOf(elem),\n          state = states[index] || {},\n          elemIsActive = ripples.length > 1 ? false : isActive,\n          elemIsHeld   = ripples.length > 1 ? false : isHeld;\n      if (elemIsActive || state.animating || elemIsHeld) {\n        elem.addClass('md-ripple-visible');\n      } else if (elem) {\n        elem.removeClass('md-ripple-visible');\n        if (options.outline) {\n          elem.css({\n            width: rippleSize + 'px',\n            height: rippleSize + 'px',\n            marginLeft: (rippleSize * -1) + 'px',\n            marginTop: (rippleSize * -1) + 'px'\n          });\n        }\n        removeElement(elem, options.outline ? 450 : 650);\n      }\n    }\n\n    /**\n     * Creates a ripple at the provided coordinates\n     *\n     * @param {number} left cursor position\n     * @param {number} top cursor position\n     *\n     * @returns {angular.element} the generated ripple element\n     */\n    function createRipple(left, top) {\n\n      color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n      var container = getRippleContainer(),\n          size = getRippleSize(left, top),\n          css = getRippleCss(size, left, top),\n          elem = getRippleElement(css),\n          index = ripples.indexOf(elem),\n          state = states[index] || {};\n\n      rippleSize = size;\n\n      state.animating = true;\n\n      $timeout(function () {\n        if (options.dimBackground) {\n          container.css({ backgroundColor: color });\n        }\n        elem.addClass('md-ripple-placed md-ripple-scaled');\n        if (options.outline) {\n          elem.css({\n            borderWidth: (size * 0.5) + 'px',\n            marginLeft: (size * -0.5) + 'px',\n            marginTop: (size * -0.5) + 'px'\n          });\n        } else {\n          elem.css({ left: '50%', top: '50%' });\n        }\n        updateElement(elem);\n        $timeout(function () {\n          state.animating = false;\n          updateElement(elem);\n        }, (options.outline ? 450 : 225), false);\n      }, 0, false);\n\n      return elem;\n\n      /**\n       * Creates the ripple element with the provided css\n       *\n       * @param {object} css properties to be applied\n       *\n       * @returns {angular.element} the generated ripple element\n       */\n      function getRippleElement(css) {\n        var elem = angular.element('<div class=\"md-ripple\" data-counter=\"' + counter++ + '\">');\n        ripples.unshift(elem);\n        states.unshift({ animating: true });\n        container.append(elem);\n        css && elem.css(css);\n        return elem;\n      }\n\n      /**\n       * Calculate the ripple size\n       *\n       * @returns {number} calculated ripple diameter\n       */\n      function getRippleSize(left, top) {\n        var width = container.prop('offsetWidth'),\n            height = container.prop('offsetHeight'),\n            multiplier, size, rect;\n        if (options.isMenuItem) {\n          size = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else if (options.outline) {\n          rect = node.getBoundingClientRect();\n          left -= rect.left;\n          top -= rect.top;\n          width = Math.max(left, width - left);\n          height = Math.max(top, height - top);\n          size = 2 * Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else {\n          multiplier = options.isFAB ? 1.1 : 0.8;\n          size = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) * multiplier;\n          if (options.fitRipple) {\n            size = Math.min(height, width, size);\n          }\n        }\n        return size;\n      }\n\n      /**\n       * Generates the ripple css\n       *\n       * @param {number} the diameter of the ripple\n       * @param {number} the left cursor offset\n       * @param {number} the top cursor offset\n       *\n       * @returns {{backgroundColor: *, width: string, height: string, marginLeft: string, marginTop: string}}\n       */\n      function getRippleCss(size, left, top) {\n        var rect,\n            css = {\n              backgroundColor: rgbaToRGB(color),\n              borderColor: rgbaToRGB(color),\n              width: size + 'px',\n              height: size + 'px'\n            };\n\n        if (options.outline) {\n          css.width = 0;\n          css.height = 0;\n        } else {\n          css.marginLeft = css.marginTop = (size * -0.5) + 'px';\n        }\n\n        if (options.center) {\n          css.left = css.top = '50%';\n        } else {\n          rect = node.getBoundingClientRect();\n          css.left = Math.round((left - rect.left) / container.prop('offsetWidth') * 100) + '%';\n          css.top = Math.round((top - rect.top) / container.prop('offsetHeight') * 100) + '%';\n        }\n\n        return css;\n\n        /**\n         * Converts rgba string to rgb, removing the alpha value\n         *\n         * @param {string} rgba color\n         *\n         * @returns {string} rgb color\n         */\n        function rgbaToRGB(color) {\n          return color.replace('rgba', 'rgb').replace(/,[^\\)\\,]+\\)/, ')');\n        }\n      }\n    }\n\n    /**\n     * Handles user input start and stop events\n     *\n     */\n    function onPressDown(ev) {\n      if (!isRippleAllowed()) return;\n\n      var ripple = createRipple(ev.pointer.x, ev.pointer.y);\n      isHeld = true;\n    }\n    function onPressUp(ev) {\n      isHeld = false;\n      var ripple = ripples[ ripples.length - 1 ];\n      $timeout(function () { updateElement(ripple); }, 0, false);\n    }\n\n    /**\n     * Determines if the ripple is allowed\n     *\n     * @returns {boolean} true if the ripple is allowed, false if not\n     */\n    function isRippleAllowed() {\n      var parent = node.parentNode;\n      var grandparent = parent && parent.parentNode;\n      var ancestor = grandparent && grandparent.parentNode;\n      return !isDisabled(node) && !isDisabled(parent) && !isDisabled(grandparent) && !isDisabled(ancestor);\n      function isDisabled (elem) {\n        return elem && elem.hasAttribute && elem.hasAttribute('disabled');\n      }\n    }\n\n  }\n}\nInkRippleService.$inject = [\"$window\", \"$timeout\"];\n\n/**\n * noink/nobar/nostretch directive: make any element that has one of\n * these attributes be given a controller, so that other directives can\n * `require:` these and see if there is a `no<xxx>` parent attribute.\n *\n * @usage\n * <hljs lang=\"html\">\n * <parent md-no-ink>\n *   <child detect-no>\n *   </child>\n * </parent>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * myApp.directive('detectNo', function() {\n *   return {\n *     require: ['^?mdNoInk', ^?mdNoBar'],\n *     link: function(scope, element, attr, ctrls) {\n *       var noinkCtrl = ctrls[0];\n *       var nobarCtrl = ctrls[1];\n *       if (noInkCtrl) {\n *         alert(\"the md-no-ink flag has been specified on an ancestor!\");\n *       }\n *       if (nobarCtrl) {\n *         alert(\"the md-no-bar flag has been specified on an ancestor!\");\n *       }\n *     }\n *   };\n * });\n * </hljs>\n */\nfunction attrNoDirective() {\n  return function() {\n    return {\n      controller: angular.noop\n    };\n  };\n}\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core.theming.palette', [])\n.constant('$mdColorPalette', {\n  'red': {\n    '50': '#ffebee',\n    '100': '#ffcdd2',\n    '200': '#ef9a9a',\n    '300': '#e57373',\n    '400': '#ef5350',\n    '500': '#f44336',\n    '600': '#e53935',\n    '700': '#d32f2f',\n    '800': '#c62828',\n    '900': '#b71c1c',\n    'A100': '#ff8a80',\n    'A200': '#ff5252',\n    'A400': '#ff1744',\n    'A700': '#d50000',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n  },\n  'pink': {\n    '50': '#fce4ec',\n    '100': '#f8bbd0',\n    '200': '#f48fb1',\n    '300': '#f06292',\n    '400': '#ec407a',\n    '500': '#e91e63',\n    '600': '#d81b60',\n    '700': '#c2185b',\n    '800': '#ad1457',\n    '900': '#880e4f',\n    'A100': '#ff80ab',\n    'A200': '#ff4081',\n    'A400': '#f50057',\n    'A700': '#c51162',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 A200 A400 A700'\n  },\n  'purple': {\n    '50': '#f3e5f5',\n    '100': '#e1bee7',\n    '200': '#ce93d8',\n    '300': '#ba68c8',\n    '400': '#ab47bc',\n    '500': '#9c27b0',\n    '600': '#8e24aa',\n    '700': '#7b1fa2',\n    '800': '#6a1b9a',\n    '900': '#4a148c',\n    'A100': '#ea80fc',\n    'A200': '#e040fb',\n    'A400': '#d500f9',\n    'A700': '#aa00ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400 A700'\n  },\n  'deep-purple': {\n    '50': '#ede7f6',\n    '100': '#d1c4e9',\n    '200': '#b39ddb',\n    '300': '#9575cd',\n    '400': '#7e57c2',\n    '500': '#673ab7',\n    '600': '#5e35b1',\n    '700': '#512da8',\n    '800': '#4527a0',\n    '900': '#311b92',\n    'A100': '#b388ff',\n    'A200': '#7c4dff',\n    'A400': '#651fff',\n    'A700': '#6200ea',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200'\n  },\n  'indigo': {\n    '50': '#e8eaf6',\n    '100': '#c5cae9',\n    '200': '#9fa8da',\n    '300': '#7986cb',\n    '400': '#5c6bc0',\n    '500': '#3f51b5',\n    '600': '#3949ab',\n    '700': '#303f9f',\n    '800': '#283593',\n    '900': '#1a237e',\n    'A100': '#8c9eff',\n    'A200': '#536dfe',\n    'A400': '#3d5afe',\n    'A700': '#304ffe',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400'\n  },\n  'blue': {\n    '50': '#e3f2fd',\n    '100': '#bbdefb',\n    '200': '#90caf9',\n    '300': '#64b5f6',\n    '400': '#42a5f5',\n    '500': '#2196f3',\n    '600': '#1e88e5',\n    '700': '#1976d2',\n    '800': '#1565c0',\n    '900': '#0d47a1',\n    'A100': '#82b1ff',\n    'A200': '#448aff',\n    'A400': '#2979ff',\n    'A700': '#2962ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n  },\n  'light-blue': {\n    '50': '#e1f5fe',\n    '100': '#b3e5fc',\n    '200': '#81d4fa',\n    '300': '#4fc3f7',\n    '400': '#29b6f6',\n    '500': '#03a9f4',\n    '600': '#039be5',\n    '700': '#0288d1',\n    '800': '#0277bd',\n    '900': '#01579b',\n    'A100': '#80d8ff',\n    'A200': '#40c4ff',\n    'A400': '#00b0ff',\n    'A700': '#0091ea',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900 A700',\n    'contrastStrongLightColors': '500 600 700 800 A700'\n  },\n  'cyan': {\n    '50': '#e0f7fa',\n    '100': '#b2ebf2',\n    '200': '#80deea',\n    '300': '#4dd0e1',\n    '400': '#26c6da',\n    '500': '#00bcd4',\n    '600': '#00acc1',\n    '700': '#0097a7',\n    '800': '#00838f',\n    '900': '#006064',\n    'A100': '#84ffff',\n    'A200': '#18ffff',\n    'A400': '#00e5ff',\n    'A700': '#00b8d4',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700 800'\n  },\n  'teal': {\n    '50': '#e0f2f1',\n    '100': '#b2dfdb',\n    '200': '#80cbc4',\n    '300': '#4db6ac',\n    '400': '#26a69a',\n    '500': '#009688',\n    '600': '#00897b',\n    '700': '#00796b',\n    '800': '#00695c',\n    '900': '#004d40',\n    'A100': '#a7ffeb',\n    'A200': '#64ffda',\n    'A400': '#1de9b6',\n    'A700': '#00bfa5',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'green': {\n    '50': '#e8f5e9',\n    '100': '#c8e6c9',\n    '200': '#a5d6a7',\n    '300': '#81c784',\n    '400': '#66bb6a',\n    '500': '#4caf50',\n    '600': '#43a047',\n    '700': '#388e3c',\n    '800': '#2e7d32',\n    '900': '#1b5e20',\n    'A100': '#b9f6ca',\n    'A200': '#69f0ae',\n    'A400': '#00e676',\n    'A700': '#00c853',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'light-green': {\n    '50': '#f1f8e9',\n    '100': '#dcedc8',\n    '200': '#c5e1a5',\n    '300': '#aed581',\n    '400': '#9ccc65',\n    '500': '#8bc34a',\n    '600': '#7cb342',\n    '700': '#689f38',\n    '800': '#558b2f',\n    '900': '#33691e',\n    'A100': '#ccff90',\n    'A200': '#b2ff59',\n    'A400': '#76ff03',\n    'A700': '#64dd17',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900',\n    'contrastStrongLightColors': '800 900'\n  },\n  'lime': {\n    '50': '#f9fbe7',\n    '100': '#f0f4c3',\n    '200': '#e6ee9c',\n    '300': '#dce775',\n    '400': '#d4e157',\n    '500': '#cddc39',\n    '600': '#c0ca33',\n    '700': '#afb42b',\n    '800': '#9e9d24',\n    '900': '#827717',\n    'A100': '#f4ff81',\n    'A200': '#eeff41',\n    'A400': '#c6ff00',\n    'A700': '#aeea00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '900',\n    'contrastStrongLightColors': '900'\n  },\n  'yellow': {\n    '50': '#fffde7',\n    '100': '#fff9c4',\n    '200': '#fff59d',\n    '300': '#fff176',\n    '400': '#ffee58',\n    '500': '#ffeb3b',\n    '600': '#fdd835',\n    '700': '#fbc02d',\n    '800': '#f9a825',\n    '900': '#f57f17',\n    'A100': '#ffff8d',\n    'A200': '#ffff00',\n    'A400': '#ffea00',\n    'A700': '#ffd600',\n    'contrastDefaultColor': 'dark'\n  },\n  'amber': {\n    '50': '#fff8e1',\n    '100': '#ffecb3',\n    '200': '#ffe082',\n    '300': '#ffd54f',\n    '400': '#ffca28',\n    '500': '#ffc107',\n    '600': '#ffb300',\n    '700': '#ffa000',\n    '800': '#ff8f00',\n    '900': '#ff6f00',\n    'A100': '#ffe57f',\n    'A200': '#ffd740',\n    'A400': '#ffc400',\n    'A700': '#ffab00',\n    'contrastDefaultColor': 'dark'\n  },\n  'orange': {\n    '50': '#fff3e0',\n    '100': '#ffe0b2',\n    '200': '#ffcc80',\n    '300': '#ffb74d',\n    '400': '#ffa726',\n    '500': '#ff9800',\n    '600': '#fb8c00',\n    '700': '#f57c00',\n    '800': '#ef6c00',\n    '900': '#e65100',\n    'A100': '#ffd180',\n    'A200': '#ffab40',\n    'A400': '#ff9100',\n    'A700': '#ff6d00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900',\n    'contrastStrongLightColors': '800 900'\n  },\n  'deep-orange': {\n    '50': '#fbe9e7',\n    '100': '#ffccbc',\n    '200': '#ffab91',\n    '300': '#ff8a65',\n    '400': '#ff7043',\n    '500': '#ff5722',\n    '600': '#f4511e',\n    '700': '#e64a19',\n    '800': '#d84315',\n    '900': '#bf360c',\n    'A100': '#ff9e80',\n    'A200': '#ff6e40',\n    'A400': '#ff3d00',\n    'A700': '#dd2c00',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100 A200',\n    'contrastStrongLightColors': '500 600 700 800 900 A400 A700'\n  },\n  'brown': {\n    '50': '#efebe9',\n    '100': '#d7ccc8',\n    '200': '#bcaaa4',\n    '300': '#a1887f',\n    '400': '#8d6e63',\n    '500': '#795548',\n    '600': '#6d4c41',\n    '700': '#5d4037',\n    '800': '#4e342e',\n    '900': '#3e2723',\n    'A100': '#d7ccc8',\n    'A200': '#bcaaa4',\n    'A400': '#8d6e63',\n    'A700': '#5d4037',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200',\n    'contrastStrongLightColors': '300 400'\n  },\n  'grey': {\n    '0': '#ffffff',\n    '50': '#fafafa',\n    '100': '#f5f5f5',\n    '200': '#eeeeee',\n    '300': '#e0e0e0',\n    '400': '#bdbdbd',\n    '500': '#9e9e9e',\n    '600': '#757575',\n    '700': '#616161',\n    '800': '#424242',\n    '900': '#212121',\n    '1000': '#000000',\n    'A100': '#ffffff',\n    'A200': '#eeeeee',\n    'A400': '#bdbdbd',\n    'A700': '#616161',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '600 700 800 900'\n  },\n  'blue-grey': {\n    '50': '#eceff1',\n    '100': '#cfd8dc',\n    '200': '#b0bec5',\n    '300': '#90a4ae',\n    '400': '#78909c',\n    '500': '#607d8b',\n    '600': '#546e7a',\n    '700': '#455a64',\n    '800': '#37474f',\n    '900': '#263238',\n    'A100': '#cfd8dc',\n    'A200': '#b0bec5',\n    'A400': '#78909c',\n    'A700': '#455a64',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300',\n    'contrastStrongLightColors': '400 500'\n  }\n});\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.core.theming', ['material.core.theming.palette'])\n  .directive('mdTheme', ThemingDirective)\n  .directive('mdThemable', ThemableDirective)\n  .provider('$mdTheming', ThemingProvider)\n  .run(generateThemes);\n\n/**\n * @ngdoc provider\n * @name $mdThemingProvider\n * @module material.core\n *\n * @description Provider to configure the `$mdTheming` service.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#setDefaultTheme\n * @param {string} themeName Default theme name to be applied to elements. Default value is `default`.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#alwaysWatchTheme\n * @param {boolean} watch Whether or not to always watch themes for changes and re-apply\n * classes when they change. Default is `false`. Enabling can reduce performance.\n */\n\n// In memory storage of defined themes and color palettes (both loaded by CSS, and user specified)\nvar PALETTES;\nvar THEMES;\nvar themingProvider;\nvar generationIsDone;\n\nvar DARK_FOREGROUND = {\n  name: 'dark',\n  '1': 'rgba(0,0,0,0.87)',\n  '2': 'rgba(0,0,0,0.54)',\n  '3': 'rgba(0,0,0,0.26)',\n  '4': 'rgba(0,0,0,0.12)'\n};\nvar LIGHT_FOREGROUND = {\n  name: 'light',\n  '1': 'rgba(255,255,255,1.0)',\n  '2': 'rgba(255,255,255,0.7)',\n  '3': 'rgba(255,255,255,0.3)',\n  '4': 'rgba(255,255,255,0.12)'\n};\n\nvar DARK_SHADOW = '1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)';\nvar LIGHT_SHADOW = '';\n\nvar DARK_CONTRAST_COLOR = colorToRgbaArray('rgba(0,0,0,0.87)');\nvar LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgba(255,255,255,0.87');\nvar STRONG_LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgb(255,255,255)');\n\nvar THEME_COLOR_TYPES = ['primary', 'accent', 'warn', 'background'];\nvar DEFAULT_COLOR_TYPE = 'primary';\n\n// A color in a theme will use these hues by default, if not specified by user.\nvar LIGHT_DEFAULT_HUES = {\n  'accent': {\n    'default': 'A200',\n    'hue-1': 'A100',\n    'hue-2': 'A400',\n    'hue-3': 'A700'\n  }\n};\nvar DARK_DEFAULT_HUES = {\n  'background': {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '600',\n    'hue-3': '800'\n  }\n};\nTHEME_COLOR_TYPES.forEach(function(colorType) {\n  // Color types with unspecified default hues will use these default hue values\n  var defaultDefaultHues = {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '800',\n    'hue-3': 'A100'\n  };\n  if (!LIGHT_DEFAULT_HUES[colorType]) LIGHT_DEFAULT_HUES[colorType] = defaultDefaultHues;\n  if (!DARK_DEFAULT_HUES[colorType]) DARK_DEFAULT_HUES[colorType] = defaultDefaultHues;\n});\n\nvar VALID_HUE_VALUES = [\n  '50', '100', '200', '300', '400', '500', '600',\n  '700', '800', '900', 'A100', 'A200', 'A400', 'A700'\n];\n\nfunction ThemingProvider($mdColorPalette) {\n  PALETTES = {};\n  THEMES = {};\n  var defaultTheme = 'default';\n  var alwaysWatchTheme = false;\n\n  // Load JS Defined Palettes\n  angular.extend(PALETTES, $mdColorPalette);\n\n  // Default theme defined in core.js\n\n  ThemingService.$inject = [\"$rootScope\", \"$log\"];\n  return themingProvider = {\n    definePalette: definePalette,\n    extendPalette: extendPalette,\n    theme: registerTheme,\n\n    setDefaultTheme: function(theme) {\n      defaultTheme = theme;\n    },\n    alwaysWatchTheme: function(alwaysWatch) {\n      alwaysWatchTheme = alwaysWatch;\n    },\n    $get: ThemingService,\n    _LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,\n    _DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,\n    _PALETTES: PALETTES,\n    _THEMES: THEMES,\n    _parseRules: parseRules,\n    _rgba: rgba\n  };\n\n  // Example: $mdThemingProvider.definePalette('neonRed', { 50: '#f5fafa', ... });\n  function definePalette(name, map) {\n    map = map || {};\n    PALETTES[name] = checkPaletteValid(name, map);\n    return themingProvider;\n  }\n\n  // Returns an new object which is a copy of a given palette `name` with variables from\n  // `map` overwritten\n  // Example: var neonRedMap = $mdThemingProvider.extendPalette('red', { 50: '#f5fafafa' });\n  function extendPalette(name, map) {\n    return checkPaletteValid(name,  angular.extend({}, PALETTES[name] || {}, map) );\n  }\n\n  // Make sure that palette has all required hues\n  function checkPaletteValid(name, map) {\n    var missingColors = VALID_HUE_VALUES.filter(function(field) {\n      return !map[field];\n    });\n    if (missingColors.length) {\n      throw new Error(\"Missing colors %1 in palette %2!\"\n                      .replace('%1', missingColors.join(', '))\n                      .replace('%2', name));\n    }\n\n    return map;\n  }\n\n  // Register a theme (which is a collection of color palettes to use with various states\n  // ie. warn, accent, primary )\n  // Optionally inherit from an existing theme\n  // $mdThemingProvider.theme('custom-theme').primaryPalette('red');\n  function registerTheme(name, inheritFrom) {\n    inheritFrom = inheritFrom || 'default';\n    if (THEMES[name]) return THEMES[name];\n\n    var parentTheme = typeof inheritFrom === 'string' ? THEMES[inheritFrom] : inheritFrom;\n    var theme = new Theme(name);\n\n    if (parentTheme) {\n      angular.forEach(parentTheme.colors, function(color, colorType) {\n        theme.colors[colorType] = {\n          name: color.name,\n          // Make sure a COPY of the hues is given to the child color,\n          // not the same reference.\n          hues: angular.extend({}, color.hues)\n        };\n      });\n    }\n    THEMES[name] = theme;\n\n    return theme;\n  }\n\n  function Theme(name) {\n    var self = this;\n    self.name = name;\n    self.colors = {};\n\n    self.dark = setDark;\n    setDark(false);\n\n    function setDark(isDark) {\n      isDark = arguments.length === 0 ? true : !!isDark;\n\n      // If no change, abort\n      if (isDark === self.isDark) return;\n\n      self.isDark = isDark;\n\n      self.foregroundPalette = self.isDark ? LIGHT_FOREGROUND : DARK_FOREGROUND;\n      self.foregroundShadow = self.isDark ? DARK_SHADOW : LIGHT_SHADOW;\n      \n      // Light and dark themes have different default hues.\n      // Go through each existing color type for this theme, and for every\n      // hue value that is still the default hue value from the previous light/dark setting,\n      // set it to the default hue value from the new light/dark setting.\n      var newDefaultHues = self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES;\n      var oldDefaultHues = self.isDark ? LIGHT_DEFAULT_HUES : DARK_DEFAULT_HUES;\n      angular.forEach(newDefaultHues, function(newDefaults, colorType) {\n        var color = self.colors[colorType];\n        var oldDefaults = oldDefaultHues[colorType];\n        if (color) {\n          for (var hueName in color.hues) {\n            if (color.hues[hueName] === oldDefaults[hueName]) {\n              color.hues[hueName] = newDefaults[hueName];\n            }\n          }\n        }\n      });\n\n      return self;\n    }\n\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      var defaultHues = (self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES)[colorType];\n      self[colorType + 'Palette'] = function setPaletteType(paletteName, hues) {\n        var color = self.colors[colorType] = {\n          name: paletteName,\n          hues: angular.extend({}, defaultHues, hues)\n        };\n\n        Object.keys(color.hues).forEach(function(name) {\n          if (!defaultHues[name]) {\n            throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\"\n              .replace('%1', name)\n              .replace('%2', self.name)\n              .replace('%3', paletteName)\n              .replace('%4', Object.keys(defaultHues).join(', '))\n            );\n          }\n        });\n        Object.keys(color.hues).map(function(key) {\n          return color.hues[key];\n        }).forEach(function(hueValue) {\n          if (VALID_HUE_VALUES.indexOf(hueValue) == -1) {\n            throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\"\n              .replace('%1', hueValue)\n              .replace('%2', self.name)\n              .replace('%3', colorType)\n              .replace('%4', paletteName)\n              .replace('%5', VALID_HUE_VALUES.join(', '))\n            );\n          }\n        });\n        return self;\n      };\n\n      self[colorType + 'Color'] = function() {\n        var args = Array.prototype.slice.call(arguments);\n        console.warn('$mdThemingProviderTheme.' + colorType + 'Color() has been deprecated. ' +\n                     'Use $mdThemingProviderTheme.' + colorType + 'Palette() instead.');\n        return self[colorType + 'Palette'].apply(self, args);\n      };\n    });\n  }\n\n  /**\n   * @ngdoc service\n   * @name $mdTheming\n   *\n   * @description\n   *\n   * Service that makes an element apply theming related classes to itself.\n   *\n   * ```js\n   * app.directive('myFancyDirective', function($mdTheming) {\n   *   return {\n   *     restrict: 'e',\n   *     link: function(scope, el, attrs) {\n   *       $mdTheming(el);\n   *     }\n   *   };\n   * });\n   * ```\n   * @param {el=} element to apply theming to\n   */\n  /* @ngInject */\n  function ThemingService($rootScope, $log) {\n    applyTheme.inherit = function(el, parent) {\n      var ctrl = parent.controller('mdTheme');\n\n      var attrThemeValue = el.attr('md-theme-watch');\n      if ( (alwaysWatchTheme || angular.isDefined(attrThemeValue)) && attrThemeValue != 'false') {\n        var deregisterWatch = $rootScope.$watch(function() {\n          return ctrl && ctrl.$mdTheme || defaultTheme;\n        }, changeTheme);\n        el.on('$destroy', deregisterWatch);\n      } else {\n        var theme = ctrl && ctrl.$mdTheme || defaultTheme;\n        changeTheme(theme);\n      }\n\n      function changeTheme(theme) {\n        if (!registered(theme)) {\n          $log.warn('Attempted to use unregistered theme \\'' + theme + '\\'. ' +\n                    'Register it with $mdThemingProvider.theme().');\n        }\n        var oldTheme = el.data('$mdThemeName');\n        if (oldTheme) el.removeClass('md-' + oldTheme +'-theme');\n        el.addClass('md-' + theme + '-theme');\n        el.data('$mdThemeName', theme);\n      }\n    };\n\n    applyTheme.registered = registered;\n    applyTheme.defaultTheme = function() {\n      return defaultTheme;\n    };\n\n    return applyTheme;\n\n    function registered(theme) {\n      if (theme === undefined || theme === '') return true;\n      return THEMES[theme] !== undefined;\n    }\n\n    function applyTheme(scope, el) {\n      // Allow us to be invoked via a linking function signature.\n      if (el === undefined) {\n        el = scope;\n        scope = undefined;\n      }\n      if (scope === undefined) {\n        scope = $rootScope;\n      }\n      applyTheme.inherit(el, el);\n    }\n  }\n}\nThemingProvider.$inject = [\"$mdColorPalette\"];\n\nfunction ThemingDirective($mdTheming, $interpolate, $log) {\n  return {\n    priority: 100,\n    link: {\n      pre: function(scope, el, attrs) {\n        var ctrl = {\n          $setTheme: function(theme) {\n            if (!$mdTheming.registered(theme)) {\n              $log.warn('attempted to use unregistered theme \\'' + theme + '\\'');\n            }\n            ctrl.$mdTheme = theme;\n          }\n        };\n        el.data('$mdThemeController', ctrl);\n        ctrl.$setTheme($interpolate(attrs.mdTheme)(scope));\n        attrs.$observe('mdTheme', ctrl.$setTheme);\n      }\n    }\n  };\n}\nThemingDirective.$inject = [\"$mdTheming\", \"$interpolate\", \"$log\"];\n\nfunction ThemableDirective($mdTheming) {\n  return $mdTheming;\n}\nThemableDirective.$inject = [\"$mdTheming\"];\n\nfunction parseRules(theme, colorType, rules) {\n  checkValidPalette(theme, colorType);\n\n  rules = rules.replace(/THEME_NAME/g, theme.name);\n  var generatedRules = [];\n  var color = theme.colors[colorType];\n\n  var themeNameRegex = new RegExp('.md-' + theme.name + '-theme', 'g');\n  // Matches '{{ primary-color }}', etc\n  var hueRegex = new RegExp('(\\'|\")?{{\\\\s*(' + colorType + ')-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|\\')?','g');\n  var simpleVariableRegex = /'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow)-?(\\d\\.?\\d*)?\\s*\\}\\}'?\"?/g;\n  var palette = PALETTES[color.name];\n\n  // find and replace simple variables where we use a specific hue, not angentire palette\n  // eg. \"{{primary-100}}\"\n  //\\(' + THEME_COLOR_TYPES.join('\\|') + '\\)'\n  rules = rules.replace(simpleVariableRegex, function(match, colorType, hue, opacity) {\n    if (colorType === 'foreground') {\n      if (hue == 'shadow') {\n        return theme.foregroundShadow;\n      } else {\n        return theme.foregroundPalette[hue] || theme.foregroundPalette['1'];\n      }\n    }\n    if (hue.indexOf('hue') === 0) {\n      hue = theme.colors[colorType].hues[hue];\n    }\n    return rgba( (PALETTES[ theme.colors[colorType].name ][hue] || '').value, opacity );\n  });\n\n  // For each type, generate rules for each hue (ie. default, md-hue-1, md-hue-2, md-hue-3)\n  angular.forEach(color.hues, function(hueValue, hueName) {\n    var newRule = rules\n      .replace(hueRegex, function(match, _, colorType, hueType, opacity) {\n        return rgba(palette[hueValue][hueType === 'color' ? 'value' : 'contrast'], opacity);\n      });\n    if (hueName !== 'default') {\n      newRule = newRule.replace(themeNameRegex, '.md-' + theme.name + '-theme.md-' + hueName);\n    }\n    generatedRules.push(newRule);\n  });\n\n  return generatedRules.join('');\n}\n\n// Generate our themes at run time given the state of THEMES and PALETTES\nfunction generateThemes($injector) {\n  var themeCss = $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';\n\n  // MD_THEME_CSS is a string generated by the build process that includes all the themable\n  // components as templates\n\n  // Expose contrast colors for palettes to ensure that text is always readable\n  angular.forEach(PALETTES, sanitizePalette);\n\n  // Break the CSS into individual rules\n  var rules = themeCss.split(/\\}(?!(\\}|'|\"|;))/)\n    .filter(function(rule) { return rule && rule.length; })\n    .map(function(rule) { return rule.trim() + '}'; });\n\n  var rulesByType = {};\n  THEME_COLOR_TYPES.forEach(function(type) {\n    rulesByType[type] = '';\n  });\n  var ruleMatchRegex = new RegExp('md-(' + THEME_COLOR_TYPES.join('|') + ')', 'g');\n\n  // Sort the rules based on type, allowing us to do color substitution on a per-type basis\n  rules.forEach(function(rule) {\n    var match = rule.match(ruleMatchRegex);\n    // First: test that if the rule has '.md-accent', it goes into the accent set of rules\n    for (var i = 0, type; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf('.md-' + type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // If no eg 'md-accent' class is found, try to just find 'accent' in the rule and guess from\n    // there\n    for (i = 0; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf(type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // Default to the primary array\n    return rulesByType[DEFAULT_COLOR_TYPE] += rule;\n  });\n\n  var styleString = '';\n\n  // For each theme, use the color palettes specified for `primary`, `warn` and `accent`\n  // to generate CSS rules.\n  angular.forEach(THEMES, function(theme) {\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      styleString += parseRules(theme, colorType, rulesByType[colorType] + '');\n    });\n    if (theme.colors.primary.name == theme.colors.accent.name) {\n      console.warn(\"$mdThemingProvider: Using the same palette for primary and\" +\n                   \" accent. This violates the material design spec.\");\n    }\n  });\n\n  // Insert our newly minted styles into the DOM\n  if (!generationIsDone) {\n    var style = document.createElement('style');\n    style.innerHTML = styleString;\n    var head = document.getElementsByTagName('head')[0];\n    head.insertBefore(style, head.firstElementChild);\n    generationIsDone = true;\n  }\n\n  // The user specifies a 'default' contrast color as either light or dark,\n  // then explicitly lists which hues are the opposite contrast (eg. A100 has dark, A200 has light)\n  function sanitizePalette(palette) {\n    var defaultContrast = palette.contrastDefaultColor;\n    var lightColors = palette.contrastLightColors || [];\n    var strongLightColors = palette.contrastStrongLightColors || [];\n    var darkColors = palette.contrastDarkColors || [];\n\n    // These colors are provided as space-separated lists\n    if (typeof lightColors === 'string') lightColors = lightColors.split(' ');\n    if (typeof strongLightColors === 'string') strongLightColors = strongLightColors.split(' ');\n    if (typeof darkColors === 'string') darkColors = darkColors.split(' ');\n\n    // Cleanup after ourselves\n    delete palette.contrastDefaultColor;\n    delete palette.contrastLightColors;\n    delete palette.contrastStrongLightColors;\n    delete palette.contrastDarkColors;\n\n    // Change { 'A100': '#fffeee' } to { 'A100': { value: '#fffeee', contrast:DARK_CONTRAST_COLOR }\n    angular.forEach(palette, function(hueValue, hueName) {\n      if (angular.isObject(hueValue)) return; // Already converted\n      // Map everything to rgb colors\n      var rgbValue = colorToRgbaArray(hueValue);\n      if (!rgbValue) {\n        throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\"\n                        .replace('%1', hueValue)\n                        .replace('%2', palette.name)\n                        .replace('%3', hueName));\n      }\n\n      palette[hueName] = {\n        value: rgbValue,\n        contrast: getContrastColor()\n      };\n      function getContrastColor() {\n        if (defaultContrast === 'light') {\n          if (darkColors.indexOf(hueName) > -1) {\n            return DARK_CONTRAST_COLOR;\n          } else {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR \n              : LIGHT_CONTRAST_COLOR;\n          }\n        } else {\n          if (lightColors.indexOf(hueName) > -1) {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR \n              : LIGHT_CONTRAST_COLOR;\n          } else {\n            return DARK_CONTRAST_COLOR;\n          }\n        }\n      }\n    });\n  }\n\n}\ngenerateThemes.$inject = [\"$injector\"];\n\nfunction checkValidPalette(theme, colorType) {\n  // If theme attempts to use a palette that doesnt exist, throw error\n  if (!PALETTES[ (theme.colors[colorType] || {}).name ]) {\n    throw new Error(\n      \"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\"\n                    .replace('%1', theme.name)\n                    .replace('%2', colorType)\n                    .replace('%3', Object.keys(PALETTES).join(', '))\n    );\n  }\n}\n\nfunction colorToRgbaArray(clr) {\n  if (angular.isArray(clr) && clr.length == 3) return clr;\n  if (/^rgb/.test(clr)) {\n    return clr.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g, '').split(',').map(function(value, i) {\n      return i == 3 ? parseFloat(value, 10) : parseInt(value, 10);\n    });\n  }\n  if (clr.charAt(0) == '#') clr = clr.substring(1);\n  if (!/^([a-fA-F0-9]{3}){1,2}$/g.test(clr)) return;\n\n  var dig = clr.length / 3;\n  var red = clr.substr(0, dig);\n  var grn = clr.substr(dig, dig);\n  var blu = clr.substr(dig * 2);\n  if (dig === 1) {\n    red += red;\n    grn += grn;\n    blu += blu;\n  }\n  return [parseInt(red, 16), parseInt(grn, 16), parseInt(blu, 16)];\n}\n\nfunction rgba(rgbArray, opacity) {\n  if (rgbArray.length == 4) {\n    rgbArray = angular.copy(rgbArray);\n    opacity ? rgbArray.pop() : opacity = rgbArray.pop();\n  }\n  return opacity && (typeof opacity == 'number' || (typeof opacity == 'string' && opacity.length)) ?\n    'rgba(' + rgbArray.join(',') + ',' + opacity + ')' :\n    'rgb(' + rgbArray.join(',') + ')';\n}\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  /**\n   * @ngdoc module\n   * @name material.components.autocomplete\n   */\n  /*\n   * @see js folder for autocomplete implementation\n   */\n  angular.module('material.components.autocomplete', [\n    'material.core',\n    'material.components.icon'\n  ]);\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.backdrop\n * @description Backdrop\n */\n\n/**\n * @ngdoc directive\n * @name mdBackdrop\n * @module material.components.backdrop\n *\n * @restrict E\n *\n * @description\n * `<md-backdrop>` is a backdrop element used by other coponents, such as dialog and bottom sheet.\n * Apply class `opaque` to make the backdrop use the theme backdrop color.\n *\n */\n\nangular.module('material.components.backdrop', [\n  'material.core'\n])\n  .directive('mdBackdrop', BackdropDirective);\n\nfunction BackdropDirective($mdTheming) {\n  return $mdTheming;\n}\nBackdropDirective.$inject = [\"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.bottomSheet\n * @description\n * BottomSheet\n */\nangular.module('material.components.bottomSheet', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdBottomSheet', MdBottomSheetDirective)\n  .provider('$mdBottomSheet', MdBottomSheetProvider);\n\nfunction MdBottomSheetDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdBottomSheet\n * @module material.components.bottomSheet\n *\n * @description\n * `$mdBottomSheet` opens a bottom sheet over the app and provides a simple promise API.\n *\n * ## Restrictions\n *\n * - The bottom sheet's template must have an outer `<md-bottom-sheet>` element.\n * - Add the `md-grid` class to the bottom sheet for a grid layout.\n * - Add the `md-list` class to the bottom sheet for a list layout.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openBottomSheet()\">\n *     Open a Bottom Sheet!\n *   </md-button>\n * </div>\n * </hljs>\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdBottomSheet) {\n *   $scope.openBottomSheet = function() {\n *     $mdBottomSheet.show({\n *       template: '<md-bottom-sheet>Hello!</md-bottom-sheet>'\n *     });\n *   };\n * });\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdBottomSheet#show\n *\n * @description\n * Show a bottom sheet with the specified options.\n *\n * @param {object} options An options object, with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *   be used as the content of the bottom sheet. Restrictions: the template must\n *   have an outer `md-bottom-sheet` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *   template string.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n *     This scope will be destroyed when the bottom sheet is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `controller` - `{string=}`: The controller to associate with this bottom sheet.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *   be used as names of values to inject into the controller. For example,\n *   `locals: {three: 3}` would inject `three` into the controller with the value\n *   of 3.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *   the location of the click will be used as the starting point for the opening animation\n *   of the the dialog.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *   and the bottom sheet will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the bottom sheet to. Defaults to appending\n *     to the root element of the application.\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the bottom sheet is open.\n *     Default true.\n *\n * @returns {promise} A promise that can be resolved with `$mdBottomSheet.hide()` or\n * rejected with `$mdBottomSheet.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#hide\n *\n * @description\n * Hide the existing bottom sheet and resolve the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#cancel\n *\n * @description\n * Hide the existing bottom sheet and reject the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n */\n\nfunction MdBottomSheetProvider($$interimElementProvider) {\n  // how fast we need to flick down to close the sheet, pixels/ms\n  var CLOSING_VELOCITY = 0.5;\n  var PADDING = 80; // same as css\n\n  bottomSheetDefaults.$inject = [\"$animate\", \"$mdConstant\", \"$timeout\", \"$$rAF\", \"$compile\", \"$mdTheming\", \"$mdBottomSheet\", \"$rootElement\", \"$rootScope\", \"$mdGesture\"];\n  return $$interimElementProvider('$mdBottomSheet')\n    .setDefaults({\n      methods: ['disableParentScroll', 'escapeToClose', 'targetEvent'],\n      options: bottomSheetDefaults\n    });\n\n  /* @ngInject */\n  function bottomSheetDefaults($animate, $mdConstant, $timeout, $$rAF, $compile, $mdTheming, $mdBottomSheet, $rootElement, $rootScope, $mdGesture) {\n    var backdrop;\n\n    return {\n      themable: true,\n      targetEvent: null,\n      onShow: onShow,\n      onRemove: onRemove,\n      escapeToClose: true,\n      disableParentScroll: true\n    };\n\n    function onShow(scope, element, options) {\n      // Add a backdrop that will close on click\n      backdrop = $compile('<md-backdrop class=\"md-opaque md-bottom-sheet-backdrop\">')(scope);\n      backdrop.on('click', function() {\n        $timeout($mdBottomSheet.cancel);\n      });\n\n      $mdTheming.inherit(backdrop, options.parent);\n\n      $animate.enter(backdrop, options.parent, null);\n\n      var bottomSheet = new BottomSheet(element, options.parent);\n      options.bottomSheet = bottomSheet;\n\n      // Give up focus on calling item\n      options.targetEvent && angular.element(options.targetEvent.target).blur();\n      $mdTheming.inherit(bottomSheet.element, options.parent);\n\n      if (options.disableParentScroll) {\n        options.lastOverflow = options.parent.css('overflow');\n        options.parent.css('overflow', 'hidden');\n      }\n\n      return $animate.enter(bottomSheet.element, options.parent)\n        .then(function() {\n          var focusable = angular.element(\n            element[0].querySelector('button') ||\n            element[0].querySelector('a') ||\n            element[0].querySelector('[ng-click]')\n          );\n          focusable.focus();\n\n          if (options.escapeToClose) {\n            options.rootElementKeyupCallback = function(e) {\n              if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n                $timeout($mdBottomSheet.cancel);\n              }\n            };\n            $rootElement.on('keyup', options.rootElementKeyupCallback);\n          }\n        });\n\n    }\n\n    function onRemove(scope, element, options) {\n      var bottomSheet = options.bottomSheet;\n\n\n      $animate.leave(backdrop);\n      return $animate.leave(bottomSheet.element).then(function() {\n        if (options.disableParentScroll) {\n          options.parent.css('overflow', options.lastOverflow);\n          delete options.lastOverflow;\n        }\n\n        bottomSheet.cleanup();\n\n        // Restore focus\n        options.targetEvent && angular.element(options.targetEvent.target).focus();\n      });\n    }\n\n    /**\n     * BottomSheet class to apply bottom-sheet behavior to an element\n     */\n    function BottomSheet(element, parent) {\n      var deregister = $mdGesture.register(parent, 'drag', { horizontal: false });\n      parent.on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      return {\n        element: element,\n        cleanup: function cleanup() {\n          deregister();\n          parent.off('$md.dragstart', onDragStart)\n            .off('$md.drag', onDrag)\n            .off('$md.dragend', onDragEnd);\n        }\n      };\n\n      function onDragStart(ev) {\n        // Disable transitions on transform so that it feels fast\n        element.css($mdConstant.CSS.TRANSITION_DURATION, '0ms');\n      }\n\n      function onDrag(ev) {\n        var transform = ev.pointer.distanceY;\n        if (transform < 5) {\n          // Slow down drag when trying to drag up, and stop after PADDING\n          transform = Math.max(-PADDING, transform / 2);\n        }\n        element.css($mdConstant.CSS.TRANSFORM, 'translate3d(0,' + (PADDING + transform) + 'px,0)');\n      }\n\n      function onDragEnd(ev) {\n        if (ev.pointer.distanceY > 0 &&\n            (ev.pointer.distanceY > 20 || Math.abs(ev.pointer.velocityY) > CLOSING_VELOCITY)) {\n          var distanceRemaining = element.prop('offsetHeight') - ev.pointer.distanceY;\n          var transitionDuration = Math.min(distanceRemaining / ev.pointer.velocityY * 0.75, 500);\n          element.css($mdConstant.CSS.TRANSITION_DURATION, transitionDuration + 'ms');\n          $timeout($mdBottomSheet.cancel);\n        } else {\n          element.css($mdConstant.CSS.TRANSITION_DURATION, '');\n          element.css($mdConstant.CSS.TRANSFORM, '');\n        }\n      }\n    }\n\n  }\n\n}\nMdBottomSheetProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.card\n *\n * @description\n * Card components.\n */\nangular.module('material.components.card', [\n  'material.core'\n])\n  .directive('mdCard', mdCardDirective);\n\n\n\n/**\n * @ngdoc directive\n * @name mdCard\n * @module material.components.card\n *\n * @restrict E\n *\n * @description\n * The `<md-card>` directive is a container element used within `<md-content>` containers.\n *\n * Cards have constant width and variable heights; where the maximum height is limited to what can\n * fit within a single view on a platform, but it can temporarily expand as needed\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-card>\n *  <img src=\"img/washedout.png\" class=\"md-card-image\">\n *  <h2>Paracosm</h2>\n *  <p>\n *    The titles of Washed Out's breakthrough song and the first single from Paracosm share the * two most important words in Ernest Greene's musical language: feel it. It's a simple request, as well...\n *  </p>\n * </md-card>\n * </hljs>\n *\n */\nfunction mdCardDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $mdTheming($element);\n    }\n  };\n}\nmdCardDirective.$inject = [\"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.button\n * @description\n *\n * Button\n */\nangular.module('material.components.button', [\n  'material.core'\n])\n  .directive('mdButton', MdButtonDirective);\n\n/**\n * @ngdoc directive\n * @name mdButton\n * @module material.components.button\n *\n * @restrict E\n *\n * @description\n * `<md-button>` is a button directive with optional ink ripples (default enabled).\n *\n * If you supply a `href` or `ng-href` attribute, it will become an `<a>` element. Otherwise, it will\n * become a `<button>` element.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the FAB button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {boolean=} md-no-ink If present, disable ripple ink effects.\n * @param {expression=} ng-disabled En/Disable based on the expression\n * @param {string=} md-ripple-size Overrides the default ripple size logic. Options: `full`, `partial`, `auto`\n * @param {string=} aria-label Adds alternative text to button for accessibility, useful for icon buttons.\n * If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-button>\n *    Button\n *  </md-button>\n *  <md-button href=\"http://google.com\" class=\"md-button-colored\">\n *    I'm a link\n *  </md-button>\n *  <md-button ng-disabled=\"true\" class=\"md-colored\">\n *    I'm a disabled button\n *  </md-button>\n * </hljs>\n */\nfunction MdButtonDirective($mdInkRipple, $mdTheming, $mdAria) {\n\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: getTemplate,\n    link: postLink\n  };\n\n  function isAnchor(attr) {\n    return angular.isDefined(attr.href) || angular.isDefined(attr.ngHref);\n  }\n  \n  function getTemplate(element, attr) {\n    return isAnchor(attr) ?\n           '<a class=\"md-button\" ng-transclude></a>' :\n           '<button class=\"md-button\" ng-transclude></button>';\n  }\n\n  function postLink(scope, element, attr) {\n    var node = element[0];\n    $mdTheming(element);\n    $mdInkRipple.attachButtonBehavior(scope, element);\n\n    var elementHasText = node.textContent.trim();\n    if (!elementHasText) {\n      $mdAria.expect(element, 'aria-label');\n    }\n\n    // For anchor elements, we have to set tabindex manually when the \n    // element is disabled\n    if (isAnchor(attr) && angular.isDefined(attr.ngDisabled) ) {\n      scope.$watch(attr.ngDisabled, function(isDisabled) {\n        element.attr('tabindex', isDisabled ? -1 : 0);\n      });\n    }\n  }\n\n}\nMdButtonDirective.$inject = [\"$mdInkRipple\", \"$mdTheming\", \"$mdAria\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.checkbox\n * @description Checkbox module!\n */\nangular.module('material.components.checkbox', [\n  'material.core'\n])\n  .directive('mdCheckbox', MdCheckboxDirective);\n\n/**\n * @ngdoc directive\n * @name mdCheckbox\n * @module material.components.checkbox\n * @restrict E\n *\n * @description\n * The checkbox directive is used like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the checkbox is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects\n * @param {string=} aria-label Adds label to checkbox for accessibility.\n * Defaults to checkbox's text. If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-checkbox ng-model=\"isChecked\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-checkbox>\n *\n * <md-checkbox md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-checkbox>\n *\n * <md-checkbox ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-checkbox>\n *\n * </hljs>\n *\n */\nfunction MdCheckboxDirective(inputDirective, $mdInkRipple, $mdAria, $mdConstant, $mdTheming, $mdUtil) {\n  inputDirective = inputDirective[0];\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    require: '?ngModel',\n    template: \n      '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n        '<div class=\"md-icon\"></div>' +\n      '</div>' +\n      '<div ng-transclude class=\"md-label\"></div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n\n    tAttrs.type = 'checkbox';\n    tAttrs.tabIndex = 0;\n    tElement.attr('role', tAttrs.type);\n\n    return function postLink(scope, element, attr, ngModelCtrl) {\n      ngModelCtrl = ngModelCtrl || $mdUtil.fakeNgModel();\n      var checked = false;\n      $mdTheming(element);\n\n      if (attr.ngChecked) {\n        scope.$watch(\n            scope.$eval.bind(scope, attr.ngChecked),\n            ngModelCtrl.$setViewValue.bind(ngModelCtrl)\n        );\n      }\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      // Reuse the original input[type=checkbox] directive from Angular core.\n      // This is a bit hacky as we need our own event listener and own render\n      // function.\n      inputDirective.link.pre(scope, {\n        on: angular.noop,\n        0: {}\n      }, attr, [ngModelCtrl]);\n\n      element.on('click', listener)\n        .on('keypress', keypressHandler);\n      ngModelCtrl.$render = render;\n\n      function keypressHandler(ev) {\n        if(ev.which === $mdConstant.KEY_CODE.SPACE) {\n          ev.preventDefault();\n          listener(ev);\n        }\n      }\n      function listener(ev) {\n        if (element[0].hasAttribute('disabled')) return;\n\n        scope.$apply(function() {\n          checked = !checked;\n          ngModelCtrl.$setViewValue(checked, ev && ev.type);\n          ngModelCtrl.$render();\n        });\n      }\n\n      function render() {\n        checked = ngModelCtrl.$viewValue;\n        if(checked) {\n          element.addClass(CHECKED_CSS);\n        } else {\n          element.removeClass(CHECKED_CSS);\n        }\n      }\n    };\n  }\n}\nMdCheckboxDirective.$inject = [\"inputDirective\", \"$mdInkRipple\", \"$mdAria\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.content\n *\n * @description\n * Scrollable content\n */\nangular.module('material.components.content', [\n  'material.core'\n])\n  .directive('mdContent', mdContentDirective);\n\n/**\n * @ngdoc directive\n * @name mdContent\n * @module material.components.content\n *\n * @restrict E\n *\n * @description\n * The `<md-content>` directive is a container element useful for scrollable content\n *\n * ### Restrictions\n *\n * - Add the `md-padding` class to make the content padded.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-content class=\"md-padding\">\n *      Lorem ipsum dolor sit amet, ne quod novum mei.\n *  </md-content>\n * </hljs>\n *\n */\n\nfunction mdContentDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: ['$scope', '$element', ContentController],\n    link: function(scope, element, attr) {\n      var node = element[0];\n\n      $mdTheming(element);\n      scope.$broadcast('$mdContentLoaded', element);\n\n      iosScrollFix(element[0]);\n    }\n  };\n\n  function ContentController($scope, $element) {\n    this.$scope = $scope;\n    this.$element = $element;\n  }\n}\nmdContentDirective.$inject = [\"$mdTheming\"];\n\nfunction iosScrollFix(node) {\n  // IOS FIX:\n  // If we scroll where there is no more room for the webview to scroll,\n  // by default the webview itself will scroll up and down, this looks really\n  // bad.  So if we are scrolling to the very top or bottom, add/subtract one\n  angular.element(node).on('$md.pressdown', function(ev) {\n    // Only touch events\n    if (ev.pointer.type !== 't') return;\n    // Don't let a child content's touchstart ruin it for us.\n    if (ev.$materialScrollFixed) return;\n    ev.$materialScrollFixed = true;\n\n    if (node.scrollTop === 0) {\n      node.scrollTop = 1;\n    } else if (node.scrollHeight === node.scrollTop + node.offsetHeight) {\n      node.scrollTop -= 1;\n    }\n  });\n}\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.dialog\n */\nangular.module('material.components.dialog', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdDialog', MdDialogDirective)\n  .provider('$mdDialog', MdDialogProvider);\n\nfunction MdDialogDirective($$rAF, $mdTheming) {\n  return {\n    restrict: 'E',\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n      $$rAF(function() {\n        var content = element[0].querySelector('md-content');\n        if (content && content.scrollHeight > content.clientHeight) {\n          element.addClass('md-content-overflow');\n        }\n      });\n    }\n  };\n}\nMdDialogDirective.$inject = [\"$$rAF\", \"$mdTheming\"];\n\n/**\n * @ngdoc service\n * @name $mdDialog\n * @module material.components.dialog\n *\n * @description\n * `$mdDialog` opens a dialog over the app to inform users about critical information or require\n *  them to make decisions. There are two approaches for setup: a simple promise API\n *  and regular object syntax.\n *\n * ## Restrictions\n *\n * - The dialog is always given an isolate scope.\n * - The dialog's template must have an outer `<md-dialog>` element.\n *   Inside, use an `<md-content>` element for the dialog's content, and use\n *   an element with class `md-actions` for the dialog's actions.\n *\n * @usage\n * ### HTML\n *\n * <hljs lang=\"html\">\n * <div  ng-app=\"demoApp\" ng-controller=\"EmployeeController\">\n *   <md-button ng-click=\"showAlert()\" class=\"md-raised md-warn\">\n *     Employee Alert!\n *   </md-button>\n *   <md-button ng-click=\"showDialog($event)\" class=\"md-raised\">\n *     Custom Dialog\n *   </md-button>\n *   <md-button ng-click=\"closeAlert()\" ng-disabled=\"!hasAlert()\" class=\"md-raised\">\n *     Close Alert\n *   </md-button>\n *   <md-button ng-click=\"showGreeting($event)\" class=\"md-raised md-primary\" >\n *     Greet Employee\n *   </md-button>\n * </div>\n * </hljs>\n *\n * ### JavaScript: object syntax\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *    .module('demoApp', ['ngMaterial'])\n *    .controller('AppCtrl', AppController);\n *\n *   function AppController($scope, $mdDialog) {\n *     var alert;\n *     $scope.showAlert = showAlert;\n *     $scope.showDialog = showDialog;\n *     $scope.items = [1, 2, 3];\n *\n *     // Internal method\n *     function showAlert() {\n *       alert = $mdDialog.alert({\n *         title: 'Attention',\n *         content: 'This is an example of how easy dialogs can be!',\n *         ok: 'Close'\n *       });\n *\n *       $mdDialog\n *         .show( alert )\n *         .finally(function() {\n *           alert = undefined;\n *         });\n *     }\n *\n *     function showDialog($event) {\n *        var parentEl = angular.element(document.body);\n *        $mdDialog.show({\n *          parent: parentEl,\n *          targetEvent: $event,\n *          template:\n *            '<md-dialog aria-label=\"List dialog\">' +\n *            '  <md-content>'+\n *            '    <md-list>'+\n *            '      <md-item ng-repeat=\"item in items\">'+\n *            '       <p>Number {{item}}</p>' +\n *            '      </md-item>'+\n *            '    </md-list>'+\n *            '  </md-content>' +\n *            '  <div class=\"md-actions\">' +\n *            '    <md-button ng-click=\"closeDialog()\">' +\n *            '      Close Dialog' +\n *            '    </md-button>' +\n *            '  </div>' +\n *            '</md-dialog>',\n *          locals: {\n *            items: $scope.items\n *          },\n *          controller: DialogController\n *       });\n *       function DialogController(scope, $mdDialog, items) {\n *         scope.items = items;\n *         scope.closeDialog = function() {\n *           $mdDialog.hide();\n *         }\n *       }\n *     }\n *\n * })(angular);\n * </hljs>\n *\n * ### JavaScript: promise API syntax, custom dialog template\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *     .module('demoApp', ['ngMaterial'])\n *     .controller('EmployeeController', EmployeeEditor)\n *     .controller('GreetingController', GreetingController);\n *\n *   // Fictitious Employee Editor to show how to use simple and complex dialogs.\n *\n *   function EmployeeEditor($scope, $mdDialog) {\n *     var alert;\n *\n *     $scope.showAlert = showAlert;\n *     $scope.closeAlert = closeAlert;\n *     $scope.showGreeting = showCustomGreeting;\n *\n *     $scope.hasAlert = function() { return !!alert };\n *     $scope.userName = $scope.userName || 'Bobby';\n *\n *     // Dialog #1 - Show simple alert dialog and cache\n *     // reference to dialog instance\n *\n *     function showAlert() {\n *       alert = $mdDialog.alert()\n *         .title('Attention, ' + $scope.userName)\n *         .content('This is an example of how easy dialogs can be!')\n *         .ok('Close');\n *\n *       $mdDialog\n *           .show( alert )\n *           .finally(function() {\n *             alert = undefined;\n *           });\n *     }\n *\n *     // Close the specified dialog instance and resolve with 'finished' flag\n *     // Normally this is not needed, just use '$mdDialog.hide()' to close\n *     // the most recent dialog popup.\n *\n *     function closeAlert() {\n *       $mdDialog.hide( alert, \"finished\" );\n *       alert = undefined;\n *     }\n *\n *     // Dialog #2 - Demonstrate more complex dialogs construction and popup.\n *\n *     function showCustomGreeting($event) {\n *         $mdDialog.show({\n *           targetEvent: $event,\n *           template:\n *             '<md-dialog>' +\n *\n *             '  <md-content>Hello {{ employee }}!</md-content>' +\n *\n *             '  <div class=\"md-actions\">' +\n *             '    <md-button ng-click=\"closeDialog()\">' +\n *             '      Close Greeting' +\n *\n *             '    </md-button>' +\n *             '  </div>' +\n *             '</md-dialog>',\n *           controller: 'GreetingController',\n *           onComplete: afterShowAnimation,\n *           locals: { employee: $scope.userName }\n *         });\n *\n *         // When the 'enter' animation finishes...\n *\n *         function afterShowAnimation(scope, element, options) {\n *            // post-show code here: DOM element focus, etc.\n *         }\n *     }\n *   }\n *\n *   // Greeting controller used with the more complex 'showCustomGreeting()' custom dialog\n *\n *   function GreetingController($scope, $mdDialog, employee) {\n *     // Assigned from construction <code>locals</code> options...\n *     $scope.employee = employee;\n *\n *     $scope.closeDialog = function() {\n *       // Easily hides most recent dialog shown...\n *       // no specific instance reference is needed.\n *       $mdDialog.hide();\n *     };\n *   }\n *\n * })(angular);\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#alert\n *\n * @description\n * Builds a preconfigured dialog with the specified message.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n * - $mdDialogPreset#theme(string) - sets the theme of the dialog\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#confirm\n *\n * @description\n * Builds a preconfigured dialog with the specified message. You can call show and the promise returned\n * will be resolved only if the user clicks the confirm action on the dialog.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * Additionally, it supports the following methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n * - $mdDialogPreset#cancel(string) - sets cancel button text to string\n * - $mdDialogPreset#theme(string) - sets the theme of the dialog\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#show\n *\n * @description\n * Show a dialog with the specified options.\n *\n * @param {object} optionsOrPreset Either provide an `$mdDialogPreset` returned from `alert()`, and\n * `confirm()`, or an options object with the following properties:\n *   - `templateUrl` - `{string=}`: The url of a template that will be used as the content\n *   of the dialog.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual template string.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new isolate scope.\n *     This scope will be destroyed when the dialog is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the dialog is open.\n *     Default true.\n *   - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop behind the dialog.\n *     Default true.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the dialog to\n *     close it. Default true.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the dialog.\n *     Default true.\n *   - `controller` - `{string=}`: The controller to associate with the dialog. The controller\n *     will be injected with the local `$mdDialog`, which passes along a scope for the dialog.\n *   - `locals` - `{object=}`: An object containing key/value pairs. The keys will be used as names\n *     of values to inject into the controller. For example, `locals: {three: 3}` would inject\n *     `three` into the controller, with the value 3. If `bindToController` is true, they will be\n *     copied to the controller instead. \n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values, and the\n *     dialog will not open until all of the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the dialog to. Defaults to appending\n *     to the root element of the application.\n *   - `onComplete` `{function=}`: Callback function used to announce when the show() action is\n *     finished.\n *\n * @returns {promise} A promise that can be resolved with `$mdDialog.hide()` or\n * rejected with `$mdDialog.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#hide\n *\n * @description\n * Hide an existing dialog and resolve the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#cancel\n *\n * @description\n * Hide an existing dialog and reject the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n */\n\nfunction MdDialogProvider($$interimElementProvider) {\n\n  var alertDialogMethods = ['title', 'content', 'ariaLabel', 'ok'];\n\n  advancedDialogOptions.$inject = [\"$mdDialog\", \"$mdTheming\"];\n  dialogDefaultOptions.$inject = [\"$timeout\", \"$rootElement\", \"$compile\", \"$animate\", \"$mdAria\", \"$document\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$$rAF\", \"$q\", \"$mdDialog\"];\n  return $$interimElementProvider('$mdDialog')\n    .setDefaults({\n      methods: ['disableParentScroll', 'hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n      options: dialogDefaultOptions\n    })\n    .addPreset('alert', {\n      methods: ['title', 'content', 'ariaLabel', 'ok', 'theme'],\n      options: advancedDialogOptions\n    })\n    .addPreset('confirm', {\n      methods: ['title', 'content', 'ariaLabel', 'ok', 'cancel', 'theme'],\n      options: advancedDialogOptions\n    });\n\n  /* @ngInject */\n  function advancedDialogOptions($mdDialog, $mdTheming) {\n    return {\n      template: [\n        '<md-dialog md-theme=\"{{ dialog.theme }}\" aria-label=\"{{ dialog.ariaLabel }}\">',\n          '<md-content>',\n            '<h2>{{ dialog.title }}</h2>',\n            '<p>{{ dialog.content }}</p>',\n          '</md-content>',\n          '<div class=\"md-actions\">',\n            '<md-button ng-if=\"dialog.$type == \\'confirm\\'\" ng-click=\"dialog.abort()\">',\n              '{{ dialog.cancel }}',\n            '</md-button>',\n            '<md-button ng-click=\"dialog.hide()\" class=\"md-primary\">',\n              '{{ dialog.ok }}',\n            '</md-button>',\n          '</div>',\n        '</md-dialog>'\n      ].join(''),\n      controller: function mdDialogCtrl() {\n        this.hide = function() {\n          $mdDialog.hide(true);\n        };\n        this.abort = function() {\n          $mdDialog.cancel();\n        };\n      },\n      controllerAs: 'dialog',\n      bindToController: true,\n      theme: $mdTheming.defaultTheme()\n    };\n  }\n\n  /* @ngInject */\n  function dialogDefaultOptions($timeout, $rootElement, $compile, $animate, $mdAria, $document,\n                                $mdUtil, $mdConstant, $mdTheming, $$rAF, $q, $mdDialog) {\n    return {\n      hasBackdrop: true,\n      isolateScope: true,\n      onShow: onShow,\n      onRemove: onRemove,\n      clickOutsideToClose: true,\n      escapeToClose: true,\n      targetEvent: null,\n      disableParentScroll: true,\n      transformTemplate: function(template) {\n        return '<div class=\"md-dialog-container\">' + template + '</div>';\n      }\n    };\n\n\n    // On show method for dialogs\n    function onShow(scope, element, options) {\n      // Incase the user provides a raw dom element, always wrap it in jqLite\n      options.parent = angular.element(options.parent);\n\n      options.popInTarget = angular.element((options.targetEvent || {}).target);\n      var closeButton = findCloseButton();\n\n      configureAria(element.find('md-dialog'));\n\n      if (options.hasBackdrop) {\n        // Fix for IE 10\n        var computeFrom = (options.parent[0] == $document[0].body && $document[0].documentElement \n                           && $document[0].scrollTop) ? angular.element($document[0].documentElement) : options.parent;\n        var parentOffset = computeFrom.prop('scrollTop');\n        options.backdrop = angular.element('<md-backdrop class=\"md-dialog-backdrop md-opaque\">');\n        $mdTheming.inherit(options.backdrop, options.parent);\n        $animate.enter(options.backdrop, options.parent);\n        element.css('top', parentOffset +'px');\n      }\n\n      if (options.disableParentScroll) {\n        options.lastOverflow = options.parent.css('overflow');\n        options.parent.css('overflow', 'hidden');\n      }\n\n      return dialogPopIn(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      )\n      .then(function() {\n        if (options.escapeToClose) {\n          options.rootElementKeyupCallback = function(e) {\n            if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          $rootElement.on('keyup', options.rootElementKeyupCallback);\n        }\n\n        if (options.clickOutsideToClose) {\n          options.dialogClickOutsideCallback = function(ev) {\n            // Only close if we click the flex container outside the backdrop\n            if (ev.target === element[0]) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          element.on('click', options.dialogClickOutsideCallback);\n        }\n        closeButton.focus();\n      });\n\n\n      function findCloseButton() {\n        //If no element with class dialog-close, try to find the last\n        //button child in md-actions and assume it is a close button\n        var closeButton = element[0].querySelector('.dialog-close');\n        if (!closeButton) {\n          var actionButtons = element[0].querySelectorAll('.md-actions button');\n          closeButton = actionButtons[ actionButtons.length - 1 ];\n        }\n        return angular.element(closeButton);\n      }\n\n    }\n\n    // On remove function for all dialogs\n    function onRemove(scope, element, options) {\n\n      if (options.backdrop) {\n        $animate.leave(options.backdrop);\n      }\n      if (options.disableParentScroll) {\n        options.parent.css('overflow', options.lastOverflow);\n        delete options.lastOverflow;\n      }\n      if (options.escapeToClose) {\n        $rootElement.off('keyup', options.rootElementKeyupCallback);\n      }\n      if (options.clickOutsideToClose) {\n        element.off('click', options.dialogClickOutsideCallback);\n      }\n      return dialogPopOut(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      ).then(function() {\n        options.scope.$destroy();\n        element.remove();\n        options.popInTarget && options.popInTarget.focus();\n      });\n\n    }\n\n    /**\n     * Inject ARIA-specific attributes appropriate for Dialogs\n     */\n    function configureAria(element) {\n      element.attr({\n        'role': 'dialog'\n      });\n\n      var dialogContent = element.find('md-content');\n      if (dialogContent.length === 0){\n        dialogContent = element;\n      }\n      $mdAria.expectAsync(element, 'aria-label', function() {\n        var words = dialogContent.text().split(/\\s+/);\n        if (words.length > 3) words = words.slice(0,3).concat('...');\n        return words.join(' ');\n      });\n    }\n\n    function dialogPopIn(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      parentElement.append(container);\n      transformToClickElement(dialogEl, clickElement);\n\n      $$rAF(function() {\n        dialogEl.addClass('transition-in')\n          .css($mdConstant.CSS.TRANSFORM, '');\n      });\n\n      return $mdUtil.transitionEndPromise(dialogEl);\n    }\n\n    function dialogPopOut(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      dialogEl.addClass('transition-out').removeClass('transition-in');\n      transformToClickElement(dialogEl, clickElement);\n\n      return $mdUtil.transitionEndPromise(dialogEl);\n    }\n\n    function transformToClickElement(dialogEl, clickElement) {\n      if (clickElement) {\n        var clickRect = clickElement[0].getBoundingClientRect();\n        var dialogRect = dialogEl[0].getBoundingClientRect();\n\n        var scaleX = Math.min(0.5, clickRect.width / dialogRect.width);\n        var scaleY = Math.min(0.5, clickRect.height / dialogRect.height);\n\n        dialogEl.css($mdConstant.CSS.TRANSFORM, 'translate3d(' +\n          (-dialogRect.left + clickRect.left + clickRect.width/2 - dialogRect.width/2) + 'px,' +\n          (-dialogRect.top + clickRect.top + clickRect.height/2 - dialogRect.height/2) + 'px,' +\n          '0) scale(' + scaleX + ',' + scaleY + ')'\n        );\n      }\n    }\n\n    function dialogTransitionEnd(dialogEl) {\n      var deferred = $q.defer();\n      dialogEl.on($mdConstant.CSS.TRANSITIONEND, finished);\n      function finished(ev) {\n        //Make sure this transitionend didn't bubble up from a child\n        if (ev.target === dialogEl[0]) {\n          dialogEl.off($mdConstant.CSS.TRANSITIONEND, finished);\n          deferred.resolve();\n        }\n      }\n      return deferred.promise;\n    }\n\n  }\n}\nMdDialogProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.divider\n * @description Divider module!\n */\nangular.module('material.components.divider', [\n  'material.core'\n])\n  .directive('mdDivider', MdDividerDirective);\n\nfunction MdDividerController(){}\n\n/**\n * @ngdoc directive\n * @name mdDivider\n * @module material.components.divider\n * @restrict E\n *\n * @description\n * Dividers group and separate content within lists and page layouts using strong visual and spatial distinctions. This divider is a thin rule, lightweight enough to not distract the user from content.\n *\n * @param {boolean=} md-inset Add this attribute to activate the inset divider style.\n * @usage\n * <hljs lang=\"html\">\n * <md-divider></md-divider>\n *\n * <md-divider md-inset></md-divider>\n * </hljs>\n *\n */\nfunction MdDividerDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: $mdTheming,\n    controller: [MdDividerController]\n  };\n}\nMdDividerDirective.$inject = [\"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.gridList\n */\nangular.module('material.components.gridList', ['material.core'])\n       .directive('mdGridList', GridListDirective)\n       .directive('mdGridTile', GridTileDirective)\n       .directive('mdGridTileFooter', GridTileCaptionDirective)\n       .directive('mdGridTileHeader', GridTileCaptionDirective)\n       .factory('$mdGridLayout', GridLayoutFactory);\n\n/**\n * @ngdoc directive\n * @name mdGridList\n * @module material.components.gridList\n * @restrict E\n * @description\n * Grid lists are an alternative to standard list views. Grid lists are distinct\n * from grids used for layouts and other visual presentations.\n *\n * A grid list is best suited to presenting a homogenous data type, typically\n * images, and is optimized for visual comprehension and differentiating between\n * like data types.\n *\n * A grid list is a continuous element consisting of tessellated, regular\n * subdivisions called cells that contain tiles (`md-grid-tile`).\n *\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7OVlEaXZ5YmU1Xzg/components_grids_usage2.png\"\n *    style=\"width: 300px; height: auto; margin-right: 16px;\" alt=\"Concept of grid explained visually\">\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7VGhsOE5idWlJWXM/components_grids_usage3.png\"\n *    style=\"width: 300px; height: auto;\" alt=\"Grid concepts legend\">\n *\n * Cells are arrayed vertically and horizontally within the grid.\n *\n * Tiles hold content and can span one or more cells vertically or horizontally.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-list` directive supports \"responsive\" attributes, which allow\n * different `md-cols`, `md-gutter` and `md-row-height` values depending on the\n * currently matching media query (as defined in `$mdConstant.MEDIA`).\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-cols-lg=\"8\"`)\n *\n * @param {number} md-cols Number of columns in the grid.\n * @param {string} md-row-height One of\n * <ul>\n *   <li>CSS length - Fixed height rows (eg. `8px` or `1rem`)</li>\n *   <li>`{width}:{height}` - Ratio of width to height (eg.\n *   `md-row-height=\"16:9\"`)</li>\n *   <li>`\"fit\"` - Height will be determined by subdividing the available\n *   height by the number of rows</li>\n * </ul>\n * @param {string=} md-gutter The amount of space between tiles in CSS units\n *     (default 1px)\n * @param {expression=} md-on-layout Expression to evaluate after layout. Event\n *     object is available as `$event`, and contains performance information.\n *\n * @usage\n * Basic:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"5\" md-gutter=\"1em\" md-row-height=\"4:3\">\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fixed-height rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"200px\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fit rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"fit\" style=\"height: 400px;\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Using responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-list\n *     md-cols-sm=\"2\"\n *     md-cols-md=\"4\"\n *     md-cols-lg=\"8\"\n *     md-cols-gt-lg=\"12\"\n *     ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n */\nfunction GridListDirective($interpolate, $mdConstant, $mdGridLayout, $mdMedia, $mdUtil) {\n  return {\n    restrict: 'E',\n    controller: GridListController,\n    scope: {\n      mdOnLayout: '&'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, ctrl) {\n    // Apply semantics\n    element.attr('role', 'list');\n\n    // Provide the controller with a way to trigger layouts.\n    ctrl.layoutDelegate = layoutDelegate\n\n    var invalidateLayout = angular.bind(ctrl, ctrl.invalidateLayout),\n        unwatchAttrs = watchMedia();\n    scope.$on('$destroy', unwatchMedia);\n\n    /**\n     * Watches for changes in media, invalidating layout as necessary.\n     */\n    function watchMedia() {\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia(mediaName); // initialize\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .addListener(invalidateLayout);\n      }\n      return $mdMedia.watchResponsiveAttributes(\n          ['md-cols', 'md-row-height'], attrs, layoutIfMediaMatch);;\n    }\n\n    function unwatchMedia() {\n      unwatchAttrs();\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .removeListener(invalidateLayout);\n      }\n    }\n\n    /**\n     * Performs grid layout if the provided mediaName matches the currently\n     * active media type.\n     */\n    function layoutIfMediaMatch(mediaName) {\n      if (mediaName == null) {\n        // TODO(shyndman): It would be nice to only layout if we have\n        // instances of attributes using this media type\n        ctrl.invalidateLayout();\n      } else if ($mdMedia(mediaName)) {\n        ctrl.invalidateLayout();\n      }\n    }\n\n    /**\n     * Invokes the layout engine, and uses its results to lay out our\n     * tile elements.\n     */\n    function layoutDelegate() {\n      var tiles = getTileElements(),\n          colCount = getColumnCount(),\n          rowMode = getRowMode(),\n          rowHeight = getRowHeight(),\n          gutter = getGutter(),\n          performance =\n              $mdGridLayout(colCount, getTileSpans(), getTileElements())\n                  .map(function(tilePositions, rowCount) {\n                    return {\n                      grid: {\n                        element: element,\n                        style: getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight)\n                      },\n                      tiles: tilePositions.map(function(ps, i) {\n                        return {\n                          element: angular.element(tiles[i]),\n                          style: getTileStyle(ps.position, ps.spans,\n                              colCount, rowCount,\n                              gutter, rowMode, rowHeight)\n                        }\n                      })\n                    }\n                  })\n                  .reflow()\n                  .performance();\n\n      // Report layout\n      scope.mdOnLayout({\n        $event: {\n          performance: performance\n        }\n      });\n    }\n\n    var UNIT      = $interpolate( \"{{ share }}% - ({{ gutter }} * {{ gutterShare }})\" );\n    var POSITION  = $interpolate( \"calc(({{ unit }}) * {{ offset }} + {{ offset }} * {{ gutter }})\" );\n    var DIMENSION = $interpolate( \"calc(({{ unit }}) * {{ span }} + ({{ span }} - 1) * {{ gutter }})\" );\n\n    // TODO(shyndman): Replace args with a ctx object.\n    function getTileStyle(position, spans, colCount, rowCount, gutter, rowMode, rowHeight) {\n      // TODO(shyndman): There are style caching opportunities here.\n      var hShare = (1 / colCount) * 100,\n          hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n          hUnit = UNIT({ share: hShare, gutterShare: hGutterShare, gutter: gutter });\n\n      var style = {\n        left: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n        width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n        // resets\n        paddingTop: '',\n        marginTop: '',\n        top: '',\n        height: ''\n      };\n\n      switch (rowMode) {\n        case 'fixed':\n          style.top = POSITION({ unit: rowHeight, offset: position.row, gutter: gutter });\n          style.height = DIMENSION({ unit: rowHeight, span: spans.row, gutter: gutter });\n          break;\n\n        case 'ratio':\n          // rowHeight is width / height\n          var vShare = hShare * (1 / rowHeight),\n              vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          style.paddingTop = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter});\n          style.marginTop = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n          break;\n\n        case 'fit':\n          var vGutterShare = rowCount === 1 ? 0 : (rowCount - 1) / rowCount,\n              vShare = (1 / rowCount) * 100,\n              vUnit = UNIT({ share: vShare, gutterShare: vGutterShare, gutter: gutter });\n\n          style.top = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n          style.height = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter });\n          break;\n      }\n\n      return style;\n    }\n\n    function getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight) {\n      var style = {\n        height: '',\n        paddingBottom: ''\n      };\n\n      switch(rowMode) {\n        case 'fixed':\n          style.height = DIMENSION({ unit: rowHeight, span: rowCount, gutter: gutter });\n          break;\n\n        case 'ratio':\n          // rowHeight is width / height\n          var hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n              hShare = (1 / colCount) * 100,\n              vShare = hShare * (1 / rowHeight),\n              vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          style.paddingBottom = DIMENSION({ unit: vUnit, span: rowCount, gutter: gutter});\n          break;\n\n        case 'fit':\n          // noop, as the height is user set\n          break;\n      }\n\n      return style;\n    }\n\n    function getTileElements() {\n      return ctrl.tiles.map(function(tile) { return tile.element });\n    }\n\n    function getTileSpans() {\n      return ctrl.tiles.map(function(tile) {\n        return {\n          row: parseInt(\n              $mdMedia.getResponsiveAttribute(tile.attrs, 'md-rowspan'), 10) || 1,\n          col: parseInt(\n              $mdMedia.getResponsiveAttribute(tile.attrs, 'md-colspan'), 10) || 1\n        };\n      });\n    }\n\n    function getColumnCount() {\n      var colCount = parseInt($mdMedia.getResponsiveAttribute(attrs, 'md-cols'), 10);\n      if (isNaN(colCount)) {\n        throw 'md-grid-list: md-cols attribute was not found, or contained a non-numeric value';\n      }\n      return colCount;\n    }\n\n    function getGutter() {\n      return applyDefaultUnit($mdMedia.getResponsiveAttribute(attrs, 'md-gutter') || 1);\n    }\n\n    function getRowHeight() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      switch (getRowMode()) {\n        case 'fixed':\n          return applyDefaultUnit(rowHeight);\n        case 'ratio':\n          var whRatio = rowHeight.split(':');\n          return parseFloat(whRatio[0]) / parseFloat(whRatio[1]);\n        case 'fit':\n          return 0; // N/A\n      }\n    }\n\n    function getRowMode() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      if (rowHeight == 'fit') {\n        return 'fit';\n      } else if (rowHeight.indexOf(':') !== -1) {\n        return 'ratio';\n      } else {\n        return 'fixed';\n      }\n    }\n\n    function applyDefaultUnit(val) {\n      return /\\D$/.test(val) ? val : val + 'px';\n    }\n  }\n}\nGridListDirective.$inject = [\"$interpolate\", \"$mdConstant\", \"$mdGridLayout\", \"$mdMedia\", \"$mdUtil\"];\n\n  /* @ngInject */\nfunction GridListController($timeout) {\n  this.invalidated = false;\n  this.$timeout_ = $timeout;\n  this.tiles = [];\n  this.layoutDelegate = angular.noop;\n}\nGridListController.$inject = [\"$timeout\"];\n\nGridListController.prototype = {\n  addTile: function(tileElement, tileAttrs, idx) {\n    var tile = { element: tileElement, attrs: tileAttrs };\n    if (angular.isUndefined(idx)) {\n      this.tiles.push(tile);\n    } else {\n      this.tiles.splice(idx, 0, tile);\n    }\n    this.invalidateLayout();\n  },\n\n  removeTile: function(tileElement, tileAttrs) {\n    var idx = this._findTileIndex(tileAttrs);\n    if (idx === -1) {\n      return;\n    }\n    this.tiles.splice(idx, 1);\n    this.invalidateLayout();\n  },\n\n  invalidateLayout: function() {\n    if (this.invalidated) {\n      return;\n    }\n    this.invalidated = true;\n    this.$timeout_(angular.bind(this, this.layout));\n  },\n\n  layout: function() {\n    try {\n      this.layoutDelegate();\n    } finally {\n      this.invalidated = false;\n    }\n  },\n\n  _findTileIndex: function(tileAttrs) {\n    for (var i = 0; i < this.tiles.length; i++) {\n      if (this.tiles[i].attrs == tileAttrs) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\n\n/* @ngInject */\nfunction GridLayoutFactory($mdUtil) {\n  var defaultAnimator = GridTileAnimator;\n\n  /**\n   * Set the reflow animator callback\n   */\n  GridLayout.animateWith =function(customAnimator) {\n    defaultAnimator = !angular.isFunction(customAnimator) ? GridTileAnimator : customAnimator;\n  };\n\n  return GridLayout;\n\n  /**\n   * Publish layout function\n   */\n  function GridLayout(colCount, tileSpans) {\n      var self, layoutInfo, gridStyles, layoutTime, mapTime, reflowTime, layoutInfo;\n\n      layoutTime = $mdUtil.time(function() {\n        layoutInfo = calculateGridFor(colCount, tileSpans);\n      });\n\n      return self = {\n\n        /**\n         * An array of objects describing each tile's position in the grid.\n         */\n        layoutInfo: function() {\n          return layoutInfo;\n        },\n\n        /**\n         * Maps grid positioning to an element and a set of styles using the\n         * provided updateFn.\n         */\n        map: function(updateFn) {\n          mapTime = $mdUtil.time(function() {\n            var info = self.layoutInfo();\n            gridStyles = updateFn(info.positioning, info.rowCount);\n          });\n          return self;\n        },\n\n        /**\n         * Default animator simply sets the element.css( <styles> ). An alternate\n         * animator can be provided as an argument. The function has the following\n         * signature:\n         *\n         *    function({grid: {element: JQLite, style: Object}, tiles: Array<{element: JQLite, style: Object}>)\n         */\n        reflow: function(animatorFn) {\n          reflowTime = $mdUtil.time(function() {\n            var animator = animatorFn || defaultAnimator;\n            animator(gridStyles.grid, gridStyles.tiles);\n          });\n          return self;\n        },\n\n        /**\n         * Timing for the most recent layout run.\n         */\n        performance: function() {\n          return {\n            tileCount: tileSpans.length,\n            layoutTime: layoutTime,\n            mapTime: mapTime,\n            reflowTime: reflowTime,\n            totalTime: layoutTime + mapTime + reflowTime\n          };\n        }\n      };\n    }\n\n  /**\n   * Default Gridlist animator simple sets the css for each element;\n   * NOTE: any transitions effects must be manually set in the CSS.\n   * e.g.\n   *\n   *  md-grid-tile {\n   *    transition: all 700ms ease-out 50ms;\n   *  }\n   *\n   */\n  function GridTileAnimator(grid, tiles) {\n    grid.element.css(grid.style);\n    tiles.forEach(function(t) {\n      t.element.css(t.style);\n    })\n  }\n\n  /**\n   * Calculates the positions of tiles.\n   *\n   * The algorithm works as follows:\n   *    An Array<Number> with length colCount (spaceTracker) keeps track of\n   *    available tiling positions, where elements of value 0 represents an\n   *    empty position. Space for a tile is reserved by finding a sequence of\n   *    0s with length <= than the tile's colspan. When such a space has been\n   *    found, the occupied tile positions are incremented by the tile's\n   *    rowspan value, as these positions have become unavailable for that\n   *    many rows.\n   *\n   *    If the end of a row has been reached without finding space for the\n   *    tile, spaceTracker's elements are each decremented by 1 to a minimum\n   *    of 0. Rows are searched in this fashion until space is found.\n   */\n  function calculateGridFor(colCount, tileSpans) {\n    var curCol = 0,\n        curRow = 0,\n        spaceTracker = newSpaceTracker();\n\n    return {\n      positioning: tileSpans.map(function(spans, i) {\n        return {\n          spans: spans,\n          position: reserveSpace(spans, i)\n        };\n      }),\n      rowCount: curRow + Math.max.apply(Math, spaceTracker)\n    }\n\n    function reserveSpace(spans, i) {\n      if (spans.col > colCount) {\n        throw 'md-grid-list: Tile at position ' + i + ' has a colspan ' +\n            '(' + spans.col + ') that exceeds the column count ' +\n            '(' + colCount + ')';\n      }\n\n      var start = 0,\n          end = 0;\n\n      // TODO(shyndman): This loop isn't strictly necessary if you can\n      // determine the minimum number of rows before a space opens up. To do\n      // this, recognize that you've iterated across an entire row looking for\n      // space, and if so fast-forward by the minimum rowSpan count. Repeat\n      // until the required space opens up.\n      while (end - start < spans.col) {\n        if (curCol >= colCount) {\n          nextRow();\n          continue;\n        }\n\n        start = spaceTracker.indexOf(0, curCol);\n        if (start === -1 || (end = findEnd(start + 1)) === -1) {\n          start = end = 0;\n          nextRow();\n          continue;\n        }\n\n        curCol = end + 1;\n      }\n\n      adjustRow(start, spans.col, spans.row);\n      curCol = start + spans.col;\n\n      return {\n        col: start,\n        row: curRow\n      };\n    }\n\n    function nextRow() {\n      curCol = 0;\n      curRow++;\n      adjustRow(0, colCount, -1); // Decrement row spans by one\n    }\n\n    function adjustRow(from, cols, by) {\n      for (var i = from; i < from + cols; i++) {\n        spaceTracker[i] = Math.max(spaceTracker[i] + by, 0);\n      }\n    }\n\n    function findEnd(start) {\n      var i;\n      for (i = start; i < spaceTracker.length; i++) {\n        if (spaceTracker[i] !== 0) {\n          return i;\n        }\n      }\n\n      if (i === spaceTracker.length) {\n        return i;\n      }\n    }\n\n    function newSpaceTracker() {\n      var tracker = [];\n      for (var i = 0; i < colCount; i++) {\n        tracker.push(0);\n      }\n      return tracker;\n    }\n  }\n}\nGridLayoutFactory.$inject = [\"$mdUtil\"];\n\n/**\n * @ngdoc directive\n * @name mdGridTile\n * @module material.components.gridList\n * @restrict E\n * @description\n * Tiles contain the content of an `md-grid-list`. They span one or more grid\n * cells vertically or horizontally, and use `md-grid-tile-{footer,header}` to\n * display secondary content.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-tile` directive supports \"responsive\" attributes, which allow\n * different `md-rowspan` and `md-colspan` values depending on the currently\n * matching media query (as defined in `$mdConstant.MEDIA`).\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-colspan-sm=\"4\"`)\n *\n * @param {number=} md-colspan The number of columns to span (default 1). Cannot\n *    exceed the number of columns in the grid. Supports interpolation.\n * @param {number=} md-rowspan The number of rows to span (default 1). Supports\n *     interpolation.\n *\n * @usage\n * With header:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-header>\n *     <h3>This is a header</h3>\n *   </md-grid-tile-header>\n * </md-grid-tile>\n * </hljs>\n *\n * With footer:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-footer>\n *     <h3>This is a footer</h3>\n *   </md-grid-tile-footer>\n * </md-grid-tile>\n * </hljs>\n *\n * Spanning multiple rows/columns:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"2\" md-rowspan=\"3\">\n * </md-grid-tile>\n * </hljs>\n *\n * Responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"1\" md-colspan-sm=\"3\" md-colspan-md=\"5\">\n * </md-grid-tile>\n * </hljs>\n */\nfunction GridTileDirective($mdMedia) {\n  return {\n    restrict: 'E',\n    require: '^mdGridList',\n    template: '<figure ng-transclude></figure>',\n    transclude: true,\n    scope: {},\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, gridCtrl) {\n    // Apply semantics\n    element.attr('role', 'listitem');\n\n    // If our colspan or rowspan changes, trigger a layout\n    var unwatchAttrs = $mdMedia.watchResponsiveAttributes(['md-colspan', 'md-rowspan'],\n        attrs, angular.bind(gridCtrl, gridCtrl.invalidateLayout));\n\n    // Tile registration/deregistration\n    // TODO(shyndman): Kind of gross to access parent scope like this.\n    //    Consider other options.\n    gridCtrl.addTile(element, attrs, scope.$parent.$index);\n    scope.$on('$destroy', function() {\n      unwatchAttrs();\n      gridCtrl.removeTile(element, attrs);\n    });\n  }\n}\nGridTileDirective.$inject = [\"$mdMedia\"];\n\nfunction GridTileCaptionDirective() {\n  return {\n    template: '<figcaption ng-transclude></figcaption>',\n    transclude: true\n  };\n}\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.icon\n * @description\n * Icon\n */\nangular.module('material.components.icon', [\n    'material.core'\n  ])\n  .directive('mdIcon', mdIconDirective);\n\n/**\n * @ngdoc directive\n * @name mdIcon\n * @module material.components.icon\n *\n * @restrict E\n *\n * @description\n * The `md-icon` directive is an markup element useful for showing an icon based on a font-face\n * or a SVG. Both external SVGs (via URLs) or cached SVG from icon sets can be\n * easily loaded and used.\n *\n * @param {string} md-svg-src String URL [or expression ] used to load, cache, and display an external SVG.\n * @param {string} md-svg-icon String name used for lookup of the icon from the internal cache; interpolated strings or\n * expressions may also be used. Specific set names can be used with the syntax `<set name>:<icon name>`.<br/><br/>\n * To use icon sets, developers are required to pre-register the sets using the `$mdIconProvider` service.\n * @param {string} md-font-icon String name of CSS icon associated with the font-face will be used\n * to render the icon. Requires the fonts and the named CSS styles to be preloaded.\n * @param {string=} alt Labels icon for accessibility. If an empty string is provided, icon\n * will be hidden from accessibility layer with `aria-hidden=\"true\"`. If there's no alt on the icon\n * nor a label on the parent element, a warning will be logged to the console.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-icon md-font-icon=\"android\"          alt=\"android \" ></md-icon>\n *  <md-icon md-svg-icon=\"action:android\"    alt=\"android \" ></md-icon>\n *  <md-icon md-svg-src=\"/android.svg\"       alt=\"android \" ></md-icon>\n *  <md-icon md-svg-src=\"{{ getAndroid() }}\" alt=\"android \" ></md-icon>\n * </hljs>\n */\nfunction mdIconDirective($mdIcon, $mdTheming, $mdAria ) {\n  return {\n    scope: {\n      fontIcon: '@mdFontIcon',\n      svgIcon: '@mdSvgIcon',\n      svgSrc: '@mdSvgSrc'\n    },\n    restrict: 'E',\n    template: getTemplate,\n    link: postLink\n  };\n\n  function getTemplate(element, attr) {\n    return attr.mdFontIcon ? '<span class=\"md-font\" ng-class=\"fontIcon\"></span>' : '';\n  }\n\n  /**\n   * Directive postLink\n   * Supports embedded SVGs, font-icons, & external SVGs\n   */\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n\n    var ariaLabel = attr.alt || scope.fontIcon || scope.svgIcon;\n    var attrName = attr.$normalize(attr.$attr.mdSvgIcon || attr.$attr.mdSvgSrc || '');\n\n    if (attr.alt != '' && !parentsHaveText()) {\n      $mdAria.expect(element, 'aria-label', ariaLabel);\n      $mdAria.expect(element, 'role', 'img');\n    } else {\n      // Hide from the accessibility layer.\n      $mdAria.expect(element, 'aria-hidden', 'true');\n    }\n\n    if (attrName) {\n      // Use either pre-configured SVG or URL source, respectively.\n      attr.$observe(attrName, function(attrVal) {\n\n        element.empty();\n        if (attrVal) {\n          $mdIcon(attrVal).then(function(svg) {\n            element.append(svg);\n          });\n        }\n\n      });\n    }\n    function parentsHaveText() {\n      var parent = element.parent();\n      if (parent.attr('aria-label') || parent.text()) {\n        return true;\n      }\n      else if(parent.parent().attr('aria-label') || parent.parent().text()) {\n        return true;\n      }\n      return false;\n    }\n  }\n}\nmdIconDirective.$inject = [\"$mdIcon\", \"$mdTheming\", \"$mdAria\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n  'use strict';\n\n  angular\n    .module('material.components.icon' )\n    .provider('$mdIcon', MdIconProvider);\n\n  /**\n    * @ngdoc service\n    * @name $mdIconProvider\n    * @module material.components.icon\n    *\n    * @description\n    * `$mdIconProvider` is used only to register icon IDs with URLs. These configuration features allow\n    * icons and icon sets to be pre-registered and associated with source URLs **before** the `<md-icon />`\n    * directives are compiled.\n    *\n    * Loading of the actual svg files are deferred to on-demand requests and are loaded\n    * internally by the `$mdIcon` service using the `$http` service. When an SVG is requested by name/ID,\n    * the `$mdIcon` service searches its registry for the associated source URL;\n    * that URL is used to on-demand load and parse the SVG dynamically.\n    *\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSet('my/app/icons.svg')       // Register a default set of SVG icons\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set of SVGs\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n    * </hljs>\n    *\n    * SVG icons and icon sets can be easily pre-loaded and cached using either (a) a build process or (b) a runtime\n    * **startup** process (shown below):\n    *\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Register a default set of SVG icon definitions\n    *     $mdIconProvider.defaultIconSet('my/app/icons.svg')\n    *\n    *   })\n    *   .run(function($http, $templateCache){\n    *\n    *     // Pre-fetch icons sources by URL and cache in the $templateCache...\n    *     // subsequent $http calls will look there first.\n    *\n    *     var urls = [ 'imy/app/icons.svg', 'img/icons/android.svg'];\n    *\n    *     angular.forEach(urls, function(url) {\n    *       $http.get(url, {cache: $templateCache});\n    *     });\n    *\n    *   });\n    *\n    * </hljs>\n    *\n    * NOTE: the loaded SVG data is subsequently cached internally for future requests.\n    *\n    */\n\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#icon\n    *\n    * @description\n    * Register a source URL for a specific icon name; the name may include optional 'icon set' name prefix.\n    * These icons  will later be retrieved from the cache using `$mdIcon( <icon name> )`\n    *\n    * @param {string} id Icon name/id used to register the icon\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#iconSet\n    *\n    * @description\n    * Register a source URL for a 'named' set of icons; group of SVG definitions where each definition\n    * has an icon id. Individual icons can be subsequently retrieved from this cached set using\n    * `$mdIcon( <icon set name>:<icon name> )`\n    *\n    * @param {string} id Icon name/id used to register the iconset\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#defaultIconSet\n    *\n    * @description\n    * Register a source URL for the default 'named' set of icons. Unless explicitly registered,\n    * subsequent lookups of icons will failover to search this 'default' icon set.\n    * Icon can be retrieved from this cached, default set using `$mdIcon( <icon name> )`\n    *\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSet( 'my/app/social.svg' )   // Register a default icon set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#defaultIconSize\n    *\n    * @description\n    * While `<md-icon />` markup can also be style with sizing CSS, this method configures\n    * the default width **and** height used for all icons; unless overridden by specific CSS.\n    * The default sizing is (24px, 24px).\n    *\n    * @param {string} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSize(36)   // Register a default icon size (width == height)\n    *   });\n    * </hljs>\n    *\n    */\n\n var config = {\n   defaultIconSize: 24\n };\n\n function MdIconProvider() { }\n\n MdIconProvider.prototype = {\n   icon : function icon(id, url, iconSize) {\n     if ( id.indexOf(':') == -1 ) id = '$default:' + id;\n\n     config[id] = new ConfigurationItem(url, iconSize );\n     return this;\n   },\n\n   iconSet : function iconSet(id, url, iconSize) {\n     config[id] = new ConfigurationItem(url, iconSize );\n     return this;\n   },\n\n   defaultIconSet : function defaultIconSet(url, iconSize) {\n     var setName = '$default';\n\n     if ( !config[setName] ) {\n       config[setName] = new ConfigurationItem(url, iconSize );\n     }\n\n     config[setName].iconSize = iconSize || config.defaultIconSize;\n\n     return this;\n   },\n\n   defaultIconSize : function defaultIconSize(iconSize) {\n     config.defaultIconSize = iconSize;\n     return this;\n   },\n\n   preloadIcons: function ($templateCache) {\n     var iconProvider = this;\n     var svgRegistry = [\n       {\n         id : 'tabs-arrow',\n         url: 'tabs-arrow.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"tabs-arrow\"><polygon points=\"15.4,7.4 14,6 8,12 14,18 15.4,16.6 10.8,12 \"/></g></svg>'\n       },\n       {\n         id : 'close',\n         url: 'close.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g></svg>'\n       },\n       {\n         id:  'cancel',\n         url: 'cancel.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g></svg>'\n       }\n     ];\n\n     svgRegistry.forEach(function(asset){\n       iconProvider.icon(asset.id,  asset.url);\n       $templateCache.put(asset.url, asset.svg);\n     });\n\n   },\n\n   $get : ['$http', '$q', '$log', '$templateCache', function($http, $q, $log, $templateCache) {\n     this.preloadIcons($templateCache);\n     return new MdIconService(config, $http, $q, $log, $templateCache);\n   }]\n };\n\n   /**\n    *  Configuration item stored in the Icon registry; used for lookups\n    *  to load if not already cached in the `loaded` cache\n    */\n   function ConfigurationItem(url, iconSize) {\n     this.url = url;\n     this.iconSize = iconSize || config.defaultIconSize;\n   }\n\n /**\n  * @ngdoc service\n  * @name $mdIcon\n  * @module material.components.icon\n  *\n  * @description\n  * The `$mdIcon` service is a function used to lookup SVG icons.\n  *\n  * @param {string} id Query value for a unique Id or URL. If the argument is a URL, then the service will retrieve the icon element\n  * from its internal cache or load the icon and cache it first. If the value is not a URL-type string, then an ID lookup is\n  * performed. The Id may be a unique icon ID or may include an iconSet ID prefix.\n  *\n  * For the **id** query to work properly, this means that all id-to-URL mappings must have been previously configured\n  * using the `$mdIconProvider`.\n  *\n  * @returns {obj} Clone of the initial SVG DOM element; which was created from the SVG markup in the SVG data file.\n  *\n  * @usage\n  * <hljs lang=\"js\">\n  * function SomeDirective($mdIcon) {\n  *\n  *   // See if the icon has already been loaded, if not\n  *   // then lookup the icon from the registry cache, load and cache\n  *   // it for future requests.\n  *   // NOTE: ID queries require configuration with $mdIconProvider\n  *\n  *   $mdIcon('android').then(function(iconEl)    { element.append(iconEl); });\n  *   $mdIcon('work:chair').then(function(iconEl) { element.append(iconEl); });\n  *\n  *   // Load and cache the external SVG using a URL\n  *\n  *   $mdIcon('img/icons/android.svg').then(function(iconEl) {\n  *     element.append(iconEl);\n  *   });\n  * };\n  * </hljs>\n  *\n  * NOTE: The `md-icon` directive internally uses the `$mdIcon` service to query, loaded, and instantiate\n  * SVG DOM elements.\n  */\n function MdIconService(config, $http, $q, $log, $templateCache) {\n   var iconCache = {};\n   var urlRegex = /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/i;\n\n   Icon.prototype = { clone : cloneSVG, prepare: prepareAndStyle };\n\n   return function getIcon(id) {\n     id = id || '';\n\n     // If already loaded and cached, use a clone of the cached icon.\n     // Otherwise either load by URL, or lookup in the registry and then load by URL, and cache.\n\n     if ( iconCache[id]         ) return $q.when( iconCache[id].clone() );\n     if ( urlRegex.test(id)     ) return loadByURL(id).then( cacheIcon(id) );\n     if ( id.indexOf(':') == -1 ) id = '$default:' + id;\n\n     return loadByID(id)\n         .catch(loadFromIconSet)\n         .catch(announceIdNotFound)\n         .catch(announceNotFound)\n         .then( cacheIcon(id) );\n   };\n\n   /**\n    * Prepare and cache the loaded icon for the specified `id`\n    */\n   function cacheIcon( id ) {\n\n     return function updateCache( icon ) {\n       iconCache[id] = isIcon(icon) ? icon : new Icon(icon, config[id]);\n\n       return iconCache[id].clone();\n     };\n   }\n\n   /**\n    * Lookup the configuration in the registry, if !registered throw an error\n    * otherwise load the icon [on-demand] using the registered URL.\n    *\n    */\n   function loadByID(id) {\n     var iconConfig = config[id];\n\n     return !iconConfig ? $q.reject(id) : loadByURL(iconConfig.url).then(function(icon) {\n       return new Icon(icon, iconConfig);\n     });\n   }\n\n   /**\n    *    Loads the file as XML and uses querySelector( <id> ) to find\n    *    the desired node...\n    */\n   function loadFromIconSet(id) {\n     var setName = id.substring(0, id.lastIndexOf(':')) || '$default';\n     var iconSetConfig = config[setName];\n\n     return !iconSetConfig ? $q.reject(id) : loadByURL(iconSetConfig.url).then(extractFromSet);\n\n     function extractFromSet(set) {\n       var iconName = id.slice(id.lastIndexOf(':') + 1);\n       var icon = set.querySelector('#' + iconName);\n       return !icon ? $q.reject(id) : new Icon(icon, iconSetConfig);\n     }\n   }\n\n   /**\n    * Load the icon by URL (may use the $templateCache).\n    * Extract the data for later conversion to Icon\n    */\n   function loadByURL(url) {\n     return $http\n       .get(url, { cache: $templateCache })\n       .then(function(response) {\n         var els = angular.element(response.data);\n         // Iterate to find first svg node, allowing for comments in loaded SVG (common with auto-generated SVGs)\n         for (var i = 0; i < els.length; ++i) {\n           if (els[i].nodeName == 'svg') {\n             return els[i];\n           }\n         }\n       });\n   }\n\n   /**\n    * User did not specify a URL and the ID has not been registered with the $mdIcon\n    * registry\n    */\n   function announceIdNotFound(id) {\n     var msg;\n\n     if (angular.isString(id)) {\n       msg = 'icon ' + id + ' not found';\n       $log.warn(msg);\n     }\n\n     return $q.reject(msg || id);\n   }\n\n   /**\n    * Catch HTTP or generic errors not related to incorrect icon IDs.\n    */\n   function announceNotFound(err) {\n     var msg = angular.isString(err) ? err : (err.message || err.data || err.statusText);\n     $log.warn(msg);\n\n     return $q.reject(msg);\n   }\n\n   /**\n    * Check target signature to see if it is an Icon instance.\n    */\n   function isIcon(target) {\n     return angular.isDefined(target.element) && angular.isDefined(target.config);\n   }\n\n   /**\n    *  Define the Icon class\n    */\n   function Icon(el, config) {\n     if (el.tagName != 'svg') {\n       el = angular.element('<svg xmlns=\"http://www.w3.org/2000/svg\">').append(el)[0];\n     }\n     el = angular.element(el);\n\n     // Inject the namespace if not available...\n     if ( !el.attr('xmlns') ) {\n       el.attr('xmlns', \"http://www.w3.org/2000/svg\");\n     }\n\n     this.element = el;\n     this.config = config;\n     this.prepare();\n   }\n\n   /**\n    *  Prepare the DOM element that will be cached in the\n    *  loaded iconCache store.\n    */\n   function prepareAndStyle() {\n     var iconSize = this.config ? this.config.iconSize : config.defaultIconSize;\n     var svg = angular.element( this.element );\n         svg.attr({\n           'fit'   : '',\n           'height': '100%',\n           'width' : '100%',\n           'preserveAspectRatio': 'xMidYMid meet',\n           'viewBox' : svg.attr('viewBox') || ('0 0 ' + iconSize + ' ' + iconSize)\n         })\n         .css( {\n           'pointer-events' : 'none',\n           'display' : 'block'\n         });\n\n     this.element = svg;\n   }\n\n   /**\n    * Clone the Icon DOM element; which is stored as an angular.element()\n    */\n   function cloneSVG(){\n     return angular.element( this.element[0].cloneNode(true) );\n   }\n\n }\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n\n/**\n * @ngdoc module\n * @name material.components.input\n */\n\nangular.module('material.components.input', [\n  'material.core'\n])\n  .directive('mdInputContainer', mdInputContainerDirective)\n  .directive('label', labelDirective)\n  .directive('input', inputTextareaDirective)\n  .directive('textarea', inputTextareaDirective)\n  .directive('mdMaxlength', mdMaxlengthDirective)\n  .directive('placeholder', placeholderDirective);\n\n/**\n * @ngdoc directive\n * @name mdInputContainer\n * @module material.components.input\n *\n * @restrict E\n *\n * @description\n * `<md-input-container>` is the parent of any input or textarea element.\n *\n * Input and textarea elements will not behave properly unless the md-input-container\n * parent is provided.\n *\n * @param md-is-error {expression=} When the given expression evaluates to true, the input container will go into error state. Defaults to erroring if the input has been touched and is invalid.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Username</label>\n *   <input type=\"text\" ng-model=\"user.name\">\n * </md-input-container>\n *\n * <md-input-container>\n *   <label>Description</label>\n *   <textarea ng-model=\"user.description\"></textarea>\n * </md-input-container>\n *\n * </hljs>\n */\nfunction mdInputContainerDirective($mdTheming, $parse) {\n  ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\"];\n  return {\n    restrict: 'E',\n    link: postLink,\n    controller: ContainerCtrl\n  };\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n  }\n  function ContainerCtrl($scope, $element, $attrs) {\n    var self = this;\n\n    self.isErrorGetter = $attrs.mdIsError && $parse($attrs.mdIsError);\n\n    self.element = $element;\n    self.setFocused = function(isFocused) {\n      $element.toggleClass('md-input-focused', !!isFocused);\n    };\n    self.setHasValue = function(hasValue) {\n      $element.toggleClass('md-input-has-value', !!hasValue);\n    };\n    self.setInvalid = function(isInvalid) {\n      $element.toggleClass('md-input-invalid', !!isInvalid);\n    };\n    $scope.$watch(function() {\n      return self.label && self.input;\n    }, function(hasLabelAndInput) {\n      if (hasLabelAndInput && !self.label.attr('for')) {\n        self.label.attr('for', self.input.attr('id'));\n      }\n    });\n  }\n}\nmdInputContainerDirective.$inject = [\"$mdTheming\", \"$parse\"];\n\nfunction labelDirective() {\n  return {\n    restrict: 'E',\n    require: '^?mdInputContainer',\n    link: function(scope, element, attr, containerCtrl) {\n      if (!containerCtrl || attr.mdNoFloat) return;\n\n      containerCtrl.label = element;\n      scope.$on('$destroy', function() {\n        containerCtrl.label = null;\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdInput\n * @restrict E\n * @module material.components.input\n *\n * @description\n * Use the `<input>` or the  `<textarea>` as a child of an `<md-input-container>`.\n *\n * @param {number=} md-maxlength The maximum number of characters allowed in this input. If this is specified, a character counter will be shown underneath the input.<br/><br/>\n * The purpose of **`md-maxength`** is exactly to show the max length counter text. If you don't want the counter text and only need \"plain\" validation, you can use the \"simple\" `ng-maxlength` or maxlength attributes.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-input-container>\n *   <label>Color</label>\n *   <input type=\"text\" ng-model=\"color\" required md-maxlength=\"10\">\n * </md-input-container>\n * </hljs>\n * <h3>With Errors (uses [ngMessages](https://docs.angularjs.org/api/ngMessages))</h3>\n * <hljs lang=\"html\">\n * <form name=\"userForm\">\n *   <md-input-container>\n *     <label>Last Name</label>\n *     <input name=\"lastName\" ng-model=\"lastName\" required md-maxlength=\"10\" minlength=\"4\">\n *     <div ng-messages=\"userForm.lastName.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *       <div ng-message=\"minlength\">That's too short!</div>\n *     </div>\n *   </md-input-container>\n *   <md-input-container>\n *     <label>Biography</label>\n *     <textarea name=\"bio\" ng-model=\"biography\" required md-maxlength=\"150\"></textarea>\n *     <div ng-messages=\"userForm.bio.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *     </div>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n *\n */\n\nfunction inputTextareaDirective($mdUtil, $window) {\n  return {\n    restrict: 'E',\n    require: ['^?mdInputContainer', '?ngModel'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n\n    var containerCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n    var isReadonly = angular.isDefined(attr.readonly);\n\n    if ( !containerCtrl ) return;\n    if (containerCtrl.input) {\n      throw new Error(\"<md-input-container> can only have *one* <input> or <textarea> child element!\");\n    }\n    containerCtrl.input = element;\n\n    element.addClass('md-input');\n    if (!element.attr('id')) {\n      element.attr('id', 'input_' + $mdUtil.nextUid());\n    }\n\n    if (element[0].tagName.toLowerCase() === 'textarea') {\n      setupTextarea();\n    }\n\n    var isErrorGetter = containerCtrl.isErrorGetter || function() {\n      return ngModelCtrl.$invalid && ngModelCtrl.$touched;\n    };\n    scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n\n    ngModelCtrl.$parsers.push(ngModelPipelineCheckValue);\n    ngModelCtrl.$formatters.push(ngModelPipelineCheckValue);\n\n    element.on('input', inputCheckValue);\n\n    if (!isReadonly) {\n      element\n        .on('focus', function(ev) {\n          containerCtrl.setFocused(true);\n\n          // Error text should not appear before user interaction with the field.\n          // So we need to check on focus also\n          ngModelCtrl.$setTouched();\n          if ( isErrorGetter() ) containerCtrl.setInvalid(true);\n\n        })\n        .on('blur', function(ev) {\n          containerCtrl.setFocused(false);\n          inputCheckValue();\n        });\n\n    }\n\n    scope.$on('$destroy', function() {\n      containerCtrl.setFocused(false);\n      containerCtrl.setHasValue(false);\n      containerCtrl.input = null;\n    });\n\n    /**\n     *\n     */\n    function ngModelPipelineCheckValue(arg) {\n      containerCtrl.setHasValue(!ngModelCtrl.$isEmpty(arg));\n      return arg;\n    }\n    function inputCheckValue() {\n      // An input's value counts if its length > 0,\n      // or if the input's validity state says it has bad input (eg string in a number input)\n      containerCtrl.setHasValue(element.val().length > 0 || (element[0].validity||{}).badInput);\n    }\n\n    function setupTextarea() {\n      var node = element[0];\n      var onChangeTextarea = $mdUtil.debounce(growTextarea, 1);\n\n      function pipelineListener(value) {\n        onChangeTextarea();\n        return value;\n      }\n\n      if (ngModelCtrl) {\n        ngModelCtrl.$formatters.push(pipelineListener);\n        ngModelCtrl.$viewChangeListeners.push(pipelineListener);\n      } else {\n        onChangeTextarea();\n      }\n      element.on('keydown input', onChangeTextarea);\n      element.on('scroll', onScroll);\n      angular.element($window).on('resize', onChangeTextarea);\n\n      scope.$on('$destroy', function() {\n        angular.element($window).off('resize', onChangeTextarea);\n      });\n\n      function growTextarea() {\n        node.style.height = \"auto\";\n        node.scrollTop = 0;\n        var height = getHeight();\n        if (height) node.style.height = height + 'px';\n      }\n\n      function getHeight () {\n        var line = node.scrollHeight - node.offsetHeight;\n        return node.offsetHeight + (line > 0 ? line : 0);\n      }\n\n      function onScroll(e) {\n        node.scrollTop = 0;\n        // for smooth new line adding\n        var line = node.scrollHeight - node.offsetHeight;\n        var height = node.offsetHeight + line;\n        node.style.height = height + 'px';\n      }\n    }\n  }\n}\ninputTextareaDirective.$inject = [\"$mdUtil\", \"$window\"];\n\nfunction mdMaxlengthDirective($animate) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^mdInputContainer'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var maxlength;\n    var ngModelCtrl = ctrls[0];\n    var containerCtrl = ctrls[1];\n    var charCountEl = angular.element('<div class=\"md-char-counter\">');\n\n    // Stop model from trimming. This makes it so whitespace\n    // over the maxlength still counts as invalid.\n    attr.$set('ngTrim', 'false');\n    containerCtrl.element.append(charCountEl);\n\n    ngModelCtrl.$formatters.push(renderCharCount);\n    ngModelCtrl.$viewChangeListeners.push(renderCharCount);\n    element.on('input keydown', function() {\n      renderCharCount(); //make sure it's called with no args\n    });\n\n    scope.$watch(attr.mdMaxlength, function(value) {\n      maxlength = value;\n      if (angular.isNumber(value) && value > 0) {\n        if (!charCountEl.parent().length) {\n          $animate.enter(charCountEl, containerCtrl.element,\n                         angular.element(containerCtrl.element[0].lastElementChild));\n        }\n        renderCharCount();\n      } else {\n        $animate.leave(charCountEl);\n      }\n    });\n\n    ngModelCtrl.$validators['md-maxlength'] = function(modelValue, viewValue) {\n      if (!angular.isNumber(maxlength) || maxlength < 0) {\n        return true;\n      }\n      return ( modelValue || element.val() || viewValue || '' ).length <= maxlength;\n    };\n\n    function renderCharCount(value) {\n      charCountEl.text( ( element.val() || value || '' ).length + '/' + maxlength );\n      return value;\n    }\n  }\n}\nmdMaxlengthDirective.$inject = [\"$animate\"];\n\nfunction placeholderDirective() {\n  return {\n    restrict: 'A',\n    require: '^^?mdInputContainer',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, inputContainer) {\n    if (!inputContainer) return;\n\n    var placeholderText = attr.placeholder;\n    element.removeAttr('placeholder');\n\n    inputContainer.element.append('<div class=\"md-placeholder\">' + placeholderText + '</div>');\n  }\n}\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.list\n * @description\n * List module\n */\nangular.module('material.components.list', [\n  'material.core'\n])\n  .directive('mdList', mdListDirective)\n  .directive('mdItem', mdItemDirective);\n\n/**\n * @ngdoc directive\n * @name mdList\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-list>` directive is a list container for 1..n `<md-item>` tags.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-list>\n *   <md-item ng-repeat=\"item in todos\">\n *     <md-item-content>\n *       <div class=\"md-tile-left\">\n *         <img ng-src=\"{{item.face}}\" class=\"face\" alt=\"{{item.who}}\">\n *       </div>\n *       <div class=\"md-tile-content\">\n *         <h3>{{item.what}}</h3>\n *         <h4>{{item.who}}</h4>\n *         <p>\n *           {{item.notes}}\n *         </p>\n *       </div>\n *     </md-item-content>\n *   </md-item>\n * </md-list>\n * </hljs>\n *\n */\nfunction mdListDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'list'\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdItem\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-item>` directive is a container intended for row items in a `<md-list>` container.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-list>\n *    <md-item>\n *            Item content in list\n *    </md-item>\n *  </md-list>\n * </hljs>\n *\n */\nfunction mdItemDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'listitem'\n      });\n    }\n  };\n}\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.progressCircular\n * @description Circular Progress module!\n */\nangular.module('material.components.progressCircular', [\n  'material.core'\n])\n  .directive('mdProgressCircular', MdProgressCircularDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressCircular\n * @module material.components.progressCircular\n * @restrict E\n *\n* @description\n * The circular progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of two modes: determinate and indeterminate.\n * @param {number=} value In determinate mode, this number represents the percentage of the circular progress. Default: 0\n * @param {number=} md-diameter This specifies the diamter of the circular progress. Default: 48\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-circular md-mode=\"determinate\" value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" ng-value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" value=\"...\" md-diameter=\"100\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"indeterminate\"></md-progress-circular>\n * </hljs>\n */\nfunction MdProgressCircularDirective($$rAF, $mdConstant, $mdTheming) {\n  var fillRotations = new Array(101),\n    fixRotations = new Array(101);\n\n  for (var i = 0; i < 101; i++) {\n    var percent = i / 100;\n    var rotation = Math.floor(percent * 180);\n\n    fillRotations[i] = 'rotate(' + rotation.toString() + 'deg)';\n    fixRotations[i] = 'rotate(' + (rotation * 2).toString() + 'deg)';\n  }\n\n  return {\n    restrict: 'E',\n    template:\n        '<div class=\"md-spinner-wrapper\">' +\n          '<div class=\"md-inner\">' +\n            '<div class=\"md-gap\"></div>' +\n            '<div class=\"md-left\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n            '<div class=\"md-right\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n          '</div>' +\n        '</div>',\n    compile: compile\n  };\n\n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var circle = element[0],\n      fill = circle.querySelectorAll('.md-fill, .md-mask.md-full'),\n      fix = circle.querySelectorAll('.md-fill.md-fix'),\n      i, clamped, fillRotation, fixRotation;\n\n    var diameter = attr.mdDiameter || 48;\n    var scale = diameter/48;\n\n    circle.style[$mdConstant.CSS.TRANSFORM] = 'scale(' + scale.toString() + ')';\n\n    attr.$observe('value', function(value) {\n      clamped = clamp(value);\n      fillRotation = fillRotations[clamped];\n      fixRotation = fixRotations[clamped];\n\n      element.attr('aria-valuenow', clamped);\n\n      for (i = 0; i < fill.length; i++) {\n        fill[i].style[$mdConstant.CSS.TRANSFORM] = fillRotation;\n      }\n\n      for (i = 0; i < fix.length; i++) {\n        fix[i].style[$mdConstant.CSS.TRANSFORM] = fixRotation;\n      }\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressCircularDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.progressLinear\n * @description Linear Progress module!\n */\nangular.module('material.components.progressLinear', [\n  'material.core'\n])\n  .directive('mdProgressLinear', MdProgressLinearDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressLinear\n * @module material.components.progressLinear\n * @restrict E\n *\n * @description\n * The linear progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content. Each operation should only be represented by one activity indicator—for example, one refresh operation should not display both a refresh bar and an activity circle.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n * @param {number=} md-buffer-value In the buffer mode, this number represents the precentage of the secondary progress bar. Default: 0\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-linear md-mode=\"determinate\" value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"determinate\" ng-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"indeterminate\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"buffer\" value=\"...\" md-buffer-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"query\"></md-progress-linear>\n * </hljs>\n */\nfunction MdProgressLinearDirective($$rAF, $mdConstant, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    template: '<div class=\"md-container\">' +\n      '<div class=\"md-dashed\"></div>' +\n      '<div class=\"md-bar md-bar1\"></div>' +\n      '<div class=\"md-bar md-bar2\"></div>' +\n      '</div>',\n    compile: compile\n  };\n  \n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var bar1Style = element[0].querySelector('.md-bar1').style,\n      bar2Style = element[0].querySelector('.md-bar2').style,\n      container = angular.element(element[0].querySelector('.md-container'));\n\n    attr.$observe('value', function(value) {\n      if (attr.mdMode == 'query') {\n        return;\n      }\n\n      var clamped = clamp(value);\n      element.attr('aria-valuenow', clamped);\n      bar2Style[$mdConstant.CSS.TRANSFORM] = transforms[clamped];\n    });\n\n    attr.$observe('mdBufferValue', function(value) {\n      bar1Style[$mdConstant.CSS.TRANSFORM] = transforms[clamp(value)];\n    });\n\n    $$rAF(function() {\n      container.addClass('md-ready');\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressLinearDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n\n\n// **********************************************************\n// Private Methods\n// **********************************************************\nvar transforms = (function() {\n  var values = new Array(101);\n  for(var i = 0; i < 101; i++){\n    values[i] = makeTransform(i);\n  }\n\n  return values;\n\n  function makeTransform(value){\n    var scale = value/100;\n    var translateX = (value-100)/2;\n    return 'translateX(' + translateX.toString() + '%) scale(' + scale.toString() + ', 1)';\n  }\n})();\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.radioButton\n * @description radioButton module!\n */\nangular.module('material.components.radioButton', [\n  'material.core'\n])\n  .directive('mdRadioGroup', mdRadioGroupDirective)\n  .directive('mdRadioButton', mdRadioButtonDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioGroup\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-group>` directive identifies a grouping\n * container for the 1..n grouped radio buttons; specified using nested\n * `<md-radio-button>` tags.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the radio button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * Note: `<md-radio-group>` and `<md-radio-button>` handle tabindex differently\n * than the native `<input type='radio'>` controls. Whereas the native controls\n * force the user to tab through all the radio buttons, `<md-radio-group>`\n * is focusable, and by default the `<md-radio-button>`s are not.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-radio-group ng-model=\"selected\">\n *\n *   <md-radio-button\n *        ng-repeat=\"d in colorOptions\"\n *        ng-value=\"d.value\" aria-label=\"{{ d.label }}\">\n *\n *          {{ d.label }}\n *\n *   </md-radio-button>\n *\n * </md-radio-group>\n * </hljs>\n *\n */\nfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming) {\n  RadioGroupController.prototype = createRadioGroupControllerProto();\n\n  return {\n    restrict: 'E',\n    controller: ['$element', RadioGroupController],\n    require: ['mdRadioGroup', '?ngModel'],\n    link: { pre: linkRadioGroup }\n  };\n\n  function linkRadioGroup(scope, element, attr, ctrls) {\n    $mdTheming(element);\n    var rgCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\n    function keydownListener(ev) {\n      switch(ev.keyCode) {\n        case $mdConstant.KEY_CODE.LEFT_ARROW:\n        case $mdConstant.KEY_CODE.UP_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectPrevious();\n          break;\n\n        case $mdConstant.KEY_CODE.RIGHT_ARROW:\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectNext();\n          break;\n\n        case $mdConstant.KEY_CODE.ENTER:\n          var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n          if (form.length > 0) {\n            form.triggerHandler('submit');\n          }\n          break;\n      }\n    }\n\n    rgCtrl.init(ngModelCtrl);\n\n    element.attr({\n              'role': 'radiogroup',\n              'tabIndex': element.attr('tabindex') || '0'\n            })\n            .on('keydown', keydownListener);\n\n  }\n\n  function RadioGroupController($element) {\n    this._radioButtonRenderFns = [];\n    this.$element = $element;\n  }\n\n  function createRadioGroupControllerProto() {\n    return {\n      init: function(ngModelCtrl) {\n        this._ngModelCtrl = ngModelCtrl;\n        this._ngModelCtrl.$render = angular.bind(this, this.render);\n      },\n      add: function(rbRender) {\n        this._radioButtonRenderFns.push(rbRender);\n      },\n      remove: function(rbRender) {\n        var index = this._radioButtonRenderFns.indexOf(rbRender);\n        if (index !== -1) {\n          this._radioButtonRenderFns.splice(index, 1);\n        }\n      },\n      render: function() {\n        this._radioButtonRenderFns.forEach(function(rbRender) {\n          rbRender();\n        });\n      },\n      setViewValue: function(value, eventType) {\n        this._ngModelCtrl.$setViewValue(value, eventType);\n        // update the other radio buttons as well\n        this.render();\n      },\n      getViewValue: function() {\n        return this._ngModelCtrl.$viewValue;\n      },\n      selectNext: function() {\n        return changeSelectedButton(this.$element, 1);\n      },\n      selectPrevious: function() {\n        return changeSelectedButton(this.$element, -1);\n      },\n      setActiveDescendant: function (radioId) {\n        this.$element.attr('aria-activedescendant', radioId);\n      }\n    };\n  }\n  /**\n   * Change the radio group's selected button by a given increment.\n   * If no button is selected, select the first button.\n   */\n  function changeSelectedButton(parent, increment) {\n    // Coerce all child radio buttons into an array, then wrap then in an iterator\n    var buttons = $mdUtil.iterator(parent[0].querySelectorAll('md-radio-button'), true);\n\n    if (buttons.count()) {\n      var validate = function (button) {\n        // If disabled, then NOT valid\n        return !angular.element(button).attr(\"disabled\");\n      };\n      var selected = parent[0].querySelector('md-radio-button.md-checked');\n      var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n      // Activate radioButton's click listener (triggerHandler won't create a real click event)\n      angular.element(target).triggerHandler('click');\n\n\n    }\n  }\n\n}\nmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioButton\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-button>`directive is the child directive required to be used within `<md-radio-group>` elements.\n *\n * While similar to the `<input type=\"radio\" ng-model=\"\" value=\"\">` directive,\n * the `<md-radio-button>` directive provides ink effects, ARIA support, and\n * supports use within named radio groups.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {string} ngValue Angular expression which sets the value to which the expression should\n *    be set when selected.*\n * @param {string} value The value to which the expression should be set when selected.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} ariaLabel Adds label to radio button for accessibility.\n * Defaults to radio button's text. If no text content is available, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-radio-button value=\"1\" aria-label=\"Label 1\">\n *   Label 1\n * </md-radio-button>\n *\n * <md-radio-button ng-model=\"color\" ng-value=\"specialValue\" aria-label=\"Green\">\n *   Green\n * </md-radio-button>\n *\n * </hljs>\n *\n */\nfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    require: '^mdRadioGroup',\n    transclude: true,\n    template: '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n                '<div class=\"md-off\"></div>' +\n                '<div class=\"md-on\"></div>' +\n              '</div>' +\n              '<div ng-transclude class=\"md-label\"></div>',\n    link: link\n  };\n\n  function link(scope, element, attr, rgCtrl) {\n    var lastChecked;\n\n    $mdTheming(element);\n    configureAria(element, scope);\n\n    rgCtrl.add(render);\n    attr.$observe('value', render);\n\n    element\n      .on('click', listener)\n      .on('$destroy', function() {\n        rgCtrl.remove(render);\n      });\n\n    function listener(ev) {\n      if (element[0].hasAttribute('disabled')) return;\n\n      scope.$apply(function() {\n        rgCtrl.setViewValue(attr.value, ev && ev.type);\n      });\n    }\n\n    function render() {\n      var checked = (rgCtrl.getViewValue() == attr.value);\n      if (checked === lastChecked) {\n        return;\n      }\n      lastChecked = checked;\n      element.attr('aria-checked', checked);\n      if (checked) {\n        element.addClass(CHECKED_CSS);\n        rgCtrl.setActiveDescendant(element.attr('id'));\n      } else {\n        element.removeClass(CHECKED_CSS);\n      }\n    }\n    /**\n     * Inject ARIA-specific attributes appropriate for each radio button\n     */\n    function configureAria( element, scope ){\n      scope.ariaId = buildAriaID();\n\n      element.attr({\n        'id' :  scope.ariaId,\n        'role' : 'radio',\n        'aria-checked' : 'false'\n      });\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      /**\n       * Build a unique ID for each radio button that will be used with aria-activedescendant.\n       * Preserve existing ID if already specified.\n       * @returns {*|string}\n       */\n      function buildAriaID() {\n        return attr.id || ( 'radio' + \"_\" + $mdUtil.nextUid() );\n      }\n    }\n  }\n}\nmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n/**\n * @ngdoc module\n * @name material.components.select\n */\n\n/***************************************************\n\n### TODO ###\n**DOCUMENTATION AND DEMOS**\n\n- [ ] ng-model with child mdOptions (basic)\n- [ ] ng-model=\"foo\" ng-model-options=\"{ trackBy: '$value.id' }\" for objects\n- [ ] mdOption with value\n- [ ] Usage with input inside\n- [ ] Usage with md-multiple\n\n### TODO - POST RC1 ###\n- [ ] Abstract placement logic in $mdSelect service to $mdMenu service\n\n***************************************************/\n\nvar SELECT_EDGE_MARGIN = 8;\nvar selectNextId = 0;\n\nangular.module('material.components.select', [\n  'material.core',\n  'material.components.backdrop'\n])\n.directive('mdSelect', SelectDirective)\n.directive('mdSelectMenu', SelectMenuDirective)\n.directive('mdOption', OptionDirective)\n.directive('mdOptgroup', OptgroupDirective)\n.provider('$mdSelect', SelectProvider);\n\n\n/**\n * @ngdoc directive\n * @name mdSelect\n * @restrict E\n * @module material.components.select\n *\n * @description Displays a select box, bound to an ng-model.\n *\n * @param {expression} ng-model The model!\n * @param {boolean=} multiple Whether it's multiple.\n * @param {string=} placeholder Placeholder hint text.\n *\n * @usage\n * With a placeholder (label is added dynamically)\n * <hljs lang=\"html\">\n *   <md-select\n *     ng-model=\"someModel\"\n *     placeholder=\"Select a state\">\n *     <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *   </md-select>\n * </hljs>\n *\n * With an explicit label\n * <hljs lang=\"html\">\n *   <md-select\n *     ng-model=\"someModel\">\n *     <md-select-label>Select a state</md-select-label>\n *     <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *   </md-select>\n * </hljs>\n */\nfunction SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile, $parse) {\n  var intStart = $interpolate.startSymbol();\n  var intEnd = $interpolate.endSymbol();\n\n  return {\n    restrict: 'E',\n    require: '?ngModel',\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    // The user is allowed to provide a label for the select as md-select-label child\n    var labelEl = element.find('md-select-label').remove();\n\n    // If not provided, we automatically make one\n    if (!labelEl.length) {\n      labelEl = angular.element('<md-select-label><span></span></md-select-label>');\n    }\n    labelEl.append('<span class=\"md-select-icon\" aria-hidden=\"true\"></span>');\n    labelEl.addClass('md-select-label');\n    labelEl.addClass(intStart + attr.ngModel + ' !== undefined ? \\'\\' : \\'md-placeholder\\'' + intEnd);\n    labelEl.attr('id', 'select_label_' + $mdUtil.nextUid());\n\n    // There's got to be an md-content inside. If there's not one, let's add it.\n    if (!element.find('md-content').length) {\n      element.append( angular.element('<md-content>').append(element.contents()) );\n    }\n\n    // Add progress spinner for md-options-loading\n    if (attr.mdOnOpen) {\n      element.find('md-content').prepend(\n        angular.element('<md-progress-circular>')\n               .attr('md-mode', 'indeterminate')\n               .attr('ng-hide', '$$loadingAsyncDone')\n               .wrap('<div>')\n               .parent()\n      );\n    }\n\n    // Use everything that's left inside element.contents() as the contents of the menu\n    var selectTemplate = angular.element(\n      '<div class=\"md-select-menu-container\">' +\n        '<md-select-menu ' +\n        (angular.isDefined(attr.multiple) ? 'multiple' : '') + '>' +\n          element.html() +\n        '</md-select-menu></div>');\n\n    element.empty().append(labelEl);\n\n    $mdTheming(element);\n\n    return function postLink(scope, element, attr, ngModel) {\n      var isOpen;\n      var labelEl = element.find('md-select-label');\n      var customLabel = labelEl.text().length !== 0;\n      if (!customLabel) labelEl = labelEl.children().eq(0);\n      setInitialLabelValue();\n\n      attr.$observe('disabled', function(disabled) {\n        if (disabled !== undefined) {\n          element.attr('tabindex', -1);\n          element.off('click', openSelect);\n          element.off('keydown', openOnKeypress);\n        } else {\n          element.attr('tabindex', 0);\n          element.on('click', openSelect);\n          element.on('keydown', openOnKeypress);\n        }\n      });\n\n      if (attr.disabled === undefined) {\n        element.on('click', openSelect);\n        element.on('keydown', openOnKeypress);\n      }\n\n      element.attr({\n        'role': 'combobox',\n        'id': 'select_' + $mdUtil.nextUid(),\n        'aria-haspopup': true,\n        'aria-expanded': 'false',\n        'aria-labelledby': labelEl.attr('id')\n      });\n\n      scope.$on('$destroy', function() {\n        if (isOpen) {\n          $mdSelect.cancel();\n        }\n      });\n\n      // Create a fake select to find out the label value\n      function setInitialLabelValue() {\n        if ($parse(attr.ngModel)(scope)) {\n          var fakeSelectEl = angular.element(selectTemplate).find('md-select-menu');\n          fakeSelectEl.data('$ngModelController', ngModel);\n          var fakeSelectScope = scope.$new();\n          fakeSelectEl = $compile(fakeSelectEl)(fakeSelectScope);\n          var fakeSelectCtrl = fakeSelectEl.controller('mdSelectMenu');\n          fakeSelectScope.$$postDigest(function() {\n            ngModel.$render();\n            setLabelText(fakeSelectCtrl.selectedLabels());\n            fakeSelectEl.scope().$destroy();\n          });\n        } else {\n          setLabelText();\n        }\n      }\n\n      function setLabelText(text) {\n        if (customLabel) return; // Assume that user is handling it on their own\n        var newText = text || attr.placeholder;\n        labelEl.html(newText);\n      }\n\n      function openOnKeypress(e) {\n        var allowedCodes = [32, 13, 38, 40];\n        if (allowedCodes.indexOf(e.keyCode) != -1 ) {\n          // prevent page scrolling on interaction\n          e.preventDefault();\n          openSelect(e);\n        }\n      }\n\n      function openSelect() {\n        scope.$evalAsync(function() {\n          var selectEl = selectTemplate.clone();\n          selectEl.find('md-select-menu').data('$ngModelController', ngModel);\n          isOpen = true;\n          $mdSelect.show({\n            scope: scope.$new(),\n            element: selectEl,\n            target: element[0],\n            hasBackdrop: true,\n            loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) : false,\n            setLabelText: setLabelText\n          }).then(function(selectedText) {\n            isOpen = false;\n          });\n        });\n      }\n    };\n\n  }\n}\nSelectDirective.$inject = [\"$mdSelect\", \"$mdUtil\", \"$mdTheming\", \"$interpolate\", \"$compile\", \"$parse\"];\n\nfunction SelectMenuDirective($parse, $mdUtil, $mdTheming) {\n\n  SelectMenuController.$inject = [\"$scope\", \"$attrs\", \"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdSelectMenu', '?ngModel'],\n    controller: SelectMenuController,\n    link: { pre: preLink }\n  };\n\n  // We use preLink instead of postLink to ensure that the select is initialized before\n  // its child options run postLink.\n  function preLink(scope, element, attr, ctrls) {\n    var selectCtrl = ctrls[0];\n    var ngModel = ctrls[1];\n\n    $mdTheming(element);\n    element.on('click', clickListener);\n    element.on('keypress', keyListener);\n    if (ngModel) selectCtrl.init(ngModel);\n    configureAria();\n\n    function configureAria() {\n      element.attr({\n        'id': 'select_menu_' + $mdUtil.nextUid(),\n        'role': 'listbox',\n        'aria-multiselectable': (selectCtrl.isMultiple ? 'true' : 'false')\n      });\n    }\n\n    function keyListener(e) {\n      if (e.keyCode == 13 || e.keyCode == 32) {\n        clickListener(e);\n      }\n    }\n\n    function clickListener(ev) {\n      var option = $mdUtil.getClosest(ev.target, 'md-option');\n      var optionCtrl = option && angular.element(option).data('$mdOptionController');\n      if (!option || !optionCtrl) return;\n\n      var optionHashKey = selectCtrl.hashGetter(optionCtrl.value);\n      var isSelected = angular.isDefined(selectCtrl.selected[optionHashKey]);\n\n      scope.$apply(function() {\n        if (selectCtrl.isMultiple) {\n          if (isSelected) {\n            selectCtrl.deselect(optionHashKey);\n          } else {\n            selectCtrl.select(optionHashKey, optionCtrl.value);\n          }\n        } else {\n          if (!isSelected) {\n            selectCtrl.deselect( Object.keys(selectCtrl.selected)[0] );\n            selectCtrl.select( optionHashKey, optionCtrl.value );\n          }\n        }\n        selectCtrl.refreshViewValue();\n      });\n    }\n  }\n\n\n\n  function SelectMenuController($scope, $attrs, $element) {\n    var self = this;\n    self.isMultiple = angular.isDefined($attrs.multiple);\n    // selected is an object with keys matching all of the selected options' hashed values\n    self.selected = {};\n    // options is an object with keys matching every option's hash value,\n    // and values matching every option's controller.\n    self.options = {};\n\n\n    self.init = function(ngModel) {\n      self.ngModel = ngModel;\n\n      // Allow users to provide `ng-model=\"foo\" ng-model-options=\"{trackBy: 'foo.id'}\"` so\n      // that we can properly compare objects set on the model to the available options\n      if (ngModel.$options && ngModel.$options.trackBy) {\n        var trackByLocals = {};\n        var trackByParsed = $parse(ngModel.$options.trackBy);\n        self.hashGetter = function(value, valueScope) {\n          trackByLocals.$value = value;\n          return trackByParsed(valueScope || $scope, trackByLocals);\n        };\n      // If the user doesn't provide a trackBy, we automatically generate an id for every\n      // value passed in\n      } else {\n        self.hashGetter = function getHashValue(value) {\n          if (angular.isObject(value)) {\n            return '$$object_' + (value.$$mdSelectId || (value.$$mdSelectId = ++selectNextId));\n          }\n          return value;\n        };\n      }\n\n      if (self.isMultiple) {\n        ngModel.$validators['md-multiple'] = validateArray;\n        ngModel.$render = renderMultiple;\n\n        // watchCollection on the model because by default ngModel only watches the model's\n        // reference. This allowed the developer to also push and pop from their array.\n        $scope.$watchCollection($attrs.ngModel, function(value) {\n          if (validateArray(value)) renderMultiple(value);\n        });\n      } else {\n        ngModel.$render = renderSingular;\n      }\n\n      function validateArray(modelValue, viewValue) {\n        // If a value is truthy but not an array, reject it.\n        // If value is undefined/falsy, accept that it's an empty array.\n        return angular.isArray(modelValue || viewValue || []);\n      }\n    };\n\n    self.selectedLabels = function() {\n      var selectedOptionEls = nodesToArray($element[0].querySelectorAll('md-option[selected]'));\n      if (selectedOptionEls.length) {\n        return selectedOptionEls.map(function(el) { return el.textContent; }).join(', ');\n      } else {\n        return '';\n      }\n    };\n\n    self.select = function(hashKey, hashedValue) {\n      var option = self.options[hashKey];\n      option && option.setSelected(true);\n      self.selected[hashKey] = hashedValue;\n    };\n    self.deselect = function(hashKey) {\n      var option = self.options[hashKey];\n      option && option.setSelected(false);\n      delete self.selected[hashKey];\n    };\n\n    self.addOption = function(hashKey, optionCtrl) {\n      if (angular.isDefined(self.options[hashKey])) {\n        throw new Error('Duplicate md-option values are not allowed in a select. ' +\n                        'Duplicate value \"' + optionCtrl.value + '\" found.');\n      }\n      self.options[hashKey] = optionCtrl;\n\n      // If this option's value was already in our ngModel, go ahead and select it.\n      if (angular.isDefined(self.selected[hashKey])) {\n        self.select(hashKey, optionCtrl.value);\n        self.refreshViewValue();\n      }\n    };\n    self.removeOption = function(hashKey) {\n      delete self.options[hashKey];\n      // Don't deselect an option when it's removed - the user's ngModel should be allowed\n      // to have values that do not match a currently available option.\n    };\n\n    self.refreshViewValue = function() {\n      var values = [];\n      var option;\n      for (var hashKey in self.selected) {\n         // If this hashKey has an associated option, push that option's value to the model.\n         if ((option = self.options[hashKey])) {\n           values.push(option.value);\n         } else {\n           // Otherwise, the given hashKey has no associated option, and we got it\n           // from an ngModel value at an earlier time. Push the unhashed value of\n           // this hashKey to the model.\n           // This allows the developer to put a value in the model that doesn't yet have\n           // an associated option.\n           values.push(self.selected[hashKey]);\n         }\n      }\n      self.ngModel.$setViewValue(self.isMultiple ? values : values[0]);\n    };\n\n    function renderMultiple() {\n      var newSelectedValues = self.ngModel.$modelValue || self.ngModel.$viewValue;\n      if (!angular.isArray(newSelectedValues)) return;\n\n      var oldSelected = Object.keys(self.selected);\n\n      var newSelectedHashes = newSelectedValues.map(self.hashGetter);\n      var deselected = oldSelected.filter(function(hash) {\n        return newSelectedHashes.indexOf(hash) === -1;\n      });\n\n      deselected.forEach(self.deselect);\n      newSelectedHashes.forEach(function(hashKey, i) {\n        self.select(hashKey, newSelectedValues[i]);\n      });\n    }\n    function renderSingular() {\n      var value = self.ngModel.$viewValue || self.ngModel.$modelValue;\n      Object.keys(self.selected).forEach(self.deselect);\n      self.select( self.hashGetter(value), value );\n    }\n  }\n\n}\nSelectMenuDirective.$inject = [\"$parse\", \"$mdUtil\", \"$mdTheming\"];\n\nfunction OptionDirective($mdInkRipple, $mdUtil) {\n\n  OptionController.$inject = [\"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdOption', '^^mdSelectMenu'],\n    controller: OptionController,\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    // Manual transclusion to avoid the extra inner <span> that ng-transclude generates\n    element.append( angular.element('<div class=\"md-text\">').append(element.contents()) );\n    if (attr.tabindex === undefined) element.attr('tabindex', 0);\n    return postLink;\n  }\n\n  function postLink(scope, element, attr, ctrls) {\n    var optionCtrl = ctrls[0];\n    var selectCtrl = ctrls[1];\n\n    if (angular.isDefined(attr.ngValue)) {\n      scope.$watch(attr.ngValue, setOptionValue);\n    } else if (angular.isDefined(attr.value)) {\n      setOptionValue(attr.value);\n    } else {\n      throw new Error(\"Expected either ngValue or value attr\");\n    }\n\n    $mdInkRipple.attachButtonBehavior(scope, element);\n    configureAria();\n\n    function setOptionValue(newValue, oldValue) {\n      var oldHashKey = selectCtrl.hashGetter(oldValue, scope);\n      var newHashKey = selectCtrl.hashGetter(newValue, scope);\n\n      optionCtrl.hashKey = newHashKey;\n      optionCtrl.value = newValue;\n\n      selectCtrl.removeOption(oldHashKey, optionCtrl);\n      selectCtrl.addOption(newHashKey, optionCtrl);\n    }\n\n    scope.$on('$destroy', function() {\n      selectCtrl.removeOption(optionCtrl.hashKey, optionCtrl);\n    });\n\n    function configureAria() {\n      element.attr({\n        'role': 'option',\n        'aria-selected': 'false',\n        'id': 'select_option_'+ $mdUtil.nextUid()\n      });\n    }\n  }\n\n  function OptionController($element) {\n    this.selected = false;\n    this.setSelected = function(isSelected) {\n      if (isSelected && !this.selected) {\n        $element.attr({\n          'selected': 'selected',\n          'aria-selected': 'true'\n        });\n      } else if (!isSelected && this.selected) {\n        $element.removeAttr('selected');\n        $element.attr('aria-selected', 'false');\n      }\n      this.selected = isSelected;\n    };\n  }\n\n}\nOptionDirective.$inject = [\"$mdInkRipple\", \"$mdUtil\"];\n\nfunction OptgroupDirective() {\n  return {\n    restrict: 'E',\n    compile: compile\n  };\n  function compile(el, attrs) {\n    var labelElement = el.find('label');\n    if (!labelElement.length) {\n      labelElement = angular.element('<label>');\n      el.prepend(labelElement);\n    }\n    if (attrs.label) labelElement.text(attrs.label);\n  }\n}\n\nfunction SelectProvider($$interimElementProvider) {\n  selectDefaultOptions.$inject = [\"$mdSelect\", \"$mdConstant\", \"$$rAF\", \"$mdUtil\", \"$mdTheming\", \"$timeout\"];\n  return $$interimElementProvider('$mdSelect')\n    .setDefaults({\n      methods: ['target'],\n      options: selectDefaultOptions\n    });\n\n  /* @ngInject */\n  function selectDefaultOptions($mdSelect, $mdConstant, $$rAF, $mdUtil, $mdTheming, $timeout) {\n    return {\n      parent: 'body',\n      onShow: onShow,\n      onRemove: onRemove,\n      hasBackdrop: true,\n      disableParentScroll: $mdUtil.floatingScrollbars(),\n      themable: true\n    };\n\n    function onShow(scope, element, opts) {\n      if (!opts.target) {\n        throw new Error('$mdSelect.show() expected a target element in options.target but got ' +\n                        '\"' + opts.target + '\"!');\n      }\n\n      angular.extend(opts, {\n        target: angular.element(opts.target), //make sure it's not a naked dom node\n        parent: angular.element(opts.parent),\n        selectEl: element.find('md-select-menu'),\n        contentEl: element.find('md-content'),\n        backdrop: opts.hasBackdrop && angular.element('<md-backdrop class=\"md-select-backdrop\">')\n      });\n    \n      var optionNodes = [];\n\n      configureAria();\n\n      if (opts.loadingAsync && opts.loadingAsync.then) {\n        opts.loadingAsync.then(function() {\n          scope.$$loadingAsyncDone = true;\n          // Give ourselves two frames for the progress loader to clear out.\n          $$rAF(function() {\n            $$rAF(function() {\n              // Don't go forward if the select has been removed in this time...\n              if (opts.isRemoved) return;\n              animateSelect(scope, element, opts);\n              optionNodes = nodesToArray(opts.selectEl[0].getElementsByTagName('md-option'));\n            });\n          });\n        });\n      }\n\n      if (opts.disableParentScroll) {\n        opts.disableTarget = opts.parent.find('md-content');\n        if (!opts.disableTarget.length) opts.disableTarget = opts.parent;\n        opts.lastOverflow = opts.disableTarget.css('overflow');\n        opts.disableTarget.css('overflow', 'hidden');\n      }\n\n      // Only activate click listeners after a short time to stop accidental double taps/clicks\n      // from clicking the wrong item\n      $timeout(activateInteraction, 75, false);\n\n      if (opts.backdrop) {\n        $mdTheming.inherit(opts.backdrop, opts.parent);\n        opts.parent.append(opts.backdrop);\n      }\n      opts.parent.append(element);\n\n      // Give the select a frame to 'initialize' in the DOM,\n      // so we can read its height/width/position\n      $$rAF(function() {\n        $$rAF(function() {\n          if (opts.isRemoved) return;\n          animateSelect(scope, element, opts);\n          optionNodes = nodesToArray(element[0].querySelectorAll('md-option'));\n        });\n      });\n\n      return $mdUtil.transitionEndPromise(opts.selectEl);\n\n      function configureAria() {\n        opts.selectEl.attr('aria-labelledby', opts.target.attr('id'));\n        opts.target.attr('aria-owns', opts.selectEl.attr('id'));\n        opts.target.attr('aria-expanded', 'true');\n      }\n\n      function activateInteraction() {\n        if (opts.isRemoved) return;\n        var selectCtrl = opts.selectEl.controller('mdSelectMenu') || {};\n        element.addClass('md-clickable');\n\n        opts.backdrop && opts.backdrop.on('click', function(e) {\n          e.preventDefault();\n          e.stopPropagation();\n          opts.restoreFocus = false;\n          scope.$apply($mdSelect.cancel);\n        });\n\n        // Escape to close\n        opts.selectEl.on('keydown', function(e) {\n          switch (e.keyCode) {\n            case $mdConstant.KEY_CODE.TAB:\n            case $mdConstant.KEY_CODE.ESCAPE:\n              e.preventDefault();\n              opts.restoreFocus = true;\n              scope.$apply($mdSelect.cancel);\n          }\n        });\n\n        // Cycling of options, and closing on enter\n        opts.selectEl.on('keydown', function(e) {\n          switch (e.keyCode) {\n            case $mdConstant.KEY_CODE.UP_ARROW: return focusPrevOption();\n            case $mdConstant.KEY_CODE.DOWN_ARROW: return focusNextOption();\n          }\n        });\n\n        function focusNextOption() {\n          var index;\n          if ((index = optionNodes.indexOf(opts.focusedNode)) == -1) {\n            // We lost the previously focused element, reset to middle\n            index = Math.floor( (optionNodes.length - 1) / 2 );\n          } else {\n            if (index < optionNodes.length - 1) ++index;\n          }\n          opts.focusedNode = optionNodes[index];\n          optionNodes[index].focus();\n        }\n        function focusPrevOption() {\n          var index;\n          if ((index = optionNodes.indexOf(opts.focusedNode)) == -1) {\n            // We lost the previously focused element, reset to middle\n            index = Math.floor( (optionNodes.length - 1) / 2 );\n          } else {\n            if (index > 0) --index;\n          }\n          opts.focusedNode = optionNodes[index];\n          optionNodes[index].focus();\n        }\n\n        if (!selectCtrl.isMultiple) {\n          opts.selectEl.on('click', closeMenu);\n          opts.selectEl.on('keydown', function(e) {\n            if (e.keyCode == 32 || e.keyCode == 13) {\n              closeMenu();\n            }\n          });\n        }\n        function closeMenu() {\n          opts.restoreFocus = true;\n          scope.$evalAsync(function() {\n            $mdSelect.hide(selectCtrl.ngModel.$viewValue);\n          });\n        }\n      }\n\n    }\n\n    function onRemove(scope, element, opts) {\n      opts.isRemoved = true;\n      element.addClass('md-leave').removeClass('md-clickable');\n      opts.target.attr('aria-expanded', 'false');\n\n      if (opts.disableParentScroll && $mdUtil.floatingScrollbars()) {\n        opts.disableTarget.css('overflow', opts.lastOverflow);\n        delete opts.lastOverflow;\n        delete opts.disableTarget;\n      }\n\n      opts.setLabelText && opts.setLabelText(opts.selectEl.controller('mdSelectMenu').selectedLabels());\n\n      return $mdUtil.transitionEndPromise(element).then(function() {\n        element.remove();\n        opts.backdrop && opts.backdrop.remove();\n        if (opts.restoreFocus) opts.target.focus();\n      });\n    }\n\n    function animateSelect(scope, element, opts) {\n      var containerNode = element[0],\n          targetNode = opts.target[0],\n          parentNode = opts.parent[0],\n          selectNode = opts.selectEl[0],\n          contentNode = opts.contentEl[0],\n          parentRect = parentNode.getBoundingClientRect(),\n          targetRect = $mdUtil.clientRect(targetNode, parentNode),\n          shouldOpenAroundTarget = false,\n          bounds = {\n            left: parentNode.scrollLeft + SELECT_EDGE_MARGIN,\n            top: parentNode.scrollTop + SELECT_EDGE_MARGIN,\n            bottom: parentRect.height + parentNode.scrollTop - SELECT_EDGE_MARGIN,\n            right: parentRect.width - parentNode.scrollLeft - SELECT_EDGE_MARGIN\n          },\n          spaceAvailable = {\n            top: targetRect.top - bounds.top,\n            left: targetRect.left - bounds.left,\n            right: bounds.right - (targetRect.left + targetRect.width),\n            bottom: bounds.bottom - (targetRect.top + targetRect.height)\n          },\n          maxWidth = parentRect.width - SELECT_EDGE_MARGIN * 2,\n          isScrollable = contentNode.scrollHeight > contentNode.offsetHeight,\n          selectedNode = selectNode.querySelector('md-option[selected]'),\n          optionNodes = nodesToArray(selectNode.getElementsByTagName('md-option')),\n          optgroupNodes = selectNode.getElementsByTagName('md-optgroup');\n\n      var centeredNode;\n      // If a selected node, center around that\n      if (selectedNode) {\n        centeredNode = selectedNode;\n      // If there are option groups, center around the first option\n      } else if (optgroupNodes.length) {\n        centeredNode = optionNodes[0];\n      // Otherwise, lets center on the middle optionNode\n      } else if (optionNodes.length){\n        centeredNode = optionNodes[Math.floor(optionNodes.length / 2 )];\n      // In case there are no options, center on whatevers in there... (such as a progress indicator)\n      } else {\n        centeredNode = contentNode.firstElementChild || contentNode;\n      }\n\n      if (contentNode.offsetWidth > maxWidth) {\n        contentNode.style['max-width'] = maxWidth + 'px';\n      }\n      if (shouldOpenAroundTarget) {\n        contentNode.style['min-width'] = targetRect.width + 'px';\n      }\n\n      // Remove padding before we compute the position of the menu\n      if (isScrollable) {\n        selectNode.classList.add('md-overflow');\n      }\n\n      // Get the selectMenuRect *after* max-width is possibly set above\n      var selectMenuRect = selectNode.getBoundingClientRect();\n      var centeredRect = getOffsetRect(centeredNode);\n\n      if (centeredNode) {\n        var centeredStyle = window.getComputedStyle(centeredNode);\n        centeredRect.paddingLeft = parseInt(centeredStyle['padding-left'], 10);\n        centeredRect.paddingRight = parseInt(centeredStyle['padding-right'], 10);\n      }\n\n      var focusedNode = centeredNode || optionNodes[0];\n      if (focusedNode) {\n        opts.focusedNode = focusedNode;\n        // This is commented out to fix an issue where the first option remains in focus\n        // even after you mouseover to a different option.\n        // It is fixed in the compiled source and is here for reference.\n        // focusedNode.focus();\n      }\n\n      if (isScrollable) {\n        var scrollBuffer = contentNode.offsetHeight / 2;\n        contentNode.scrollTop = centeredRect.top + centeredRect.height / 2 - scrollBuffer;\n\n        if (spaceAvailable.top < scrollBuffer) {\n          contentNode.scrollTop = Math.min(\n            centeredRect.top,\n            contentNode.scrollTop + scrollBuffer - spaceAvailable.top\n          );\n        } else if (spaceAvailable.bottom < scrollBuffer) {\n          contentNode.scrollTop = Math.max(\n            centeredRect.top + centeredRect.height - selectMenuRect.height,\n            contentNode.scrollTop - scrollBuffer + spaceAvailable.bottom\n          );\n        }\n      }\n\n      var left, top, transformOrigin;\n      if (shouldOpenAroundTarget) {\n        left = targetRect.left;\n        top = targetRect.top + targetRect.height;\n        transformOrigin = '50% 0';\n        if (top + selectMenuRect.height > bounds.bottom) {\n          top = targetRect.top - selectMenuRect.height;\n          transformOrigin = '50% 100%';\n        }\n      } else {\n        left = targetRect.left + centeredRect.left - centeredRect.paddingLeft;\n        top = targetRect.top + targetRect.height / 2 - centeredRect.height / 2 -\n          centeredRect.top + contentNode.scrollTop;\n        transformOrigin = (centeredRect.left + targetRect.width / 2) + 'px ' +\n        (centeredRect.top + centeredRect.height / 2 - contentNode.scrollTop) + 'px 0px';\n        containerNode.style['min-width'] = targetRect.width + centeredRect.paddingLeft + centeredRect.paddingRight + 'px';\n      }\n\n      // Keep left and top within the window\n      containerNode.style.left = clamp(bounds.left, left, bounds.right) + 'px';\n      containerNode.style.top = clamp(bounds.top, top, bounds.bottom) + 'px';\n      selectNode.style[$mdConstant.CSS.TRANSFORM_ORIGIN] = transformOrigin;\n\n      selectNode.style[$mdConstant.CSS.TRANSFORM] = 'scale(' +\n        Math.min(targetRect.width / selectMenuRect.width, 1.0) + ',' +\n        Math.min(targetRect.height / selectMenuRect.height, 1.0) +\n      ')';\n\n      $$rAF(function() {\n        element.addClass('md-active');\n        selectNode.style[$mdConstant.CSS.TRANSFORM] = '';\n      });\n    }\n\n  }\n\n  function clamp(min, n, max) {\n    return Math.min(max, Math.max(n, min));\n  }\n\n  function getOffsetRect(node) {\n    return node ? {\n      left: node.offsetLeft,\n      top: node.offsetTop,\n      width: node.offsetWidth,\n      height: node.offsetHeight\n    } : { left: 0, top: 0, width: 0, height: 0 };\n  }\n}\nSelectProvider.$inject = [\"$$interimElementProvider\"];\n\n// Annoying method to copy nodes to an array, thanks to IE\nfunction nodesToArray(nodes) {\n  var results = [];\n  for (var i = 0; i < nodes.length; ++i) {\n    results.push(nodes.item(i));\n  }\n  return results;\n}\n})();\n\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.sidenav\n *\n * @description\n * A Sidenav QP component.\n */\nangular.module('material.components.sidenav', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .factory('$mdSidenav', SidenavService )\n  .directive('mdSidenav', SidenavDirective)\n  .controller('$mdSidenavController', SidenavController);\n\n\n/**\n * @private\n * @ngdoc service\n * @name $mdSidenav\n * @module material.components.sidenav\n *\n * @description\n * `$mdSidenav` makes it easy to interact with multiple sidenavs\n * in an app.\n *\n * @usage\n * <hljs lang=\"js\">\n * // Toggle the given sidenav\n * $mdSidenav(componentId).toggle();\n * </hljs>\n * <hljs lang=\"js\">\n * // Open the given sidenav\n * $mdSidenav(componentId).open();\n * </hljs>\n * <hljs lang=\"js\">\n * // Close the given sidenav\n * $mdSidenav(componentId).close();\n * </hljs>\n * <hljs lang=\"js\">\n * // Exposes whether given sidenav is set to be open\n * $mdSidenav(componentId).isOpen();\n * </hljs>\n * <hljs lang=\"js\">\n * // Exposes whether given sidenav is locked open\n * // If this is true, the sidenav will be open regardless of isOpen()\n * $mdSidenav(componentId).isLockedOpen();\n * </hljs>\n */\nfunction SidenavService($mdComponentRegistry, $q) {\n  return function(handle) {\n    var errorMsg = \"SideNav '\" + handle + \"' is not available!\";\n\n    // Lookup the controller instance for the specified sidNav instance\n    var instance = $mdComponentRegistry.get(handle);\n    if(!instance) {\n      $mdComponentRegistry.notFoundError(handle);\n    }\n\n    return {\n      isOpen: function() {\n        return instance && instance.isOpen();\n      },\n      isLockedOpen: function() {\n        return instance && instance.isLockedOpen();\n      },\n      toggle: function() {\n        return instance ? instance.toggle() : $q.reject(errorMsg);\n      },\n      open: function() {\n        return instance ? instance.open() : $q.reject(errorMsg);\n      },\n      close: function() {\n        return instance ? instance.close() : $q.reject(errorMsg);\n      }\n    };\n  };\n}\nSidenavService.$inject = [\"$mdComponentRegistry\", \"$q\"];\n\n/**\n * @ngdoc directive\n * @name mdSidenav\n * @module material.components.sidenav\n * @restrict E\n *\n * @description\n *\n * A Sidenav component that can be opened and closed programatically.\n *\n * By default, upon opening it will slide out on top of the main content area.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"row\" ng-controller=\"MyController\">\n *   <md-sidenav md-component-id=\"left\" class=\"md-sidenav-left\">\n *     Left Nav!\n *   </md-sidenav>\n *\n *   <md-content>\n *     Center Content\n *     <md-button ng-click=\"openLeftMenu()\">\n *       Open Left Menu\n *     </md-button>\n *   </md-content>\n *\n *   <md-sidenav md-component-id=\"right\"\n *     md-is-locked-open=\"$media('min-width: 333px')\"\n *     class=\"md-sidenav-right\">\n *     Right Nav!\n *   </md-sidenav>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('myApp', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdSidenav) {\n *   $scope.openLeftMenu = function() {\n *     $mdSidenav('left').toggle();\n *   };\n * });\n * </hljs>\n *\n * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n * @param {string=} md-component-id componentId to use with $mdSidenav service.\n * @param {expression=} md-is-locked-open When this expression evalutes to true,\n * the sidenav 'locks open': it falls into the content's flow instead\n * of appearing over it. This overrides the `is-open` attribute.\n *\n * A $media() function is exposed to the is-locked-open attribute, which\n * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n * Examples:\n *\n *   - `<md-sidenav md-is-locked-open=\"shouldLockOpen\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('min-width: 1000px')\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('sm')\"></md-sidenav>` (locks open on small screens)\n */\nfunction SidenavDirective($timeout, $animate, $parse, $mdMedia, $mdConstant, $compile, $mdTheming, $q, $document) {\n  return {\n    restrict: 'E',\n    scope: {\n      isOpen: '=?mdIsOpen'\n    },\n    controller: '$mdSidenavController',\n    compile: function(element) {\n      element.addClass('md-closed');\n      element.attr('tabIndex', '-1');\n      return postLink;\n    }\n  };\n\n  /**\n   * Directive Post Link function...\n   */\n  function postLink(scope, element, attr, sidenavCtrl) {\n    var triggeringElement = null;\n    var promise = $q.when(true);\n\n    var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n    var isLocked = function() {\n      return isLockedOpenParsed(scope.$parent, {\n        $media: $mdMedia\n      });\n    };\n    var backdrop = $compile(\n      '<md-backdrop class=\"md-sidenav-backdrop md-opaque ng-enter\">'\n    )(scope);\n\n    element.on('$destroy', sidenavCtrl.destroy);\n    $mdTheming.inherit(backdrop, element);\n\n    scope.$watch(isLocked, updateIsLocked);\n    scope.$watch('isOpen', updateIsOpen);\n\n\n    // Publish special accessor for the Controller instance\n    sidenavCtrl.$toggleOpen = toggleOpen;\n\n    /**\n     * Toggle the DOM classes to indicate `locked`\n     * @param isLocked\n     */\n    function updateIsLocked(isLocked, oldValue) {\n      scope.isLockedOpen = isLocked;\n      if (isLocked === oldValue) {\n        element.toggleClass('md-locked-open', !!isLocked);\n      } else {\n        $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n      }\n      backdrop.toggleClass('md-locked-open', !!isLocked);\n    }\n\n    /**\n     * Toggle the SideNav view and attach/detach listeners\n     * @param isOpen\n     */\n    function updateIsOpen(isOpen) {\n      var parent = element.parent();\n\n      parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n      backdrop[isOpen ? 'on' : 'off']('click', close);\n\n      if ( isOpen ) {\n        // Capture upon opening..\n        triggeringElement = $document[0].activeElement;\n      }\n\n      return promise = $q.all([\n        $animate[isOpen ? 'enter' : 'leave'](backdrop, parent),\n        $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed').then(function() {\n          // If we opened, and haven't closed again before the animation finished\n          if (scope.isOpen) {\n            element.focus();\n          }\n        })\n      ]);\n    }\n\n    /**\n     * Toggle the sideNav view and publish a promise to be resolved when\n     * the view animation finishes.\n     *\n     * @param isOpen\n     * @returns {*}\n     */\n    function toggleOpen( isOpen ) {\n      if (scope.isOpen == isOpen ) {\n\n        return $q.when(true);\n\n      } else {\n        var deferred = $q.defer();\n\n        // Toggle value to force an async `updateIsOpen()` to run\n        scope.isOpen = isOpen;\n\n        $timeout(function() {\n\n          // When the current `updateIsOpen()` animation finishes\n          promise.then(function(result){\n\n            if ( !scope.isOpen ) {\n              // reset focus to originating element (if available) upon close\n              triggeringElement && triggeringElement.focus();\n              triggeringElement = null;\n            }\n\n            deferred.resolve(result);\n          });\n\n        },0,false);\n\n        return deferred.promise;\n      }\n    }\n\n    /**\n     * Auto-close sideNav when the `escape` key is pressed.\n     * @param evt\n     */\n    function onKeyDown(ev) {\n      var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n      return isEscape ? close(ev) : $q.when(true);\n    }\n\n    /**\n     * With backdrop `clicks` or `escape` key-press, immediately\n     * apply the CSS close transition... Then notify the controller\n     * to close() and perform its own actions.\n     */\n    function close(ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      return sidenavCtrl.close();\n    }\n\n  }\n}\nSidenavDirective.$inject = [\"$timeout\", \"$animate\", \"$parse\", \"$mdMedia\", \"$mdConstant\", \"$compile\", \"$mdTheming\", \"$q\", \"$document\"];\n\n/*\n * @private\n * @ngdoc controller\n * @name SidenavController\n * @module material.components.sidenav\n *\n */\nfunction SidenavController($scope, $element, $attrs, $mdComponentRegistry, $q) {\n\n  var self = this;\n\n  // Use Default internal method until overridden by directive postLink\n\n  self.$toggleOpen = function() { return $q.when($scope.isOpen); };\n  self.isOpen = function() { return !!$scope.isOpen; };\n  self.isLockedOpen = function() { return !!$scope.isLockedOpen; };\n  self.open   = function() { return self.$toggleOpen( true );  };\n  self.close  = function() { return self.$toggleOpen( false ); };\n  self.toggle = function() { return self.$toggleOpen( !$scope.isOpen );  };\n\n  self.destroy = $mdComponentRegistry.register(self, $attrs.mdComponentId);\n}\nSidenavController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$mdComponentRegistry\", \"$q\"];\n\n\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.components.slider\n   */\n  angular.module('material.components.slider', [\n    'material.core'\n  ])\n  .directive('mdSlider', SliderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSlider\n * @module material.components.slider\n * @restrict E\n * @description\n * The `<md-slider>` component allows the user to choose from a range of\n * values.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the slider is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * It has two modes: 'normal' mode, where the user slides between a wide range\n * of values, and 'discrete' mode, where the user slides between only a few\n * select values.\n *\n * To enable discrete mode, add the `md-discrete` attribute to a slider,\n * and use the `step` attribute to change the distance between\n * values the user is allowed to pick.\n *\n * @usage\n * <h4>Normal Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider ng-model=\"myValue\" min=\"5\" max=\"500\">\n * </md-slider>\n * </hljs>\n * <h4>Discrete Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider md-discrete ng-model=\"myDiscreteValue\" step=\"10\" min=\"10\" max=\"130\">\n * </md-slider>\n * </hljs>\n *\n * @param {boolean=} md-discrete Whether to enable discrete mode.\n * @param {number=} step The distance between values the user is allowed to pick. Default 1.\n * @param {number=} min The minimum value the user is allowed to pick. Default 0.\n * @param {number=} max The maximum value the user is allowed to pick. Default 100.\n */\nfunction SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdTheming, $mdGesture, $parse) {\n  return {\n    scope: {},\n    require: '?ngModel',\n    template:\n      '<div class=\"md-slider-wrapper\">\\\n        <div class=\"md-track-container\">\\\n          <div class=\"md-track\"></div>\\\n          <div class=\"md-track md-track-fill\"></div>\\\n          <div class=\"md-track-ticks\"></div>\\\n        </div>\\\n        <div class=\"md-thumb-container\">\\\n          <div class=\"md-thumb\"></div>\\\n          <div class=\"md-focus-thumb\"></div>\\\n          <div class=\"md-focus-ring\"></div>\\\n          <div class=\"md-sign\">\\\n            <span class=\"md-thumb-text\"></span>\\\n          </div>\\\n          <div class=\"md-disabled-thumb\"></div>\\\n        </div>\\\n      </div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n    tElement.attr({\n      tabIndex: 0,\n      role: 'slider'\n    });\n\n    $mdAria.expect(tElement, 'aria-label');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr, ngModelCtrl) {\n    $mdTheming(element);\n    ngModelCtrl = ngModelCtrl || {\n      // Mock ngModelController if it doesn't exist to give us\n      // the minimum functionality needed\n      $setViewValue: function(val) {\n        this.$viewValue = val;\n        this.$viewChangeListeners.forEach(function(cb) { cb(); });\n      },\n      $parsers: [],\n      $formatters: [],\n      $viewChangeListeners: []\n    };\n\n    var isDisabledParsed = attr.ngDisabled && $parse(attr.ngDisabled);\n    var isDisabledGetter = isDisabledParsed ?\n      function() { return isDisabledParsed(scope.$parent); } :\n      angular.noop;\n    var thumb = angular.element(element[0].querySelector('.md-thumb'));\n    var thumbText = angular.element(element[0].querySelector('.md-thumb-text'));\n    var thumbContainer = thumb.parent();\n    var trackContainer = angular.element(element[0].querySelector('.md-track-container'));\n    var activeTrack = angular.element(element[0].querySelector('.md-track-fill'));\n    var tickContainer = angular.element(element[0].querySelector('.md-track-ticks'));\n    var throttledRefreshDimensions = $mdUtil.throttle(refreshSliderDimensions, 5000);\n\n    // Default values, overridable by attrs\n    attr.min ? attr.$observe('min', updateMin) : updateMin(0);\n    attr.max ? attr.$observe('max', updateMax) : updateMax(100);\n    attr.step ? attr.$observe('step', updateStep) : updateStep(1);\n\n    // We have to manually stop the $watch on ngDisabled because it exists\n    // on the parent scope, and won't be automatically destroyed when\n    // the component is destroyed.\n    var stopDisabledWatch = angular.noop;\n    if (attr.ngDisabled) {\n      stopDisabledWatch = scope.$parent.$watch(attr.ngDisabled, updateAriaDisabled);\n    }\n\n    $mdGesture.register(element, 'drag');\n\n    element\n      .on('keydown', keydownListener)\n      .on('$md.pressdown', onPressDown)\n      .on('$md.pressup', onPressUp)\n      .on('$md.dragstart', onDragStart)\n      .on('$md.drag', onDrag)\n      .on('$md.dragend', onDragEnd);\n\n    // On resize, recalculate the slider's dimensions and re-render\n    function updateAll() {\n      refreshSliderDimensions();\n      ngModelRender();\n      redrawTicks();\n    }\n    setTimeout(updateAll);\n\n    var debouncedUpdateAll = $$rAF.throttle(updateAll);\n    angular.element($window).on('resize', debouncedUpdateAll);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdateAll);\n      stopDisabledWatch();\n    });\n\n    ngModelCtrl.$render = ngModelRender;\n    ngModelCtrl.$viewChangeListeners.push(ngModelRender);\n    ngModelCtrl.$formatters.push(minMaxValidator);\n    ngModelCtrl.$formatters.push(stepValidator);\n\n    /**\n     * Attributes\n     */\n    var min;\n    var max;\n    var step;\n    function updateMin(value) {\n      min = parseFloat(value);\n      element.attr('aria-valuemin', value);\n      updateAll();\n    }\n    function updateMax(value) {\n      max = parseFloat(value);\n      element.attr('aria-valuemax', value);\n      updateAll();\n    }\n    function updateStep(value) {\n      step = parseFloat(value);\n      redrawTicks();\n    }\n    function updateAriaDisabled(isDisabled) {\n      element.attr('aria-disabled', !!isDisabled);\n    }\n\n    // Draw the ticks with canvas.\n    // The alternative to drawing ticks with canvas is to draw one element for each tick,\n    // which could quickly become a performance bottleneck.\n    var tickCanvas, tickCtx;\n    function redrawTicks() {\n      if (!angular.isDefined(attr.mdDiscrete)) return;\n\n      var numSteps = Math.floor( (max - min) / step );\n      if (!tickCanvas) {\n        var trackTicksStyle = $window.getComputedStyle(tickContainer[0]);\n        tickCanvas = angular.element('<canvas style=\"position:absolute;\">');\n        tickCtx = tickCanvas[0].getContext('2d');\n        tickCtx.fillStyle = trackTicksStyle.backgroundColor || 'black';\n        tickContainer.append(tickCanvas);\n      }\n      var dimensions = getSliderDimensions();\n      tickCanvas[0].width = dimensions.width;\n      tickCanvas[0].height = dimensions.height;\n\n      var distance;\n      for (var i = 0; i <= numSteps; i++) {\n        distance = Math.floor(dimensions.width * (i / numSteps));\n        tickCtx.fillRect(distance - 1, 0, 2, dimensions.height);\n      }\n    }\n\n\n    /**\n     * Refreshing Dimensions\n     */\n    var sliderDimensions = {};\n    refreshSliderDimensions();\n    function refreshSliderDimensions() {\n      sliderDimensions = trackContainer[0].getBoundingClientRect();\n    }\n    function getSliderDimensions() {\n      throttledRefreshDimensions();\n      return sliderDimensions;\n    }\n\n    /**\n     * left/right arrow listener\n     */\n    function keydownListener(ev) {\n      if(element[0].hasAttribute('disabled')) {\n        return;\n      }\n\n      var changeAmount;\n      if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n        changeAmount = -step;\n      } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n        changeAmount = step;\n      }\n      if (changeAmount) {\n        if (ev.metaKey || ev.ctrlKey || ev.altKey) {\n          changeAmount *= 4;\n        }\n        ev.preventDefault();\n        ev.stopPropagation();\n        scope.$evalAsync(function() {\n          setModelValue(ngModelCtrl.$viewValue + changeAmount);\n        });\n      }\n    }\n\n    /**\n     * ngModel setters and validators\n     */\n    function setModelValue(value) {\n      ngModelCtrl.$setViewValue( minMaxValidator(stepValidator(value)) );\n    }\n    function ngModelRender() {\n      if (isNaN(ngModelCtrl.$viewValue)) {\n        ngModelCtrl.$viewValue = ngModelCtrl.$modelValue;\n      }\n\n      var percent = (ngModelCtrl.$viewValue - min) / (max - min);\n      scope.modelValue = ngModelCtrl.$viewValue;\n      element.attr('aria-valuenow', ngModelCtrl.$viewValue);\n      setSliderPercent(percent);\n      thumbText.text( ngModelCtrl.$viewValue );\n    }\n\n    function minMaxValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.max(min, Math.min(max, value));\n      }\n    }\n    function stepValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.round(value / step) * step;\n      }\n    }\n\n    /**\n     * @param percent 0-1\n     */\n    function setSliderPercent(percent) {\n      activeTrack.css('width', (percent * 100) + '%');\n      thumbContainer.css(\n        'left',\n        (percent * 100) + '%'\n      );\n      element.toggleClass('md-min', percent === 0);\n    }\n\n\n    /**\n     * Slide listeners\n     */\n    var isDragging = false;\n    var isDiscrete = angular.isDefined(attr.mdDiscrete);\n\n    function onPressDown(ev) {\n      if (isDisabledGetter()) return;\n\n      element.addClass('active');\n      element[0].focus();\n      refreshSliderDimensions();\n\n      var exactVal = percentToValue( positionToPercent( ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue( closestVal );\n        setSliderPercent( valueToPercent(closestVal));\n      });\n    }\n    function onPressUp(ev) {\n      if (isDisabledGetter()) return;\n\n      element.removeClass('dragging active');\n\n      var exactVal = percentToValue( positionToPercent( ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue(closestVal);\n        ngModelRender();\n      });\n    }\n    function onDragStart(ev) {\n      if (isDisabledGetter()) return;\n      isDragging = true;\n      ev.stopPropagation();\n\n      element.addClass('dragging');\n      setSliderFromEvent(ev);\n    }\n    function onDrag(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      setSliderFromEvent(ev);\n    }\n    function onDragEnd(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      isDragging = false;\n    }\n\n    function setSliderFromEvent(ev) {\n      // While panning discrete, update only the\n      // visual positioning but not the model value.\n      if ( isDiscrete ) adjustThumbPosition( ev.pointer.x );\n      else              doSlide( ev.pointer.x );\n    }\n\n    /**\n     * Slide the UI by changing the model value\n     * @param x\n     */\n    function doSlide( x ) {\n      scope.$evalAsync( function() {\n        setModelValue( percentToValue( positionToPercent(x) ));\n      });\n    }\n\n    /**\n     * Slide the UI without changing the model (while dragging/panning)\n     * @param x\n     */\n    function adjustThumbPosition( x ) {\n      var exactVal = percentToValue( positionToPercent( x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      setSliderPercent( positionToPercent(x) );\n      thumbText.text( closestVal );\n    }\n\n    /**\n     * Convert horizontal position on slider to percentage value of offset from beginning...\n     * @param x\n     * @returns {number}\n     */\n    function positionToPercent( x ) {\n      return Math.max(0, Math.min(1, (x - sliderDimensions.left) / (sliderDimensions.width)));\n    }\n\n    /**\n     * Convert percentage offset on slide to equivalent model value\n     * @param percent\n     * @returns {*}\n     */\n    function percentToValue( percent ) {\n      return (min + percent * (max - min));\n    }\n\n    function valueToPercent( val ) {\n      return (val - min)/(max - min);\n    }\n  }\n}\nSliderDirective.$inject = [\"$$rAF\", \"$window\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdGesture\", \"$parse\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.sticky\n * @description\n *\n * Sticky effects for md\n */\n\nangular.module('material.components.sticky', [\n  'material.core',\n  'material.components.content'\n])\n  .factory('$mdSticky', MdSticky);\n\n/*\n * @ngdoc service\n * @name $mdSticky\n * @module material.components.sticky\n *\n * @description\n * The `$mdSticky`service provides a mixin to make elements sticky.\n *\n * @returns A `$mdSticky` function that takes three arguments:\n *   - `scope`\n *   - `element`: The element that will be 'sticky'\n *   - `elementClone`: A clone of the element, that will be shown\n *     when the user starts scrolling past the original element.\n *     If not provided, it will use the result of `element.clone()`.\n */\n\nfunction MdSticky($document, $mdConstant, $compile, $$rAF, $mdUtil) {\n\n  var browserStickySupport = checkStickySupport();\n\n  /**\n   * Registers an element as sticky, used internally by directives to register themselves\n   */\n  return function registerStickyElement(scope, element, stickyClone) {\n    var contentCtrl = element.controller('mdContent');\n    if (!contentCtrl) return;\n\n    if (browserStickySupport) {\n      element.css({\n        position: browserStickySupport,\n        top: 0,\n        'z-index': 2\n      });\n    } else {\n      var $$sticky = contentCtrl.$element.data('$$sticky');\n      if (!$$sticky) {\n        $$sticky = setupSticky(contentCtrl);\n        contentCtrl.$element.data('$$sticky', $$sticky);\n      }\n\n      var deregister = $$sticky.add(element, stickyClone || element.clone());\n      scope.$on('$destroy', deregister);\n    }\n  };\n\n  function setupSticky(contentCtrl) {\n    var contentEl = contentCtrl.$element;\n\n    // Refresh elements is very expensive, so we use the debounced\n    // version when possible.\n    var debouncedRefreshElements = $$rAF.throttle(refreshElements);\n\n    // setupAugmentedScrollEvents gives us `$scrollstart` and `$scroll`,\n    // more reliable than `scroll` on android.\n    setupAugmentedScrollEvents(contentEl);\n    contentEl.on('$scrollstart', debouncedRefreshElements);\n    contentEl.on('$scroll', onScroll);\n\n    var self;\n    var stickyBaseoffset = contentEl.prop('offsetTop');\n    return self = {\n      prev: null,\n      current: null, //the currently stickied item\n      next: null,\n      items: [],\n      add: add,\n      refreshElements: refreshElements\n    };\n\n    /***************\n     * Public\n     ***************/\n    // Add an element and its sticky clone to this content's sticky collection\n    function add(element, stickyClone) {\n      stickyClone.addClass('md-sticky-clone');\n      stickyClone.css('top', stickyBaseoffset + 'px');\n\n      var item = {\n        element: element,\n        clone: stickyClone\n      };\n      self.items.push(item);\n\n      contentEl.parent().prepend(item.clone);\n\n      debouncedRefreshElements();\n\n      return function remove() {\n        self.items.forEach(function(item, index) {\n          if (item.element[0] === element[0]) {\n            self.items.splice(index, 1);\n            item.clone.remove();\n          }\n        });\n        debouncedRefreshElements();\n      };\n    }\n\n    function refreshElements() {\n      // Sort our collection of elements by their current position in the DOM.\n      // We need to do this because our elements' order of being added may not\n      // be the same as their order of display.\n      self.items.forEach(refreshPosition);\n      self.items = self.items.sort(function(a, b) {\n        return a.top < b.top ? -1 : 1;\n      });\n\n      // Find which item in the list should be active, \n      // based upon the content's current scroll position\n      var item;\n      var currentScrollTop = contentEl.prop('scrollTop');\n      for (var i = self.items.length - 1; i >= 0; i--) {\n        if (currentScrollTop > self.items[i].top) {\n          item = self.items[i];\n          break;\n        }\n      }\n      setCurrentItem(item);\n    }\n\n\n    /***************\n     * Private\n     ***************/\n\n    // Find the `top` of an item relative to the content element,\n    // and also the height.\n    function refreshPosition(item) {\n      // Find the top of an item by adding to the offsetHeight until we reach the \n      // content element.\n      var current = item.element[0];\n      item.top = 0;\n      item.left = 0;\n      while (current && current !== contentEl[0]) {\n        item.top += current.offsetTop;\n        item.left += current.offsetLeft;\n        current = current.offsetParent;\n      }\n      item.height = item.element.prop('offsetHeight');\n      item.clone.css('margin-left', item.left + 'px');\n    }\n\n\n    // As we scroll, push in and select the correct sticky element.\n    function onScroll() {\n      var scrollTop = contentEl.prop('scrollTop');\n      var isScrollingDown = scrollTop > (onScroll.prevScrollTop || 0);\n      onScroll.prevScrollTop = scrollTop;\n\n      // At the top?\n      if (scrollTop === 0) {\n        setCurrentItem(null);\n\n      // Going to next item?\n      } else if (isScrollingDown && self.next) {\n        if (self.next.top - scrollTop <= 0) {\n          // Sticky the next item if we've scrolled past its position.\n          setCurrentItem(self.next);\n        } else if (self.current) {\n          // Push the current item up when we're almost at the next item.\n          if (self.next.top - scrollTop <= self.next.height) {\n            translate(self.current, self.next.top - self.next.height - scrollTop);\n          } else {\n            translate(self.current, null);\n          }\n        }\n        \n      // Scrolling up with a current sticky item?\n      } else if (!isScrollingDown && self.current) {\n        if (scrollTop < self.current.top) {\n          // Sticky the previous item if we've scrolled up past\n          // the original position of the currently stickied item.\n          setCurrentItem(self.prev);\n        }\n        // Scrolling up, and just bumping into the item above (just set to current)?\n        // If we have a next item bumping into the current item, translate\n        // the current item up from the top as it scrolls into view.\n        if (self.current && self.next) {\n          if (scrollTop >= self.next.top - self.current.height) {\n            translate(self.current, self.next.top - scrollTop - self.current.height);\n          } else {\n            translate(self.current, null);\n          }\n        }\n      }\n    }\n     \n   function setCurrentItem(item) {\n     if (self.current === item) return;\n     // Deactivate currently active item\n     if (self.current) {\n       translate(self.current, null);\n       setStickyState(self.current, null);\n     }\n\n     // Activate new item if given\n     if (item) {\n       setStickyState(item, 'active');\n     }\n\n     self.current = item;\n     var index = self.items.indexOf(item);\n     // If index === -1, index + 1 = 0. It works out.\n     self.next = self.items[index + 1];\n     self.prev = self.items[index - 1];\n     setStickyState(self.next, 'next');\n     setStickyState(self.prev, 'prev');\n   }\n\n   function setStickyState(item, state) {\n     if (!item || item.state === state) return;\n     if (item.state) {\n       item.clone.attr('sticky-prev-state', item.state);\n       item.element.attr('sticky-prev-state', item.state);\n     }\n     item.clone.attr('sticky-state', state);\n     item.element.attr('sticky-state', state);\n     item.state = state;\n   }\n\n   function translate(item, amount) {\n     if (!item) return;\n     if (amount === null || amount === undefined) {\n       if (item.translateY) {\n         item.translateY = null;\n         item.clone.css($mdConstant.CSS.TRANSFORM, '');\n       }\n     } else {\n       item.translateY = amount;\n       item.clone.css(\n         $mdConstant.CSS.TRANSFORM, \n         'translate3d(' + item.left + 'px,' + amount + 'px,0)'\n       );\n     }\n   }\n  }\n\n  // Function to check for browser sticky support\n  function checkStickySupport($el) {\n    var stickyProp;\n    var testEl = angular.element('<div>');\n    $document[0].body.appendChild(testEl[0]);\n\n    var stickyProps = ['sticky', '-webkit-sticky'];\n    for (var i = 0; i < stickyProps.length; ++i) {\n      testEl.css({position: stickyProps[i], top: 0, 'z-index': 2});\n      if (testEl.css('position') == stickyProps[i]) {\n        stickyProp = stickyProps[i];\n        break;\n      }\n    }\n    testEl.remove();\n    return stickyProp;\n  }\n\n  // Android 4.4 don't accurately give scroll events.\n  // To fix this problem, we setup a fake scroll event. We say:\n  // > If a scroll or touchmove event has happened in the last DELAY milliseconds, \n  //   then send a `$scroll` event every animationFrame.\n  // Additionally, we add $scrollstart and $scrollend events.\n  function setupAugmentedScrollEvents(element) {\n    var SCROLL_END_DELAY = 200;\n    var isScrolling;\n    var lastScrollTime;\n    element.on('scroll touchmove', function() {\n      if (!isScrolling) {\n        isScrolling = true;\n        $$rAF(loopScrollEvent);\n        element.triggerHandler('$scrollstart');\n      }\n      element.triggerHandler('$scroll');\n      lastScrollTime = +$mdUtil.now();\n    });\n\n    function loopScrollEvent() {\n      if (+$mdUtil.now() - lastScrollTime > SCROLL_END_DELAY) {\n        isScrolling = false;\n        element.triggerHandler('$scrollend');\n      } else {\n        element.triggerHandler('$scroll');\n        $$rAF(loopScrollEvent);\n      }\n    }\n  }\n\n}\nMdSticky.$inject = [\"$document\", \"$mdConstant\", \"$compile\", \"$$rAF\", \"$mdUtil\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.subheader\n * @description\n * SubHeader module\n *\n *  Subheaders are special list tiles that delineate distinct sections of a\n *  list or grid list and are typically related to the current filtering or\n *  sorting criteria. Subheader tiles are either displayed inline with tiles or\n *  can be associated with content, for example, in an adjacent column.\n *\n *  Upon scrolling, subheaders remain pinned to the top of the screen and remain\n *  pinned until pushed on or off screen by the next subheader. @see [Material\n *  Design Specifications](https://www.google.com/design/spec/components/subheaders.html)\n *\n *  > To improve the visual grouping of content, use the system color for your subheaders.\n *\n */\nangular.module('material.components.subheader', [\n  'material.core',\n  'material.components.sticky'\n])\n  .directive('mdSubheader', MdSubheaderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSubheader\n * @module material.components.subheader\n *\n * @restrict E\n *\n * @description\n * The `<md-subheader>` directive is a subheader for a section\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-subheader>Online Friends</md-subheader>\n * </hljs>\n */\n\nfunction MdSubheaderDirective($mdSticky, $compile, $mdTheming) {\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: \n      '<h2 class=\"md-subheader\">' +\n        '<span class=\"md-subheader-content\"></span>' +\n      '</h2>',\n    compile: function(element, attr, transclude) {\n      var outerHTML = element[0].outerHTML;\n      return function postLink(scope, element, attr) {\n        $mdTheming(element);\n        function getContent(el) {\n          return angular.element(el[0].querySelector('.md-subheader-content'));\n        }\n\n        // Transclude the user-given contents of the subheader\n        // the conventional way.\n        transclude(scope, function(clone) {\n          getContent(element).append(clone);\n        });\n\n        // Create another clone, that uses the outer and inner contents\n        // of the element, that will be 'stickied' as the user scrolls.\n        transclude(scope, function(clone) {\n          var stickyClone = $compile(angular.element(outerHTML))(scope);\n          $mdTheming(stickyClone);\n          getContent(stickyClone).append(clone);\n          $mdSticky(scope, element, stickyClone);\n        });\n      };\n    }\n  };\n}\nMdSubheaderDirective.$inject = [\"$mdSticky\", \"$compile\", \"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.swipe\n * @description Swipe module!\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeLeft\n *\n * @restrict A\n *\n * @description\n * The md-swipe-left directives allows you to specify custom behavior when an element is swiped\n * left.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-left=\"onSwipeLeft()\">Swipe me left!</div>\n * </hljs>\n */\n\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeRight\n *\n * @restrict A\n *\n * @description\n * The md-swipe-right directives allows you to specify custom behavior when an element is swiped\n * right.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-right=\"onSwipeRight()\">Swipe me right!</div>\n * </hljs>\n */\n\nvar module = angular.module('material.components.swipe',[]);\n\n['SwipeLeft', 'SwipeRight'].forEach(function(name) {\n  var directiveName = 'md' + name;\n  var eventName = '$md.' + name.toLowerCase();\n\n  module.directive(directiveName, /*@ngInject*/ [\"$parse\", function($parse) {\n    return {\n      restrict: 'A',\n      link: postLink\n    };\n\n    function postLink(scope, element, attr) {\n      var fn = $parse(attr[directiveName]);\n\n      element.on(eventName, function(ev) {\n        scope.$apply(function() {\n          fn(scope, {\n            $event: ev\n          });\n        });\n      });\n\n    }\n  }]);\n});\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @private\n * @ngdoc module\n * @name material.components.switch\n */\n\nangular.module('material.components.switch', [\n  'material.core',\n  'material.components.checkbox'\n])\n  .directive('mdSwitch', MdSwitch);\n\n/**\n * @private\n * @ngdoc directive\n * @module material.components.switch\n * @name mdSwitch\n * @restrict E\n *\n * The switch directive is used very much like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the switch is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects.\n * @param {string=} aria-label Publish the button label used by screen-readers for accessibility. Defaults to the switch's text.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-switch ng-model=\"isActive\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-switch>\n *\n * <md-switch md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-switch>\n *\n * <md-switch ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-switch>\n *\n * </hljs>\n */\nfunction MdSwitch(mdCheckboxDirective, $mdTheming, $mdUtil, $document, $mdConstant, $parse, $$rAF, $mdGesture) {\n  var checkboxDirective = mdCheckboxDirective[0];\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-container\">' +\n        '<div class=\"md-bar\"></div>' +\n        '<div class=\"md-thumb-container\">' +\n          '<div class=\"md-thumb\" md-ink-ripple md-ink-ripple-checkbox></div>' +\n        '</div>'+\n      '</div>' +\n      '<div ng-transclude class=\"md-label\">' +\n      '</div>',\n    require: '?ngModel',\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var checkboxLink = checkboxDirective.compile(element, attr);\n    // no transition on initial load\n    element.addClass('md-dragging');\n\n    return function (scope, element, attr, ngModel) {\n      ngModel = ngModel || $mdUtil.fakeNgModel();\n      var disabledGetter = $parse(attr.ngDisabled);\n      var thumbContainer = angular.element(element[0].querySelector('.md-thumb-container'));\n      var switchContainer = angular.element(element[0].querySelector('.md-container'));\n\n      // no transition on initial load\n      $$rAF(function() {\n        element.removeClass('md-dragging');\n      });\n\n      checkboxLink(scope, element, attr, ngModel);\n\n      if (angular.isDefined(attr.ngDisabled)) {\n        scope.$watch(disabledGetter, function(isDisabled) {\n          element.attr('tabindex', isDisabled ? -1 : 0);\n        });\n      }\n\n      // These events are triggered by setup drag\n      $mdGesture.register(switchContainer, 'drag');\n      switchContainer\n        .on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      var drag;\n      function onDragStart(ev) {\n        // Don't go if ng-disabled===true\n        if (disabledGetter(scope)) return;\n        ev.stopPropagation();\n\n        element.addClass('md-dragging');\n        drag = {\n          width: thumbContainer.prop('offsetWidth')\n        };\n        element.removeClass('transition');\n      }\n\n      function onDrag(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n        ev.srcEvent && ev.srcEvent.preventDefault();\n\n        var percent = ev.pointer.distanceX / drag.width;\n\n        //if checked, start from right. else, start from left\n        var translate = ngModel.$viewValue ?  1 + percent : percent;\n        // Make sure the switch stays inside its bounds, 0-1%\n        translate = Math.max(0, Math.min(1, translate));\n\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + (100*translate) + '%,0,0)');\n        drag.translate = translate;\n      }\n\n      function onDragEnd(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n\n        element.removeClass('md-dragging');\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, '');\n\n        // We changed if there is no distance (this is a click a click),\n        // or if the drag distance is >50% of the total.\n        var isChanged = ngModel.$viewValue ? drag.translate < 0.5 : drag.translate > 0.5;\n        if (isChanged) {\n          applyModelValue(!ngModel.$viewValue);\n        }\n        drag = null;\n      }\n\n      function applyModelValue(newValue) {\n        scope.$apply(function() {\n          ngModel.$setViewValue(newValue);\n          ngModel.$render();\n        });\n      }\n\n    };\n  }\n\n\n}\nMdSwitch.$inject = [\"mdCheckboxDirective\", \"$mdTheming\", \"$mdUtil\", \"$document\", \"$mdConstant\", \"$parse\", \"$$rAF\", \"$mdGesture\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tabs\n * @description\n *\n *  Tabs, created with the `<md-tabs>` directive provide *tabbed* navigation with different styles.\n *  The Tabs component consists of clickable tabs that are aligned horizontally side-by-side.\n *\n *  Features include support for:\n *\n *  - static or dynamic tabs,\n *  - responsive designs,\n *  - accessibility support (ARIA),\n *  - tab pagination,\n *  - external or internal tab content,\n *  - focus indicators and arrow-key navigations,\n *  - programmatic lookup and access to tab controllers, and\n *  - dynamic transitions through different tab contents.\n *\n */\n/*\n * @see js folder for tabs implementation\n */\nangular.module('material.components.tabs', [\n  'material.core',\n  'material.components.icon'\n]);\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.textField\n * @description\n * Form\n */\nangular.module('material.components.textField', [\n  'material.core'\n])\n  .directive('mdInputGroup', mdInputGroupDirective)\n  .directive('mdInput', mdInputDirective)\n  .directive('mdTextFloat', mdTextFloatDirective);\n\n\nfunction mdTextFloatDirective($mdTheming, $mdUtil, $parse, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    scope : {\n      fid : '@?mdFid',\n      label : '@?',\n      value : '=ngModel'\n    },\n    compile : function(element, attr) {\n\n      $log.warn('<md-text-float> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      if ( angular.isUndefined(attr.mdFid) ) {\n        attr.mdFid = $mdUtil.nextUid();\n      }\n\n      return {\n        pre : function(scope, element, attrs) {\n          var disabledParsed = $parse(attrs.ngDisabled);\n          scope.isDisabled = function() {\n            return disabledParsed(scope.$parent);\n          };\n\n          scope.inputType = attrs.type || \"text\";\n        },\n        post: $mdTheming\n      };\n    },\n    template:\n    '<md-input-group tabindex=\"-1\">' +\n    ' <label for=\"{{fid}}\" >{{label}}</label>' +\n    ' <md-input id=\"{{fid}}\" ng-disabled=\"isDisabled()\" ng-model=\"value\" type=\"{{inputType}}\"></md-input>' +\n    '</md-input-group>'\n  };\n}\nmdTextFloatDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$parse\", \"$log\"];\n\nfunction mdInputGroupDirective($log) {\n  return {\n    restrict: 'CE',\n    controller: ['$element', function($element) {\n\n      $log.warn('<md-input-group> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n      this.setFocused = function(isFocused) {\n        $element.toggleClass('md-input-focused', !!isFocused);\n      };\n      this.setHasValue = function(hasValue) {\n        $element.toggleClass('md-input-has-value', hasValue );\n      };\n    }]\n  };\n\n}\nmdInputGroupDirective.$inject = [\"$log\"];\n\nfunction mdInputDirective($mdUtil, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    template: '<input >',\n    require: ['^?mdInputGroup', '?ngModel'],\n    link: function(scope, element, attr, ctrls) {\n      if ( !ctrls[0] ) return;\n\n      $log.warn('<md-input> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      var inputGroupCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n\n      scope.$watch(scope.isDisabled, function(isDisabled) {\n        element.attr('aria-disabled', !!isDisabled);\n        element.attr('tabindex', !!isDisabled);\n      });\n      element.attr('type', attr.type || element.parent().attr('type') || \"text\");\n\n      // When the input value changes, check if it \"has\" a value, and\n      // set the appropriate class on the input group\n      if (ngModelCtrl) {\n        //Add a $formatter so we don't use up the render function\n        ngModelCtrl.$formatters.push(function(value) {\n          inputGroupCtrl.setHasValue( isNotEmpty(value) );\n          return value;\n        });\n      }\n\n      element\n        .on('input', function() {\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        })\n        .on('focus', function(e) {\n          // When the input focuses, add the focused class to the group\n          inputGroupCtrl.setFocused(true);\n        })\n        .on('blur', function(e) {\n          // When the input blurs, remove the focused class from the group\n          inputGroupCtrl.setFocused(false);\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        });\n\n      scope.$on('$destroy', function() {\n        inputGroupCtrl.setFocused(false);\n        inputGroupCtrl.setHasValue(false);\n      });\n\n\n      function isNotEmpty(value) {\n        value = angular.isUndefined(value) ? element.val() : value;\n        return (angular.isDefined(value) && (value!==null) &&\n               (value.toString().trim() !== \"\"));\n      }\n    }\n  };\n}\nmdInputDirective.$inject = [\"$mdUtil\", \"$log\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toast\n * @description\n * Toast\n */\nangular.module('material.components.toast', [\n  'material.core',\n  'material.components.button'\n])\n  .directive('mdToast', MdToastDirective)\n  .provider('$mdToast', MdToastProvider);\n\nfunction MdToastDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdToast\n * @module material.components.toast\n *\n * @description\n * `$mdToast` is a service to build a toast nofication on any position\n * on the screen with an optional duration, and provides a simple promise API.\n *\n *\n * ## Restrictions on custom toasts\n * - The toast's template must have an outer `<md-toast>` element.\n * - For a toast action, use element with class `md-action`.\n * - Add the class `md-capsule` for curved corners.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openToast()\">\n *     Open a Toast!\n *   </md-button>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdToast) {\n *   $scope.openToast = function($event) {\n *     $mdToast.show($mdToast.simple().content('Hello!'));\n *     // Could also do $mdToast.showSimple('Hello');\n *   };\n * });\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#showSimple\n * \n * @description\n * Convenience method which builds and shows a simple toast.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#simple\n *\n * @description\n * Builds a preconfigured toast.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods:\n *\n * - $mdToastPreset#content(string) - sets toast content to string\n * - $mdToastPreset#action(string) - adds an action button, which resolves the promise returned from `show()` if clicked.\n * - $mdToastPreset#highlightAction(boolean) - sets action button to be highlighted\n * - $mdToastPreset#capsule(boolean) - adds 'md-capsule' class to the toast (curved corners)\n * - $mdToastPreset#theme(boolean) - sets the theme on the toast to theme (default is `$mdThemingProvider`'s default theme)\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#updateContent\n * \n * @description\n * Updates the content of an existing toast. Useful for updating things like counts, etc.\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#build\n *\n * @description\n * Creates a custom `$mdToastPreset` that you can configure.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods for shows' options (see below).\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#show\n *\n * @description Shows the toast.\n *\n * @param {object} optionsOrPreset Either provide an `$mdToastPreset` returned from `simple()`\n * and `build()`, or an options object with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *     be used as the content of the toast. Restrictions: the template must\n *     have an outer `md-toast` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *     template string.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n *     This scope will be destroyed when the toast is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `hideDelay` - `{number=}`: How many milliseconds the toast should stay\n *     active before automatically closing.  Set to 0 or false to have the toast stay open until\n *     closed manually. Default: 3000.\n *   - `position` - `{string=}`: Where to place the toast. Available: any combination\n *     of 'bottom', 'left', 'top', 'right', 'fit'. Default: 'bottom left'.\n *   - `controller` - `{string=}`: The controller to associate with this toast.\n *     The controller will be injected the local `$hideToast`, which is a function\n *     used to hide the toast.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *     be used as names of values to inject into the controller. For example,\n *     `locals: {three: 3}` would inject `three` into the controller with the value\n *     of 3.\n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *     and the toast will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the toast to. Defaults to appending\n *     to the root element of the application.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#hide\n *\n * @description\n * Hide an existing toast and resolve the promise returned from `$mdToast.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n * @returns {promise} a promise that is called when the existing element is removed from the DOM\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#cancel\n *\n * @description\n * Hide the existing toast and reject the promise returned from\n * `$mdToast.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n * @returns {promise} a promise that is called when the existing element is removed from the DOM\n *\n */\n\nfunction MdToastProvider($$interimElementProvider) {\n  var activeToastContent;\n  var $mdToast = $$interimElementProvider('$mdToast')\n    .setDefaults({\n      methods: ['position', 'hideDelay', 'capsule'],\n      options: toastDefaultOptions\n    })\n    .addPreset('simple', {\n      argOption: 'content',\n      methods: ['content', 'action', 'highlightAction', 'theme'],\n      options: /* @ngInject */ [\"$mdToast\", \"$mdTheming\", function($mdToast, $mdTheming) {\n        var opts = {\n          template: [\n            '<md-toast md-theme=\"{{ toast.theme }}\" ng-class=\"{\\'md-capsule\\': toast.capsule}\">',\n              '<span flex>{{ toast.content }}</span>',\n              '<md-button class=\"md-action\" ng-if=\"toast.action\" ng-click=\"toast.resolve()\" ng-class=\"{\\'md-highlight\\': toast.highlightAction}\">',\n                '{{ toast.action }}',\n              '</md-button>',\n            '</md-toast>'\n          ].join(''),\n          controller: /* @ngInject */ [\"$scope\", function mdToastCtrl($scope) {\n            var self = this;\n            $scope.$watch(function() { return activeToastContent; }, function() {\n              self.content = activeToastContent;\n            });\n            this.resolve = function() {\n              $mdToast.hide();\n            };\n          }],\n          theme: $mdTheming.defaultTheme(),\n          controllerAs: 'toast',\n          bindToController: true\n        };\n        return opts;\n      }]\n    })\n    .addMethod('updateContent', function(newContent) {\n      activeToastContent = newContent;\n    });\n\n  toastDefaultOptions.$inject = [\"$timeout\", \"$animate\", \"$mdToast\"];\n    return $mdToast;\n\n  /* @ngInject */\n  function toastDefaultOptions($timeout, $animate, $mdToast) {\n    return {\n      onShow: onShow,\n      onRemove: onRemove,\n      position: 'bottom left',\n      themable: true,\n      hideDelay: 3000\n    };\n\n    function onShow(scope, element, options) {\n      // 'top left' -> 'md-top md-left'\n      activeToastContent = options.content;\n      element.addClass(options.position.split(' ').map(function(pos) {\n        return 'md-' + pos;\n      }).join(' '));\n      options.parent.addClass(toastOpenClass(options.position));\n\n      options.onSwipe = function(ev, gesture) {\n        //Add swipeleft/swiperight class to element so it can animate correctly\n        element.addClass('md-' + ev.type.replace('$md.',''));\n        $timeout($mdToast.cancel);\n      };\n      element.on('$md.swipeleft $md.swiperight', options.onSwipe);\n      return $animate.enter(element, options.parent);\n    }\n\n    function onRemove(scope, element, options) {\n      element.off('$md.swipeleft $md.swiperight', options.onSwipe);\n      options.parent.removeClass(toastOpenClass(options.position));\n      return $animate.leave(element);\n    }\n\n    function toastOpenClass(position) {\n      return 'md-toast-open-' +\n        (position.indexOf('top') > -1 ? 'top' : 'bottom');\n    }\n  }\n\n}\nMdToastProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toolbar\n */\nangular.module('material.components.toolbar', [\n  'material.core',\n  'material.components.content'\n])\n  .directive('mdToolbar', mdToolbarDirective);\n\n/**\n * @ngdoc directive\n * @name mdToolbar\n * @module material.components.toolbar\n * @restrict E\n * @description\n * `md-toolbar` is used to place a toolbar in your app.\n *\n * Toolbars are usually used above a content area to display the title of the\n * current page, and show relevant action buttons for that page.\n *\n * You can change the height of the toolbar by adding either the\n * `md-medium-tall` or `md-tall` class to the toolbar.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"column\" layout-fill>\n *   <md-toolbar>\n *\n *     <div class=\"md-toolbar-tools\">\n *       <span>My App's Title</span>\n *\n *       <!-- fill up the space between left and right area -->\n *       <span flex></span>\n *\n *       <md-button>\n *         Right Bar Button\n *       </md-button>\n *     </div>\n *\n *   </md-toolbar>\n *   <md-content>\n *     Hello!\n *   </md-content>\n * </div>\n * </hljs>\n *\n * @param {boolean=} md-scroll-shrink Whether the header should shrink away as\n * the user scrolls down, and reveal itself as the user scrolls up.\n * Note: for scrollShrink to work, the toolbar must be a sibling of a\n * `md-content` element, placed before it. See the scroll shrink demo.\n *\n *\n * @param {number=} md-shrink-speed-factor How much to change the speed of the toolbar's\n * shrinking by. For example, if 0.25 is given then the toolbar will shrink\n * at one fourth the rate at which the user scrolls down. Default 0.5.\n */\nfunction mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    controller: angular.noop,\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n\n      if (angular.isDefined(attr.mdScrollShrink)) {\n        setupScrollShrink();\n      }\n\n      function setupScrollShrink() {\n        // Current \"y\" position of scroll\n        var y = 0;\n        // Store the last scroll top position\n        var prevScrollTop = 0;\n\n        var shrinkSpeedFactor = attr.mdShrinkSpeedFactor || 0.5;\n\n        var toolbarHeight;\n        var contentElement;\n\n        var debouncedContentScroll = $$rAF.throttle(onContentScroll);\n        var debouncedUpdateHeight = $mdUtil.debounce(updateToolbarHeight, 5 * 1000);\n\n        // Wait for $mdContentLoaded event from mdContent directive.\n        // If the mdContent element is a sibling of our toolbar, hook it up\n        // to scroll events.\n        scope.$on('$mdContentLoaded', onMdContentLoad);\n\n        function onMdContentLoad($event, newContentEl) {\n          // Toolbar and content must be siblings\n          if (element.parent()[0] === newContentEl.parent()[0]) {\n            // unhook old content event listener if exists\n            if (contentElement) {\n              contentElement.off('scroll', debouncedContentScroll);\n            }\n\n            newContentEl.on('scroll', debouncedContentScroll);\n            newContentEl.attr('scroll-shrink', 'true');\n\n            contentElement = newContentEl;\n            $$rAF(updateToolbarHeight);\n          }\n        }\n\n        function updateToolbarHeight() {\n          toolbarHeight = element.prop('offsetHeight');\n          // Add a negative margin-top the size of the toolbar to the content el.\n          // The content will start transformed down the toolbarHeight amount,\n          // so everything looks normal.\n          //\n          // As the user scrolls down, the content will be transformed up slowly\n          // to put the content underneath where the toolbar was.\n          contentElement.css(\n            'margin-top',\n            (-toolbarHeight * shrinkSpeedFactor) + 'px'\n          );\n          onContentScroll();\n        }\n\n        function onContentScroll(e) {\n          var scrollTop = e ? e.target.scrollTop : prevScrollTop;\n\n          debouncedUpdateHeight();\n\n          y = Math.min(\n            toolbarHeight / shrinkSpeedFactor,\n            Math.max(0, y + scrollTop - prevScrollTop)\n          );\n\n          element.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + (-y * shrinkSpeedFactor) + 'px,0)'\n          );\n          contentElement.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + ((toolbarHeight - y) * shrinkSpeedFactor) + 'px,0)'\n          );\n\n          prevScrollTop = scrollTop;\n        }\n\n      }\n\n    }\n  };\n\n}\nmdToolbarDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tooltip\n */\nangular.module('material.components.tooltip', [\n  'material.core'\n])\n  .directive('mdTooltip', MdTooltipDirective);\n\n/**\n * @ngdoc directive\n * @name mdTooltip\n * @module material.components.tooltip\n * @description\n * Tooltips are used to describe elements that are interactive and primarily graphical (not textual).\n *\n * Place a `<md-tooltip>` as a child of the element it describes.\n *\n * A tooltip will activate when the user focuses, hovers over, or touches the parent.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-icon icon=\"/img/icons/ic_play_arrow_24px.svg\">\n *   <md-tooltip>\n *     Play Music\n *   </md-tooltip>\n * </md-icon>\n * </hljs>\n *\n * @param {expression=} md-visible Boolean bound to whether the tooltip is\n * currently visible.\n * @param {number=} md-delay How many milliseconds to wait to show the tooltip after the user focuses, hovers, or touches the parent. Defaults to 400ms.\n * @param {string=} md-direction Which direction would you like the tooltip to go?  Supports left, right, top, and bottom.  Defaults to bottom.\n */\nfunction MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil, $mdTheming, $rootElement, $animate, $q) {\n\n  var TOOLTIP_SHOW_DELAY = 0;\n  var TOOLTIP_WINDOW_EDGE_SPACE = 8;\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-background\"></div>' +\n      '<div class=\"md-content\" ng-transclude></div>',\n    scope: {\n      visible: '=?mdVisible',\n      delay: '=?mdDelay'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, contentCtrl) {\n    $mdTheming(element);\n    var parent = element.parent();\n    var background = angular.element(element[0].getElementsByClassName('md-background')[0]);\n    var content = angular.element(element[0].getElementsByClassName('md-content')[0]);\n    var direction = attr.mdDirection;\n\n    // Keep looking for a higher parent if our current one has no pointer events\n    while ($window.getComputedStyle(parent[0])['pointer-events'] == 'none') {\n      parent = parent.parent();\n    }\n\n    // Look for the nearest parent md-content, stopping at the rootElement.\n    var current = element.parent()[0];\n    while (current && current !== $rootElement[0] && current !== document.body) {\n      if (current.tagName && current.tagName.toLowerCase() == 'md-content') break;\n      current = current.parentNode;\n    }\n    var tooltipParent = angular.element(current || document.body);\n\n    if (!angular.isDefined(attr.mdDelay)) {\n      scope.delay = TOOLTIP_SHOW_DELAY;\n    }\n\n    // We will re-attach tooltip when visible\n    element.detach();\n    element.attr('role', 'tooltip');\n    element.attr('id', attr.id || ('tooltip_' + $mdUtil.nextUid()));\n\n    parent.on('focus mouseenter touchstart', function() { setVisible(true); });\n    parent.on('blur mouseleave touchend touchcancel', function() { if ($document[0].activeElement !== parent[0]) setVisible(false); });\n\n    scope.$watch('visible', function(isVisible) {\n      if (isVisible) showTooltip();\n      else hideTooltip();\n    });\n\n    var debouncedOnResize = $$rAF.throttle(function () { if (scope.visible) positionTooltip(); });\n    angular.element($window).on('resize', debouncedOnResize);\n\n    // Be sure to completely cleanup the element on destroy\n    scope.$on('$destroy', function() {\n      scope.visible = false;\n      element.remove();\n      angular.element($window).off('resize', debouncedOnResize);\n    });\n\n    // *******\n    // Methods\n    // *******\n\n    // If setting visible to true, debounce to scope.delay ms\n    // If setting visible to false and no timeout is active, instantly hide the tooltip.\n    function setVisible (value) {\n      setVisible.value = !!value;\n      if (!setVisible.queued) {\n        if (value) {\n          setVisible.queued = true;\n          $timeout(function() {\n            scope.visible = setVisible.value;\n            setVisible.queued = false;\n          }, scope.delay);\n\n        } else {\n          $timeout(function() { scope.visible = false; });\n        }\n      }\n    }\n\n    function showTooltip() {\n      // Insert the element before positioning it, so we can get position\n      parent.attr('aria-describedby', element.attr('id'));\n      tooltipParent.append(element);\n\n      // Wait until the element has been in the dom for two frames before fading it in.\n      // Additionally, we position the tooltip twice to avoid positioning bugs\n      positionTooltip();\n      $animate.addClass(element, 'md-show');\n      $animate.addClass(background, 'md-show');\n      $animate.addClass(content, 'md-show');\n    }\n\n    function hideTooltip() {\n      parent.removeAttr('aria-describedby');\n      $q.all([\n        $animate.removeClass(content, 'md-show'),\n        $animate.removeClass(background, 'md-show'),\n        $animate.removeClass(element, 'md-show')\n      ]).then(function () {\n        if (!scope.visible) element.detach();\n      });\n    }\n\n    function positionTooltip() {\n      var tipRect = $mdUtil.offsetRect(element, tooltipParent);\n      var parentRect = $mdUtil.offsetRect(parent, tooltipParent);\n\n      // Default to bottom position if possible\n      var tipDirection = 'bottom';\n      var newPosition = {\n        left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n        top: parentRect.top + parentRect.height\n      };\n\n      // If element bleeds over left/right of the window, place it on the edge of the window.\n      newPosition.left = Math.min(\n        newPosition.left,\n        tooltipParent.prop('scrollWidth') - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE\n      );\n      newPosition.left = Math.max(newPosition.left, TOOLTIP_WINDOW_EDGE_SPACE);\n\n      // If element bleeds over the bottom of the window, place it above the parent.\n      if (newPosition.top + tipRect.height > tooltipParent.prop('scrollHeight')) {\n        newPosition.top = parentRect.top - tipRect.height;\n        tipDirection = 'top';\n      }\n\n      element.css({top: newPosition.top + 'px', left: newPosition.left + 'px'});\n\n      positionBackground();\n\n      function positionBackground () {\n        var size = direction === 'left' || direction === 'right'\n              ? Math.sqrt(Math.pow(tipRect.width, 2) + Math.pow(tipRect.height / 2, 2)) * 2\n              : Math.sqrt(Math.pow(tipRect.width / 2, 2) + Math.pow(tipRect.height, 2)) * 2,\n            position = direction === 'left' ? { left: 100, top: 50 }\n              : direction === 'right' ? { left: 0, top: 50 }\n              : direction === 'top' ? { left: 50, top: 100 }\n              : { left: 50, top: 0 };\n        background.css({\n          width: size + 'px',\n          height: size + 'px',\n          left: position.left + '%',\n          top: position.top + '%'\n        });\n      }\n\n      function fitOnScreen (pos) {\n        var newPosition = {};\n        newPosition.left = Math.min( pos.left, tooltipParent.prop('scrollWidth') - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.left = Math.max( pos.left, TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.top  = Math.min( pos.top,  tooltipParent.prop('scrollHeight') - tipRect.height - TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.top  = Math.max( pos.top,  TOOLTIP_WINDOW_EDGE_SPACE );\n        return newPosition;\n      }\n\n      function getPosition (dir) {\n        return dir === 'left'\n          ? { left: parentRect.left - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE,\n              top: parentRect.top + parentRect.height / 2 - tipRect.height / 2 }\n          : dir === 'right'\n          ? { left: parentRect.left + parentRect.width + TOOLTIP_WINDOW_EDGE_SPACE,\n              top: parentRect.top + parentRect.height / 2 - tipRect.height / 2 }\n          : dir === 'top'\n          ? { left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n              top: parentRect.top - tipRect.height - TOOLTIP_WINDOW_EDGE_SPACE }\n          : { left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n              top: parentRect.top + parentRect.height + TOOLTIP_WINDOW_EDGE_SPACE };\n      }\n    }\n\n  }\n\n}\nMdTooltipDirective.$inject = [\"$timeout\", \"$window\", \"$$rAF\", \"$document\", \"$mdUtil\", \"$mdTheming\", \"$rootElement\", \"$animate\", \"$q\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.whiteframe\n */\nangular.module('material.components.whiteframe', []);\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdAutocompleteCtrl', MdAutocompleteCtrl);\n\n  function MdAutocompleteCtrl ($scope, $element, $timeout, $q, $mdUtil, $mdConstant) {\n\n    //-- private variables\n    var self = this,\n        itemParts = $scope.itemsExpr.split(/ in /i),\n        itemExpr = itemParts[1],\n        elements = {\n          main:  $element[0],\n          ul:    $element[0].getElementsByTagName('ul')[0],\n          input: $element[0].getElementsByTagName('input')[0]\n        },\n        promise = null,\n        cache = {};\n\n    //-- public variables\n    self.scope = $scope;\n    self.parent = $scope.$parent;\n    self.itemName = itemParts[0];\n    self.matches = [];\n    self.loading = false;\n    self.hidden = true;\n    self.index = 0;\n    self.keydown = keydown;\n    self.blur = blur;\n    self.clear = clearValue;\n    self.select = select;\n    self.getCurrentDisplayValue = getCurrentDisplayValue;\n    self.fetch = $mdUtil.debounce(fetchResults);\n\n    return init();\n\n    //-- start method definitions\n    function init () {\n      configureWatchers();\n      configureAria();\n    }\n\n    function configureAria () {\n      var ul = angular.element(elements.ul),\n          input = angular.element(elements.input),\n          id = ul.attr('id') || 'ul_' + $mdUtil.nextUid();\n      ul.attr('id', id);\n      input.attr('aria-owns', id);\n    }\n\n    function getItemScope (item) {\n      if (!item) return;\n      var locals = {};\n      if (self.itemName) locals[self.itemName] = $scope.selectedItem;\n      return locals;\n    }\n\n    function configureWatchers () {\n      $scope.$watch('searchText', function (searchText) {\n        self.index = -1;\n        if (!searchText || searchText.length < Math.max(parseInt($scope.minLength, 10), 1)) {\n          self.loading = false;\n          self.matches = [];\n          self.hidden = shouldHide();\n          return;\n        }\n        var term = searchText.toLowerCase();\n        if (promise && promise.cancel) {\n          promise.cancel();\n          promise = null;\n        }\n        if (!$scope.noCache && cache[term]) {\n          self.matches = cache[term];\n        } else {\n          self.fetch(searchText);\n        }\n        self.hidden = shouldHide();\n        if ($scope.textChange) $scope.textChange(getItemScope($scope.selectedItem));\n      });\n      $scope.$watch('selectedItem', function (selectedItem) {\n        if ($scope.itemChange) $scope.itemChange(getItemScope(selectedItem));\n      });\n    }\n\n    function fetchResults (searchText) {\n      var items = $scope.$parent.$eval(itemExpr),\n          term = searchText.toLowerCase();\n      if (angular.isArray(items)) {\n        handleResults(items);\n      } else {\n        self.loading = true;\n        promise = $q.when(items).then(handleResults);\n      }\n      function handleResults (matches) {\n        cache[term] = matches;\n        if (searchText !== $scope.searchText) return; //-- just cache the results if old request\n        promise = null;\n        self.loading = false;\n        self.matches = matches;\n        self.hidden = shouldHide();\n      }\n    }\n\n    function blur () {\n      self.hidden = true;\n    }\n\n    function keydown (event) {\n      switch (event.keyCode) {\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.min(self.index + 1, self.matches.length - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.UP_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.max(0, self.index - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.ENTER:\n            if (self.loading || self.index < 0) return;\n            event.preventDefault();\n            select(self.index);\n            break;\n        case $mdConstant.KEY_CODE.ESCAPE:\n            self.matches = [];\n            self.hidden = true;\n            self.index = -1;\n            break;\n        case $mdConstant.KEY_CODE.TAB:\n            break;\n        default:\n      }\n    }\n\n    function clearValue () {\n      $scope.searchText = '';\n      select(-1);\n      elements.input.focus();\n    }\n\n    function shouldHide () {\n      return self.matches.length === 1 && $scope.searchText === getDisplayValue(self.matches[0]);\n    }\n\n    function getCurrentDisplayValue () {\n      return getDisplayValue(self.matches[self.index]);\n    }\n\n    function getDisplayValue (item) {\n      return (item && $scope.itemText) ? $scope.itemText(getItemScope(item)) : item;\n    }\n\n    function select (index) {\n      $scope.selectedItem = self.matches[index];\n      $scope.searchText = getDisplayValue($scope.selectedItem) || $scope.searchText;\n      self.hidden = true;\n      self.index = -1;\n      self.matches = [];\n    }\n\n    function updateScroll () {\n      var top = 41 * self.index,\n          bot = top + 41,\n          hgt = 41 * 5.5;\n      if (top < elements.ul.scrollTop) {\n        elements.ul.scrollTop = top;\n      } else if (bot > elements.ul.scrollTop + hgt) {\n        elements.ul.scrollTop = bot - hgt;\n      }\n    }\n\n  }\n  MdAutocompleteCtrl.$inject = [\"$scope\", \"$element\", \"$timeout\", \"$q\", \"$mdUtil\", \"$mdConstant\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocomplete', MdAutocomplete);\n\n  /**\n   * @ngdoc directive\n   * @name mdAutocomplete\n   * @module material.components.autocomplete\n   *\n   * @description\n   * `<md-autocomplete>` is a special input component with a drop-down of all possible matches to a custom query.\n   * This component allows you to provide real-time suggestions as the user types in the input area.\n   *\n   * @param {string=} md-search-text A model to bind the search query text to\n   * @param {object=} md-selected-item A model to bind the selected item to\n   * @param {expression} md-items An expression in the format of `item in items` to iterate over matches for your search.\n   * @param {string=} md-item-text An expression that will convert your object to a single string.\n   * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n   * @param {boolean=} md-no-cache Disables the internal caching that happens in autocomplete\n   * @param {expression} md-selected-item-change An expression to be run each time a new item is selected\n   * @param {expression} md-search-text-change An expression to be run each time the search text updates\n   * @param {boolean=} ng-disabled Determines whether or not to disable the input field\n   * @param {number=} md-min-length Specifies the minimum length of text before autocomplete will make suggestions\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <md-autocomplete\n   *       md-selected-item=\"selectedItem\"\n   *       md-search-text=\"searchText\"\n   *       md-items=\"item in getMatches(searchText)\"\n   *       md-item-text=\"item.display\">\n   *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n   *   </md-autocomplete>\n   * </hljs>\n   */\n\n  function MdAutocomplete () {\n    return {\n      template:     '\\\n        <md-autocomplete-wrap role=\"listbox\">\\\n          <input type=\"text\"\\\n              ng-disabled=\"isDisabled\"\\\n              ng-model=\"searchText\"\\\n              ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"\\\n              ng-blur=\"$mdAutocompleteCtrl.blur()\"\\\n              placeholder=\"{{placeholder}}\"\\\n              aria-label=\"{{placeholder}}\"\\\n              aria-autocomplete=\"list\"\\\n              aria-haspopup=\"true\"\\\n              aria-activedescendant=\"\"\\\n              aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>\\\n          <button\\\n              type=\"button\"\\\n              ng-if=\"searchText\"\\\n              ng-click=\"$mdAutocompleteCtrl.clear()\">\\\n              <md-icon md-svg-icon=\"cancel\"></md-icon>\\\n              <span class=\"visually-hidden\">Clear</span>\\\n              </button>\\\n          <md-progress-linear ng-if=\"$mdAutocompleteCtrl.loading\" md-mode=\"indeterminate\"></md-progress-linear>\\\n        </md-autocomplete-wrap>\\\n        <ul role=\"presentation\">\\\n          <li ng-repeat=\"(index, item) in $mdAutocompleteCtrl.matches\"\\\n              ng-class=\"{ selected: index === $mdAutocompleteCtrl.index }\"\\\n              ng-show=\"searchText && !$mdAutocompleteCtrl.hidden\"\\\n              ng-click=\"$mdAutocompleteCtrl.select(index)\"\\\n              ng-transclude\\\n              md-autocomplete-list-item=\"$mdAutocompleteCtrl.itemName\">\\\n          </li>\\\n        </ul>\\\n        <aria-status\\\n            class=\"visually-hidden\"\\\n            role=\"status\"\\\n            aria-live=\"assertive\">\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length === 1\">There is 1 match available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length > 1\">There are {{$mdAutocompleteCtrl.matches.length}} matches available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index >= 0\">{{ $mdAutocompleteCtrl.getCurrentDisplayValue() }}</p>\\\n        </aria-status>',\n      transclude:   true,\n      controller:   'MdAutocompleteCtrl',\n      controllerAs: '$mdAutocompleteCtrl',\n      scope:        {\n        searchText:   '=mdSearchText',\n        selectedItem: '=mdSelectedItem',\n        itemsExpr:    '@mdItems',\n        itemText:     '&mdItemText',\n        placeholder:  '@placeholder',\n        noCache:      '=mdNoCache',\n        itemChange:   '&mdSelectedItemChange',\n        textChange:   '&mdSearchTextChange',\n        isDisabled:   '=ngDisabled',\n        minLength:    '=mdMinLength'\n      }\n    };\n  }\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdHighlightCtrl', MdHighlightCtrl);\n\n  function MdHighlightCtrl ($scope, $element, $interpolate) {\n    var term = $element.attr('md-highlight-text'),\n        text = $interpolate($element.text())($scope);\n    $scope.$watch(term, function (term) {\n      var regex = new RegExp('^' + sanitize(term), 'i'),\n          html = text.replace(regex, '<span class=\"highlight\">$&</span>');\n      $element.html(html);\n    });\n\n    function sanitize (term) {\n      if (!term) return term;\n      return term.replace(/[\\*\\[\\]\\(\\)\\{\\}\\\\\\^\\$]/g, '\\\\$&');\n    }\n  }\n  MdHighlightCtrl.$inject = [\"$scope\", \"$element\", \"$interpolate\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdHighlightText', MdHighlight);\n\n  /**\n   * @ngdoc directive\n   * @name mdHighlightText\n   * @module material.components.autocomplete\n   *\n   * @description\n   * The `md-highlight-text` directive allows you to specify text that should be highlighted within\n   * an element.  Highlighted text will be wrapped in `<span class=\"highlight\"></span>` which can\n   * be styled through CSS.  Please note that child elements may not be used with this directive.\n   *\n   * @param {string=} md-highlight-text A model to be searched for\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   * <input placeholder=\"Enter a search term...\" ng-model=\"searchTerm\" type=\"text\" />\n   * <ul>\n   *   <li ng-repeat=\"result in results\" md-highlight-text=\"searchTerm\">\n   *     {{result.text}}\n   *   </li>\n   * </ul>\n   * </hljs>\n   */\n\n  function MdHighlight () {\n    return {\n      terminal: true,\n      scope: false,\n      controller: 'MdHighlightCtrl'\n    };\n  }\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocompleteListItem', MdAutocompleteListItem);\n\n  function MdAutocompleteListItem ($compile, $mdUtil) {\n    return {\n      require: '^?mdAutocomplete',\n      terminal: true,\n      link: link,\n      scope: false\n    };\n    function link (scope, element, attr, ctrl) {\n      var newScope = ctrl.parent.$new(false, ctrl.parent),\n          itemName = ctrl.scope.$eval(attr.mdAutocompleteListItem);\n      newScope[itemName] = scope.item;\n      $compile(element.contents())(newScope);\n      element.attr({ 'role': 'option', 'id': 'item_' + $mdUtil.nextUid() });\n    }\n  }\n  MdAutocompleteListItem.$inject = [\"$compile\", \"$mdUtil\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n/**\n * Conditionally configure ink bar animations when the\n * tab selection changes. If `mdNoBar` then do not show the\n * bar nor animate.\n */\nangular.module('material.components.tabs')\n  .directive('mdTabsInkBar', MdTabInkDirective);\n\nfunction MdTabInkDirective($$rAF) {\n\n  var lastIndex = 0;\n\n  return {\n    restrict: 'E',\n    require: ['^?mdNoBar', '^mdTabs'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var mdNoBar = !!ctrls[0];\n\n    var tabsCtrl = ctrls[1],\n        debouncedUpdateBar = $$rAF.throttle(updateBar);\n\n    tabsCtrl.inkBarElement = element;\n\n    scope.$on('$mdTabsPaginationChanged', debouncedUpdateBar);\n\n    function updateBar() {\n      var selected = tabsCtrl.getSelectedItem();\n      var hideInkBar = !selected || tabsCtrl.count() < 2 || mdNoBar;\n\n      element.css('display', hideInkBar ? 'none' : 'block');\n\n      if (hideInkBar) return;\n\n      if (scope.pagination && scope.pagination.tabData) {\n        var index = tabsCtrl.getSelectedIndex();\n        var data = scope.pagination.tabData.tabs[index] || { left: 0, right: 0, width: 0 };\n        var right = element.parent().prop('offsetWidth') - data.right;\n        var classNames = ['md-transition-left', 'md-transition-right', 'md-no-transition'];\n        var classIndex = lastIndex > index ? 0 : lastIndex < index ? 1 : 2;\n\n        element\n            .removeClass(classNames.join(' '))\n            .addClass(classNames[classIndex])\n            .css({ left: data.left + 'px', right: right + 'px' });\n\n        lastIndex = index;\n      }\n    }\n  }\n}\nMdTabInkDirective.$inject = [\"$$rAF\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n    .directive('mdTabsPagination', TabPaginationDirective);\n\nfunction TabPaginationDirective($mdConstant, $window, $$rAF, $$q, $timeout, $mdMedia) {\n\n  // Must match (2 * width of paginators) in scss\n  var PAGINATORS_WIDTH = (8 * 4) * 2;\n\n  return {\n    restrict: 'A',\n    require: '^mdTabs',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl) {\n\n    var tabs = element[0].getElementsByTagName('md-tab');\n    var debouncedUpdatePagination = $$rAF.throttle(updatePagination);\n    var tabsParent = element.children();\n    var locked = false;\n    var state = scope.pagination = {\n      page: -1,\n      active: false,\n      clickNext: function() { locked || userChangePage(+1); },\n      clickPrevious: function() { locked || userChangePage(-1); }\n    };\n\n    scope.$on('$mdTabsChanged', debouncedUpdatePagination);\n    angular.element($window).on('resize', debouncedUpdatePagination);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdatePagination);\n    });\n\n    scope.$watch(function() { return tabsCtrl.tabToFocus; }, onTabFocus);\n\n    // Make sure we don't focus an element on the next page\n    // before it's in view\n    function onTabFocus(tab, oldTab) {\n      if (!tab) return;\n\n      var pageIndex = getPageForTab(tab);\n      if (!state.active || pageIndex === state.page) {\n        tab.element.focus();\n      } else {\n        // Go to the new page, wait for the page transition to end, then focus.\n        oldTab && oldTab.element.blur();\n        setPage(pageIndex).then(function() {\n          locked = false;\n          tab.element.focus();\n        });\n      }\n    }\n\n    // Called when page is changed by a user action (click)\n    function userChangePage(increment) {\n      var sizeData = state.tabData;\n      var newPage = Math.max(0, Math.min(sizeData.pages.length - 1, state.page + increment));\n      var newTabIndex = sizeData.pages[newPage][ increment > 0 ? 'firstTabIndex' : 'lastTabIndex' ];\n      var newTab = tabsCtrl.itemAt(newTabIndex);\n      locked = true;\n      onTabFocus(newTab);\n    }\n\n    function updatePagination() {\n      if (!element.prop('offsetParent')) {\n        var watcher = waitForVisible();\n        return;\n      }\n\n      var tabs = element.find('md-tab');\n\n      disablePagination();\n\n      var sizeData = state.tabData = calculateTabData();\n      var needPagination = state.active = sizeData.pages.length > 1;\n\n      if (needPagination) { enablePagination(); }\n\n      scope.$evalAsync(function () { scope.$broadcast('$mdTabsPaginationChanged'); });\n\n      function enablePagination() {\n        tabsParent.css('width', '9999px');\n\n        //-- apply filler margins\n        angular.forEach(sizeData.tabs, function (tab) {\n          angular.element(tab.element).css('margin-left', tab.filler + 'px');\n        });\n\n        setPage(getPageForTab(tabsCtrl.getSelectedItem()));\n      }\n\n      function disablePagination() {\n        slideTabButtons(0);\n        tabsParent.css('width', '');\n        tabs.css('width', '');\n        tabs.css('margin-left', '');\n        state.page = null;\n        state.active = false;\n      }\n\n      function waitForVisible() {\n        return watcher || scope.$watch(\n            function () {\n              $timeout(function () {\n                if (element[0].offsetParent) {\n                  if (angular.isFunction(watcher)) {\n                    watcher();\n                  }\n                  debouncedUpdatePagination();\n                  watcher = null;\n                }\n              }, 0, false);\n            }\n        );\n      }\n    }\n\n    function slideTabButtons(x) {\n      if (tabsCtrl.pagingOffset === x) {\n        // Resolve instantly if no change\n        return $$q.when();\n      }\n\n      var deferred = $$q.defer();\n\n      tabsCtrl.$$pagingOffset = x;\n      tabsParent.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + x + 'px,0,0)');\n      tabsParent.on($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n\n      return deferred.promise;\n\n      function onTabsParentTransitionEnd(ev) {\n        // Make sure this event didn't bubble up from an animation in a child element.\n        if (ev.target === tabsParent[0]) {\n          tabsParent.off($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n          deferred.resolve();\n        }\n      }\n    }\n\n    function shouldStretchTabs() {\n      switch (scope.stretchTabs) {\n        case 'never':  return false;\n        case 'always': return true;\n        default:       return $mdMedia('sm');\n      }\n    }\n\n    function calculateTabData(noAdjust) {\n      var clientWidth = element.parent().prop('offsetWidth');\n      var tabsWidth = clientWidth - PAGINATORS_WIDTH - 1;\n      var $tabs = angular.element(tabs);\n      var totalWidth = 0;\n      var max = 0;\n      var tabData = [];\n      var pages = [];\n      var currentPage;\n\n      $tabs.css('max-width', '');\n      angular.forEach(tabs, function (tab, index) {\n        var tabWidth = Math.min(tabsWidth, tab.offsetWidth);\n        var data = {\n          element: tab,\n          left: totalWidth,\n          width: tabWidth,\n          right: totalWidth + tabWidth,\n          filler: 0\n        };\n\n        //-- This calculates the page for each tab.  The first page will use the clientWidth, which\n        //   does not factor in the pagination items.  After the first page, tabsWidth is used\n        //   because at this point, we know that the pagination buttons will be shown.\n        data.page = Math.ceil(data.right / ( pages.length === 1 && index === tabs.length - 1 ? clientWidth : tabsWidth )) - 1;\n\n        if (data.page >= pages.length) {\n          data.filler = (tabsWidth * data.page) - data.left;\n          data.right += data.filler;\n          data.left += data.filler;\n          currentPage = {\n            left: data.left,\n            firstTabIndex: index,\n            lastTabIndex: index,\n            tabs: [ data ]\n          };\n          pages.push(currentPage);\n        } else {\n          currentPage.lastTabIndex = index;\n          currentPage.tabs.push(data);\n        }\n        totalWidth = data.right;\n        max = Math.max(max, tabWidth);\n        tabData.push(data);\n      });\n      $tabs.css('max-width', tabsWidth + 'px');\n\n      if (!noAdjust && shouldStretchTabs()) {\n        return adjustForStretchedTabs();\n      } else {\n        return {\n          width: totalWidth,\n          max: max,\n          tabs: tabData,\n          pages: pages,\n          tabElements: tabs\n        };\n      }\n\n\n      function adjustForStretchedTabs() {\n        var canvasWidth = pages.length === 1 ? clientWidth : tabsWidth;\n        var tabsPerPage = Math.min(Math.floor(canvasWidth / max), tabs.length);\n        var tabWidth    = Math.floor(canvasWidth / tabsPerPage);\n        $tabs.css('width', tabWidth + 'px');\n        return calculateTabData(true);\n      }\n    }\n\n    function getPageForTab(tab) {\n      var tabIndex = tabsCtrl.indexOf(tab);\n      if (tabIndex === -1) return 0;\n\n      var sizeData = state.tabData;\n\n      return sizeData ? sizeData.tabs[tabIndex].page : 0;\n    }\n\n    function setPage(page) {\n      if (page === state.page) return;\n\n      var lastPage = state.tabData.pages.length - 1;\n\n      if (page < 0) page = 0;\n      if (page > lastPage) page = lastPage;\n\n      state.hasPrev = page > 0;\n      state.hasNext = page < lastPage;\n\n      state.page = page;\n\n      scope.$broadcast('$mdTabsPaginationChanged');\n\n      return slideTabButtons(-state.tabData.pages[page].left);\n    }\n  }\n\n}\nTabPaginationDirective.$inject = [\"$mdConstant\", \"$window\", \"$$rAF\", \"$$q\", \"$timeout\", \"$mdMedia\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\n\nangular.module('material.components.tabs')\n  .controller('$mdTab', TabItemController);\n\nfunction TabItemController($scope, $element, $attrs, $compile, $animate, $mdUtil, $parse, $timeout) {\n  var self = this;\n  var tabsCtrl = $element.controller('mdTabs');\n\n  // Properties\n  self.contentContainer = angular.element('<div class=\"md-tab-content ng-hide\">');\n  self.element = $element;\n\n  // Methods\n  self.isDisabled = isDisabled;\n  self.onAdd = onAdd;\n  self.onRemove = onRemove;\n  self.onSelect = onSelect;\n  self.onDeselect = onDeselect;\n\n  var disabledParsed = $parse($attrs.ngDisabled);\n  function isDisabled() {\n    return disabledParsed($scope.$parent);\n  }\n  \n  /**\n   * Add the tab's content to the DOM container area in the tabs,\n   * @param contentArea the contentArea to add the content of the tab to\n   */\n  function onAdd(contentArea, shouldDisconnectScope) {\n    if (self.content.length) {\n      self.contentContainer.append(self.content);\n      self.contentScope = $scope.$parent.$new();\n      contentArea.append(self.contentContainer);\n\n      $compile(self.contentContainer)(self.contentScope);\n      if (shouldDisconnectScope === true) {\n        $timeout(function () {\n          $mdUtil.disconnectScope(self.contentScope);\n        }, 0, false);\n      }\n    }\n  }\n\n  function onRemove() {\n    $animate.leave(self.contentContainer).then(function() {\n      self.contentScope && self.contentScope.$destroy();\n      self.contentScope = null;\n    });\n  }\n\n  function toggleAnimationClass(rightToLeft) {\n    self.contentContainer[rightToLeft ? 'addClass' : 'removeClass']('md-transition-rtl');\n  }\n\n  function onSelect(rightToLeft) {\n    // Resume watchers and events firing when tab is selected\n    $mdUtil.reconnectScope(self.contentScope);\n\n    $element\n      .addClass('active')\n      .attr({\n        'aria-selected': true,\n        'tabIndex': 0\n      })\n      .on('$md.swipeleft $md.swiperight', onSwipe);\n\n    toggleAnimationClass(rightToLeft);\n    $animate.removeClass(self.contentContainer, 'ng-hide');\n\n    $scope.onSelect();\n  }\n\n  function onDeselect(rightToLeft) {\n    // Stop watchers & events from firing while tab is deselected\n    $mdUtil.disconnectScope(self.contentScope);\n\n    $element\n      .removeClass('active')\n      .attr({\n        'aria-selected': false,\n        'tabIndex': -1\n      })\n      .off('$md.swipeleft $md.swiperight', onSwipe);\n\n    toggleAnimationClass(rightToLeft);\n    $animate.addClass(self.contentContainer, 'ng-hide');\n\n    $scope.onDeselect();\n  }\n\n  ///// Private functions\n\n  function onSwipe(ev) {\n    $scope.$apply(function() {\n      if (/left/.test(ev.type)) {\n        tabsCtrl.select(tabsCtrl.next());\n      } else {\n        tabsCtrl.select(tabsCtrl.previous());\n      }\n    });\n  }\n \n\n}\nTabItemController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$compile\", \"$animate\", \"$mdUtil\", \"$parse\", \"$timeout\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTab', MdTabDirective);\n\n/**\n * @ngdoc directive\n * @name mdTab\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * Use the `<md-tab>` a nested directive used within `<md-tabs>` to specify a tab with a **label** and optional *view content*.\n *\n * If the `label` attribute is not specified, then an optional `<md-tab-label>` tag can be used to specify more\n * complex tab header markup. If neither the **label** nor the **md-tab-label** are specified, then the nested\n * markup of the `<md-tab>` is used as the tab header markup.\n *\n * If a tab **label** has been identified, then any **non-**`<md-tab-label>` markup\n * will be considered tab content and will be transcluded to the internal `<div class=\"md-tabs-content\">` container.\n *\n * This container is used by the TabsController to show/hide the active tab's content view. This synchronization is\n * automatically managed by the internal TabsController whenever the tab selection changes. Selection changes can\n * be initiated via data binding changes, programmatic invocation, or user gestures.\n *\n * @param {string=} label Optional attribute to specify a simple string as the tab label\n * @param {boolean=} md-active When evaluteing to true, selects the tab.\n * @param {boolean=} disabled If present, disabled tab selection.\n * @param {expression=} md-on-deselect Expression to be evaluated after the tab has been de-selected.\n * @param {expression=} md-on-select Expression to be evaluated after the tab has been selected.\n *\n *\n * @usage\n *\n * <hljs lang=\"html\">\n * <md-tab label=\"\" disabled=\"\" md-on-select=\"\" md-on-deselect=\"\" >\n *   <h3>My Tab content</h3>\n * </md-tab>\n *\n * <md-tab >\n *   <md-tab-label>\n *     <h3>My Tab content</h3>\n *   </md-tab-label>\n *   <p>\n *     Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,\n *     totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae\n *     dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,\n *     sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n *   </p>\n * </md-tab>\n * </hljs>\n *\n */\nfunction MdTabDirective($mdInkRipple, $compile, $mdUtil, $mdConstant, $timeout) {\n  return {\n    restrict: 'E',\n    require: ['mdTab', '^mdTabs'],\n    controller: '$mdTab',\n    scope: {\n      onSelect: '&mdOnSelect',\n      onDeselect: '&mdOnDeselect',\n      label: '@'\n    },\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var tabLabel = element.find('md-tab-label');\n\n    if (tabLabel.length) {\n      // If a tab label element is found, remove it for later re-use.\n      tabLabel.remove();\n\n    } else if (angular.isDefined(attr.label)) {\n      // Otherwise, try to use attr.label as the label\n      tabLabel = angular.element('<md-tab-label>').html(attr.label);\n\n    } else {\n      // If nothing is found, use the tab's content as the label\n      tabLabel = angular.element('<md-tab-label>')\n                        .append(element.contents().remove());\n    }\n\n    // Everything that's left as a child is the tab's content.\n    var tabContent = element.contents().remove();\n\n    return function postLink(scope, element, attr, ctrls) {\n\n      var tabItemCtrl = ctrls[0]; // Controller for THIS tabItemCtrl\n      var tabsCtrl = ctrls[1]; // Controller for ALL tabs\n\n      $timeout(element.addClass.bind(element, 'md-tab-themed'), 0, false);\n\n      scope.$watch(\n          function () { return attr.label; },\n          function () { $timeout(function () { tabsCtrl.scope.$broadcast('$mdTabsChanged'); }, 0, false); }\n      );\n\n      transcludeTabContent();\n      configureAria();\n\n      $mdInkRipple.attachTabBehavior(scope, element, {\n        colorElement: tabsCtrl.inkBarElement\n      });\n      tabsCtrl.add(tabItemCtrl);\n      scope.$on('$destroy', function() {\n        tabsCtrl.remove(tabItemCtrl);\n      });\n      element.on('$destroy', function () {\n        //-- wait for item to be removed from the dom\n        $timeout(function () {\n          tabsCtrl.scope.$broadcast('$mdTabsChanged');\n        }, 0, false);\n      });\n\n      if (!angular.isDefined(attr.ngClick)) {\n        element.on('click', defaultClickListener);\n      }\n      element.on('keydown', keydownListener);\n\n      if (angular.isNumber(scope.$parent.$index)) {\n        watchNgRepeatIndex();\n      }\n      if (angular.isDefined(attr.mdActive)) {\n        watchActiveAttribute();\n      }\n      watchDisabled();\n\n      function transcludeTabContent() {\n        // Clone the label we found earlier, and $compile and append it\n        var label = tabLabel.clone();\n        element.append(label);\n        $compile(label)(scope.$parent);\n\n        // Clone the content we found earlier, and mark it for later placement into\n        // the proper content area.\n        tabItemCtrl.content = tabContent.clone();\n      }\n\n      //defaultClickListener isn't applied if the user provides an ngClick expression.\n      function defaultClickListener() {\n        scope.$apply(function() {\n          tabsCtrl.select(tabItemCtrl);\n          tabsCtrl.focus(tabItemCtrl);\n        });\n      }\n      function keydownListener(ev) {\n        if (ev.keyCode == $mdConstant.KEY_CODE.SPACE || ev.keyCode == $mdConstant.KEY_CODE.ENTER ) {\n          // Fire the click handler to do normal selection if space is pressed\n          element.triggerHandler('click');\n          ev.preventDefault();\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.previous(tabItemCtrl));\n          });\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.next(tabItemCtrl));\n          });\n        }\n      }\n\n      // If tabItemCtrl is part of an ngRepeat, move the tabItemCtrl in our internal array\n      // when its $index changes\n      function watchNgRepeatIndex() {\n        // The tabItemCtrl has an isolate scope, so we watch the $index on the parent.\n        scope.$watch('$parent.$index', function $indexWatchAction(newIndex) {\n          tabsCtrl.move(tabItemCtrl, newIndex);\n        });\n      }\n\n      function watchActiveAttribute() {\n        var unwatch = scope.$parent.$watch('!!(' + attr.mdActive + ')', activeWatchAction);\n        scope.$on('$destroy', unwatch);\n\n        function activeWatchAction(isActive) {\n          var isSelected = tabsCtrl.getSelectedItem() === tabItemCtrl;\n\n          if (isActive && !isSelected) {\n            tabsCtrl.select(tabItemCtrl);\n          } else if (!isActive && isSelected) {\n            tabsCtrl.deselect(tabItemCtrl);\n          }\n        }\n      }\n\n      function watchDisabled() {\n        scope.$watch(tabItemCtrl.isDisabled, disabledWatchAction);\n\n        function disabledWatchAction(isDisabled) {\n          element.attr('aria-disabled', isDisabled);\n\n          // Auto select `next` tab when disabled\n          var isSelected = (tabsCtrl.getSelectedItem() === tabItemCtrl);\n          if (isSelected && isDisabled) {\n            tabsCtrl.select(tabsCtrl.next() || tabsCtrl.previous());\n          }\n\n        }\n      }\n\n      function configureAria() {\n        // Link together the content area and tabItemCtrl with an id\n        var tabId = attr.id || ('tab_' + $mdUtil.nextUid());\n\n        element.attr({\n          id: tabId,\n          role: 'tab',\n          tabIndex: -1 //this is also set on select/deselect in tabItemCtrl\n        });\n\n        // Only setup the contentContainer's aria attributes if tab content is provided\n        if (tabContent.length) {\n          var tabContentId = 'content_' + tabId;\n          if (!element.attr('aria-controls')) {\n            element.attr('aria-controls', tabContentId);\n          }\n          tabItemCtrl.contentContainer.attr({\n            id: tabContentId,\n            role: 'tabpanel',\n            'aria-labelledby': tabId\n          });\n        }\n      }\n\n    };\n\n  }\n\n}\nMdTabDirective.$inject = [\"$mdInkRipple\", \"$compile\", \"$mdUtil\", \"$mdConstant\", \"$timeout\"];\n\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .controller('$mdTabs', MdTabsController);\n\nfunction MdTabsController($scope, $element, $mdUtil, $timeout) {\n\n  var tabsList = $mdUtil.iterator([], false);\n  var self = this;\n\n  // Properties\n  self.$element = $element;\n  self.scope = $scope;\n  // The section containing the tab content $elements\n  var contentArea = self.contentArea = angular.element($element[0].querySelector('.md-tabs-content'));\n\n  // Methods from iterator\n  var inRange = self.inRange = tabsList.inRange;\n  var indexOf = self.indexOf = tabsList.indexOf;\n  var itemAt = self.itemAt = tabsList.itemAt;\n  self.count = tabsList.count;\n\n  self.getSelectedItem = getSelectedItem;\n  self.getSelectedIndex = getSelectedIndex;\n  self.add = add;\n  self.remove = remove;\n  self.move = move;\n  self.select = select;\n  self.focus = focus;\n  self.deselect = deselect;\n\n  self.next = next;\n  self.previous = previous;\n\n  $scope.$on('$destroy', function() {\n    deselect(getSelectedItem());\n    for (var i = tabsList.count() - 1; i >= 0; i--) {\n      remove(tabsList[i], true);\n    }\n  });\n\n  // Get the selected tab\n  function getSelectedItem() {\n    return itemAt($scope.selectedIndex);\n  }\n\n  function getSelectedIndex() {\n    return $scope.selectedIndex;\n  }\n\n  // Add a new tab.\n  // Returns a method to remove the tab from the list.\n  function add(tab, index) {\n    tabsList.add(tab, index);\n\n    // Select the new tab if we don't have a selectedIndex, or if the\n    // selectedIndex we've been waiting for is this tab\n    if (!angular.isDefined(tab.element.attr('md-active')) && ($scope.selectedIndex === -1 || !angular.isNumber($scope.selectedIndex) ||\n        $scope.selectedIndex === self.indexOf(tab))) {\n      tab.onAdd(self.contentArea, false);\n      self.select(tab);\n    } else {\n      tab.onAdd(self.contentArea, true);\n    }\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function remove(tab, noReselect) {\n    if (!tabsList.contains(tab)) return;\n    if (noReselect) return;\n    var isSelectedItem = getSelectedItem() === tab,\n        newTab = previous() || next();\n\n    deselect(tab);\n    tabsList.remove(tab);\n    tab.onRemove();\n\n    $scope.$broadcast('$mdTabsChanged');\n\n    if (isSelectedItem) { select(newTab); }\n  }\n\n  // Move a tab (used when ng-repeat order changes)\n  function move(tab, toIndex) {\n    var isSelected = getSelectedItem() === tab;\n\n    tabsList.remove(tab);\n    tabsList.add(tab, toIndex);\n    if (isSelected) select(tab);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function select(tab, rightToLeft) {\n    if (!tab || tab.isSelected || tab.isDisabled()) return;\n    if (!tabsList.contains(tab)) return;\n\n    if (!angular.isDefined(rightToLeft)) {\n      rightToLeft = indexOf(tab) < $scope.selectedIndex;\n    }\n    deselect(getSelectedItem(), rightToLeft);\n\n    $scope.selectedIndex = indexOf(tab);\n    tab.isSelected = true;\n    tab.onSelect(rightToLeft);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function focus(tab) {\n    // this variable is watched by pagination\n    self.tabToFocus = tab;\n  }\n\n  function deselect(tab, rightToLeft) {\n    if (!tab || !tab.isSelected) return;\n    if (!tabsList.contains(tab)) return;\n\n    $scope.selectedIndex = -1;\n    tab.isSelected = false;\n    tab.onDeselect(rightToLeft);\n  }\n\n  function next(tab, filterFn) {\n    return tabsList.next(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n  function previous(tab, filterFn) {\n    return tabsList.previous(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n\n  function isTabEnabled(tab) {\n    return tab && !tab.isDisabled();\n  }\n\n}\nMdTabsController.$inject = [\"$scope\", \"$element\", \"$mdUtil\", \"$timeout\"];\n})();\n\n/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTabs', TabsDirective);\n\n/**\n * @ngdoc directive\n * @name mdTabs\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * The `<md-tabs>` directive serves as the container for 1..n `<md-tab>` child directives to produces a Tabs components.\n * In turn, the nested `<md-tab>` directive is used to specify a tab label for the **header button** and a [optional] tab view\n * content that will be associated with each tab button.\n *\n * Below is the markup for its simplest usage:\n *\n *  <hljs lang=\"html\">\n *  <md-tabs>\n *    <md-tab label=\"Tab #1\"></md-tab>\n *    <md-tab label=\"Tab #2\"></md-tab>\n *    <md-tab label=\"Tab #3\"></md-tab>\n *  </md-tabs>\n *  </hljs>\n *\n * Tabs supports three (3) usage scenarios:\n *\n *  1. Tabs (buttons only)\n *  2. Tabs with internal view content\n *  3. Tabs with external view content\n *\n * **Tab-only** support is useful when tab buttons are used for custom navigation regardless of any other components, content, or views.\n * **Tabs with internal views** are the traditional usages where each tab has associated view content and the view switching is managed internally by the Tabs component.\n * **Tabs with external view content** is often useful when content associated with each tab is independently managed and data-binding notifications announce tab selection changes.\n *\n * > As a performance bonus, if the tab content is managed internally then the non-active (non-visible) tab contents are temporarily disconnected from the `$scope.$digest()` processes; which restricts and optimizes DOM updates to only the currently active tab.\n *\n * Additional features also include:\n *\n * *  Content can include any markup.\n * *  If a tab is disabled while active/selected, then the next tab will be auto-selected.\n * *  If the currently active tab is the last tab, then next() action will select the first tab.\n * *  Any markup (other than **`<md-tab>`** tags) will be transcluded into the tab header area BEFORE the tab buttons.\n *\n * ### Explanation of tab stretching\n *\n * Initially, tabs will have an inherent size.  This size will either be defined by how much space is needed to accommodate their text or set by the user through CSS.  Calculations will be based on this size.\n *\n * On mobile devices, tabs will be expanded to fill the available horizontal space.  When this happens, all tabs will become the same size.\n *\n * On desktops, by default, stretching will never occur.\n *\n * This default behavior can be overridden through the `md-stretch-tabs` attribute.  Here is a table showing when stretching will occur:\n *\n * `md-stretch-tabs` | mobile    | desktop\n * ------------------|-----------|--------\n * `auto`            | stretched | ---\n * `always`          | stretched | stretched\n * `never`           | ---       | ---\n *\n * @param {integer=} md-selected Index of the active/selected tab\n * @param {boolean=} md-no-ink If present, disables ink ripple effects.\n * @param {boolean=} md-no-bar If present, disables the selection ink bar.\n * @param {string=}  md-align-tabs Attribute to indicate position of tab buttons: `bottom` or `top`; default is `top`\n * @param {string=} md-stretch-tabs Attribute to indicate whether or not to stretch tabs: `auto`, `always`, or `never`; default is `auto`\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-tabs md-selected=\"selectedIndex\" >\n *   <img ng-src=\"img/angular.png\" class=\"centered\">\n *\n *   <md-tab\n *      ng-repeat=\"tab in tabs | orderBy:predicate:reversed\"\n *      md-on-select=\"onTabSelected(tab)\"\n *      md-on-deselect=\"announceDeselected(tab)\"\n *      disabled=\"tab.disabled\" >\n *\n *       <md-tab-label>\n *           {{tab.title}}\n *           <img src=\"img/removeTab.png\"\n *                ng-click=\"removeTab(tab)\"\n *                class=\"delete\" >\n *       </md-tab-label>\n *\n *       {{tab.content}}\n *\n *   </md-tab>\n *\n * </md-tabs>\n * </hljs>\n *\n */\nfunction TabsDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: '$mdTabs',\n    require: 'mdTabs',\n    transclude: true,\n    scope: {\n      selectedIndex: '=?mdSelected'\n    },\n    template:\n      '<section class=\"md-header\" ' +\n        'ng-class=\"{\\'md-paginating\\': pagination.active}\">' +\n\n        '<button class=\"md-paginator md-prev\" ' +\n          'ng-if=\"pagination.active && pagination.hasPrev\" ' +\n          'ng-click=\"pagination.clickPrevious()\" ' +\n          'aria-hidden=\"true\">' +\n          '<md-icon md-svg-icon=\"tabs-arrow\"></md-icon>' +\n        '</button>' +\n\n        // overflow: hidden container when paginating\n        '<div class=\"md-header-items-container\" md-tabs-pagination>' +\n          // flex container for <md-tab> elements\n          '<div class=\"md-header-items\">' +\n            '<md-tabs-ink-bar></md-tabs-ink-bar>' +\n          '</div>' +\n        '</div>' +\n\n        '<button class=\"md-paginator md-next\" ' +\n          'ng-if=\"pagination.active && pagination.hasNext\" ' +\n          'ng-click=\"pagination.clickNext()\" ' +\n          'aria-hidden=\"true\">' +\n          '<md-icon md-svg-icon=\"tabs-arrow\"></md-icon>' +\n        '</button>' +\n\n      '</section>' +\n      '<section class=\"md-tabs-content\"></section>',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl, transclude) {\n\n    scope.stretchTabs = attr.hasOwnProperty('mdStretchTabs') ? attr.mdStretchTabs || 'always' : 'auto';\n\n    $mdTheming(element);\n    configureAria();\n    watchSelected();\n\n    transclude(scope.$parent, function(clone) {\n      angular.element(element[0].querySelector('.md-header-items')).append(clone);\n    });\n\n    function configureAria() {\n      element.attr('role', 'tablist');\n    }\n\n    function watchSelected() {\n      scope.$watch('selectedIndex', function watchSelectedIndex(newIndex, oldIndex) {\n        if (oldIndex == newIndex) return;\n        var rightToLeft = oldIndex > newIndex;\n        tabsCtrl.deselect(tabsCtrl.itemAt(oldIndex), rightToLeft);\n\n        if (tabsCtrl.inRange(newIndex)) {\n          var newTab = tabsCtrl.itemAt(newIndex);\n          while (newTab && newTab.isDisabled()) {\n            newTab = newIndex > oldIndex \n                ? tabsCtrl.next(newTab)\n                : tabsCtrl.previous(newTab);\n          }\n          tabsCtrl.select(newTab, rightToLeft);\n        }\n      });\n    }\n  }\n}\nTabsDirective.$inject = [\"$mdTheming\"];\n})();\n\nangular.module(\"material.core\").constant(\"$MD_THEME_CSS\", \"md-autocomplete {  background: '{{background-50}}'; }  md-autocomplete button md-icon path {    fill: '{{background-600}}'; }  md-autocomplete button:after {    background: '{{background-600-0.3}}'; }  md-autocomplete ul {    background: '{{background-50}}'; }    md-autocomplete ul li {      border-top: 1px solid '{{background-400}}';      color: '{{background-900}}'; }      md-autocomplete ul li .highlight {        color: '{{background-600}}'; }      md-autocomplete ul li:hover, md-autocomplete ul li.selected {        background: '{{background-200}}'; }md-backdrop.md-opaque.md-THEME_NAME-theme {  background-color: '{{foreground-4-0.5}}'; }md-bottom-sheet.md-THEME_NAME-theme {  background-color: '{{background-50}}';  border-top-color: '{{background-300}}'; }  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {    color: '{{foreground-1}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    background-color: '{{background-50}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    color: '{{foreground-1}}'; }md-card.md-THEME_NAME-theme {  border-radius: 2px; }  md-card.md-THEME_NAME-theme .md-card-image {    border-radius: 2px 2px 0 0; }md-toolbar .md-button.md-THEME_NAME-theme.md-fab {  background-color: white; }.md-button.md-THEME_NAME-theme {  border-radius: 3px; }  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {    background-color: '{{background-500-0.2}}'; }  .md-button.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {      color: '{{primary-contrast}}';      background-color: '{{primary-color}}'; }      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {        background-color: '{{primary-600}}'; }  .md-button.md-THEME_NAME-theme.md-fab {    border-radius: 50%;    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {      background-color: '{{accent-A700}}'; }  .md-button.md-THEME_NAME-theme.md-raised {    color: '{{background-contrast}}';    background-color: '{{background-50}}'; }    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {      background-color: '{{background-200}}'; }  .md-button.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {      color: '{{warn-contrast}}';      background-color: '{{warn-color}}'; }      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {        background-color: '{{warn-700}}'; }  .md-button.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {      color: '{{accent-contrast}}';      background-color: '{{accent-color}}'; }      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {        background-color: '{{accent-700}}'; }  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {    color: '{{foreground-3}}';    background-color: transparent;    cursor: not-allowed; }md-checkbox.md-THEME_NAME-theme .md-ripple {  color: '{{accent-600}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon {  background-color: '{{accent-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {  color: '{{primary-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {  background-color: '{{primary-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {  color: '{{warn-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {  background-color: '{{warn-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme[disabled] .md-icon {  border-color: '{{foreground-3}}'; }md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {  background-color: '{{foreground-3}}'; }md-content.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-dialog.md-THEME_NAME-theme {  border-radius: 4px;  background-color: '{{background-hue-3}}'; }  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {    border-top-color: '{{foreground-4}}'; }md-divider.md-THEME_NAME-theme {  border-top-color: '{{foreground-4}}'; }md-icon.md-THEME_NAME-theme.md-primary {  color: '{{primary-color}}'; }md-icon.md-THEME_NAME-theme.md-accent {  color: '{{accent-color}}'; }md-icon.md-THEME_NAME-theme.md-warn {  color: '{{warn-color}}'; }md-icon.md-THEME_NAME-theme.md-danger {  color: '{{danger-color}}'; }md-input-container.md-THEME_NAME-theme .md-input {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}';  text-shadow: '{{foreground-shadow}}'; }  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {  color: '{{foreground-2}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {  border-color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {  color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {  border-color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {  border-bottom-color: transparent;  color: '{{foreground-3}}';  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);  background-image: -ms-linear-gradient(left, transparent 0%, '{{foreground-4}}' 100%); }md-progress-circular.md-THEME_NAME-theme {  background-color: transparent; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {    border-top-color: '{{primary-color}}';    border-bottom-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-top-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-right-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {    border-left-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {    border-top-color: '{{warn-color}}';    border-bottom-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-top-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-right-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {    border-left-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {    border-top-color: '{{accent-color}}';    border-bottom-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-top-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-right-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {    border-left-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme .md-container {  background-color: '{{primary-100}}'; }md-progress-linear.md-THEME_NAME-theme .md-bar {  background-color: '{{primary-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-container {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {  background-color: '{{warn-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-container {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {  background-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }md-radio-button.md-THEME_NAME-theme .md-off {  border-color: '{{foreground-2}}'; }md-radio-button.md-THEME_NAME-theme .md-on {  background-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-off {  border-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {  color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme .md-container .md-ripple {  color: '{{accent-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {  background-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {  border-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {  color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {  color: '{{primary-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {  background-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {  border-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {  color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {  color: '{{warn-600}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {  border-color: '{{foreground-3}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {  border-color: '{{foreground-3}}'; }md-radio-group.md-THEME_NAME-theme:focus:not(:empty) {  border-color: '{{foreground-1}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label {  border-bottom-color: '{{primary-color}}';  color: '{{ foreground-1 }}'; }  md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label.md-placeholder {    color: '{{ foreground-1 }}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-label {  border-bottom-color: '{{accent-color}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-label {  border-bottom-color: '{{warn-color}}'; }md-select.md-THEME_NAME-theme[disabled] .md-select-label {  color: '{{foreground-3}}'; }  md-select.md-THEME_NAME-theme[disabled] .md-select-label.md-placeholder {    color: '{{foreground-3}}'; }md-select.md-THEME_NAME-theme .md-select-label {  border-bottom-color: '{{foreground-4}}'; }  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {    color: '{{foreground-2}}'; }md-select-menu.md-THEME_NAME-theme md-optgroup {  color: '{{foreground-2}}'; }  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {    color: '{{foreground-1}}'; }md-select-menu.md-THEME_NAME-theme md-option[selected] {  background-color: '{{primary-50}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {    background-color: '{{primary-100}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {    background-color: '{{accent-50}}'; }    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {      background-color: '{{accent-100}}'; }md-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {  background: '{{background-200}}'; }md-sidenav.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track {  background-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme .md-track-ticks {  background-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-focus-thumb {  background-color: '{{foreground-2}}'; }md-slider.md-THEME_NAME-theme .md-focus-ring {  border-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-disabled-thumb {  border-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme.md-min .md-thumb:after {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track.md-track-fill {  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb:after {  border-color: '{{accent-color}}';  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-sign {  background-color: '{{accent-color}}'; }  md-slider.md-THEME_NAME-theme .md-sign:after {    border-top-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb-text {  color: '{{accent-contrast}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {  border-color: '{{warn-color}}';  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-sign {  background-color: '{{warn-color}}'; }  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {    border-top-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {  color: '{{warn-contrast}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {  border-color: '{{primary-color}}';  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-sign {  background-color: '{{primary-color}}'; }  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {    border-top-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {  color: '{{primary-contrast}}'; }md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {  border-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {  background-color: '{{foreground-3}}'; }.md-subheader.md-THEME_NAME-theme {  color: '{{ foreground-2-0.23 }}';  background-color: '{{background-hue-3}}'; }  .md-subheader.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme .md-thumb {  background-color: '{{background-50}}'; }md-switch.md-THEME_NAME-theme .md-bar {  background-color: '{{background-500}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-thumb {  background-color: '{{accent-color}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-bar {  background-color: '{{accent-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {  background-color: '{{primary-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {  background-color: '{{primary-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {  background-color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {  background-color: '{{warn-color-0.5}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-thumb {  background-color: '{{background-400}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-bar {  background-color: '{{foreground-4}}'; }md-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {  border-color: '{{foreground-1}}';  border-style: dotted; }md-tabs.md-THEME_NAME-theme .md-header {  background-color: transparent; }md-tabs.md-THEME_NAME-theme .md-paginator md-icon {  color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent .md-header {  background-color: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {  color: '{{accent-100}}'; }  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {    color: '{{accent-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary .md-header {  background-color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {    color: '{{primary-contrast}}';    background-color: '{{primary-contrast-0.1}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {    color: '{{primary-contrast}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-warn .md-header {  background-color: '{{warn-color}}'; }md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {  color: '{{warn-100}}'; }  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {    color: '{{warn-contrast}}'; }md-tabs.md-THEME_NAME-theme md-tabs-ink-bar {  color: '{{accent-color}}';  background: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme md-tab {  color: '{{foreground-2}}'; }  md-tabs.md-THEME_NAME-theme md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme md-tab:focus {    color: '{{foreground-1}}'; }  md-tabs.md-THEME_NAME-theme md-tab.active {    color: '{{primary-color}}'; }  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {    color: '{{accent-100}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  text-shadow: '{{foreground-shadow}}'; }  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme label {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {  border-color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused label {  color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {  border-color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {  color: '{{foreground-2}}'; }md-input-group.md-THEME_NAME-theme .md-input[disabled] {  border-bottom-color: '{{foreground-4}}';  color: '{{foreground-3}}'; }md-toast.md-THEME_NAME-theme {  background-color: '{{foreground-1}}';  color: '{{background-50}}'; }  md-toast.md-THEME_NAME-theme .md-button {    color: '{{background-50}}'; }    md-toast.md-THEME_NAME-theme .md-button.md-highlight {      color: '{{primary-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {        color: '{{accent-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {        color: '{{warn-A200}}'; }md-toolbar.md-THEME_NAME-theme {  background-color: '{{primary-color}}';  color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme .md-button {    color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-accent {    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-warn {    background-color: '{{warn-color}}';    color: '{{warn-contrast}}'; }md-tooltip.md-THEME_NAME-theme {  color: '{{background-A100}}'; }  md-tooltip.md-THEME_NAME-theme .md-background {    background-color: '{{foreground-2}}'; }\");"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/bower.json",
    "content": "{ \"name\": \"angular-material\", \"version\": \"0.8.1\", \"dependencies\": { \"angular\": \"1.3.x\", \"angular-animate\": \"1.3.x\", \"angular-aria\": \"1.3.x\" }, \"main\": [ \"angular-material.js\", \"angular-material.css\" ] }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/default-theme.css",
    "content": "md-autocomplete {\n  background: '{{background-50}}'; }\n  md-autocomplete button md-icon path {\n    fill: '{{background-600}}'; }\n  md-autocomplete button:after {\n    background: '{{background-600-0.3}}'; }\n  md-autocomplete ul {\n    background: '{{background-50}}'; }\n    md-autocomplete ul li {\n      border-top: 1px solid '{{background-400}}';\n      color: '{{background-900}}'; }\n      md-autocomplete ul li .highlight {\n        color: '{{background-600}}'; }\n      md-autocomplete ul li:hover, md-autocomplete ul li.selected {\n        background: '{{background-200}}'; }\n\nmd-backdrop.md-opaque.md-THEME_NAME-theme {\n  background-color: '{{foreground-4-0.5}}'; }\n\nmd-bottom-sheet.md-THEME_NAME-theme {\n  background-color: '{{background-50}}';\n  border-top-color: '{{background-300}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {\n    color: '{{foreground-1}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    background-color: '{{background-50}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    color: '{{foreground-1}}'; }\n\nmd-toolbar .md-button.md-THEME_NAME-theme.md-fab {\n  background-color: white; }\n\n.md-button.md-THEME_NAME-theme {\n  border-radius: 3px; }\n  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {\n    background-color: '{{background-500-0.2}}'; }\n  .md-button.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {\n      color: '{{primary-contrast}}';\n      background-color: '{{primary-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {\n        background-color: '{{primary-600}}'; }\n  .md-button.md-THEME_NAME-theme.md-fab {\n    border-radius: 50%;\n    background-color: '{{accent-color}}';\n    color: '{{accent-contrast}}'; }\n    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {\n      background-color: '{{accent-A700}}'; }\n  .md-button.md-THEME_NAME-theme.md-raised {\n    color: '{{background-contrast}}';\n    background-color: '{{background-50}}'; }\n    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {\n      background-color: '{{background-200}}'; }\n  .md-button.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {\n      color: '{{warn-contrast}}';\n      background-color: '{{warn-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {\n        background-color: '{{warn-700}}'; }\n  .md-button.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {\n      color: '{{accent-contrast}}';\n      background-color: '{{accent-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {\n        background-color: '{{accent-700}}'; }\n  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {\n    color: '{{foreground-3}}';\n    background-color: transparent;\n    cursor: not-allowed; }\n\nmd-card.md-THEME_NAME-theme {\n  border-radius: 2px; }\n  md-card.md-THEME_NAME-theme .md-card-image {\n    border-radius: 2px 2px 0 0; }\n\nmd-checkbox.md-THEME_NAME-theme .md-ripple {\n  color: '{{accent-600}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon {\n  background-color: '{{accent-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {\n  color: '{{primary-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {\n  background-color: '{{primary-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {\n  color: '{{warn-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {\n  background-color: '{{warn-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled] .md-icon {\n  border-color: '{{foreground-3}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {\n  background-color: '{{foreground-3}}'; }\n\nmd-content.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n\nmd-dialog.md-THEME_NAME-theme {\n  border-radius: 4px;\n  background-color: '{{background-hue-3}}'; }\n  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {\n    border-top-color: '{{foreground-4}}'; }\n\nmd-divider.md-THEME_NAME-theme {\n  border-top-color: '{{foreground-4}}'; }\n\nmd-icon.md-THEME_NAME-theme.md-primary {\n  color: '{{primary-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-accent {\n  color: '{{accent-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-warn {\n  color: '{{warn-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-danger {\n  color: '{{danger-color}}'; }\n\nmd-input-container.md-THEME_NAME-theme .md-input {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}';\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {\n  color: '{{foreground-2}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {\n  border-color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {\n  border-color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {\n  border-bottom-color: transparent;\n  color: '{{foreground-3}}';\n  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);\n  background-image: -ms-linear-gradient(left, transparent 0%, '{{foreground-4}}' 100%); }\n\nmd-progress-circular.md-THEME_NAME-theme {\n  background-color: transparent; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {\n    border-top-color: '{{primary-color}}';\n    border-bottom-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-top-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-right-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {\n    border-left-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {\n    border-top-color: '{{warn-color}}';\n    border-bottom-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-top-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-right-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {\n    border-left-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {\n    border-top-color: '{{accent-color}}';\n    border-bottom-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-top-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-right-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {\n    border-left-color: '{{accent-color}}'; }\n\nmd-progress-linear.md-THEME_NAME-theme .md-container {\n  background-color: '{{primary-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme .md-bar {\n  background-color: '{{primary-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-container {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {\n  background-color: '{{warn-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-container {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {\n  background-color: '{{accent-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {\n  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {\n  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }\n\nmd-radio-button.md-THEME_NAME-theme .md-off {\n  border-color: '{{foreground-2}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-on {\n  background-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-off {\n  border-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {\n  color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-container .md-ripple {\n  color: '{{accent-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {\n  background-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {\n  border-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {\n  color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {\n  color: '{{primary-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {\n  background-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {\n  border-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {\n  color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {\n  color: '{{warn-600}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {\n  border-color: '{{foreground-3}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {\n  border-color: '{{foreground-3}}'; }\n\nmd-radio-group.md-THEME_NAME-theme:focus:not(:empty) {\n  border-color: '{{foreground-1}}'; }\n\nmd-select.md-THEME_NAME-theme:focus .md-select-label {\n  border-bottom-color: '{{primary-color}}';\n  color: '{{ foreground-1 }}'; }\n  md-select.md-THEME_NAME-theme:focus .md-select-label.md-placeholder {\n    color: '{{ foreground-1 }}'; }\nmd-select.md-THEME_NAME-theme:focus.md-accent .md-select-label {\n  border-bottom-color: '{{accent-color}}'; }\nmd-select.md-THEME_NAME-theme:focus.md-warn .md-select-label {\n  border-bottom-color: '{{warn-color}}'; }\nmd-select.md-THEME_NAME-theme .md-select-label {\n  border-bottom-color: '{{foreground-4}}'; }\n  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {\n    color: '{{foreground-3}}'; }\n\nmd-select-menu.md-THEME_NAME-theme md-optgroup {\n  color: '{{foreground-2}}'; }\n  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {\n    color: '{{foreground-1}}'; }\nmd-select-menu.md-THEME_NAME-theme md-option[selected] {\n  background-color: '{{primary-50}}'; }\n  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {\n    background-color: '{{primary-100}}'; }\n  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {\n    background-color: '{{accent-50}}'; }\n    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {\n      background-color: '{{accent-100}}'; }\nmd-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {\n  background: '{{background-200}}'; }\n\nmd-sidenav.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n\nmd-slider.md-THEME_NAME-theme .md-track {\n  background-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track-ticks {\n  background-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-thumb {\n  background-color: '{{foreground-2}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-ring {\n  border-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-disabled-thumb {\n  border-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme.md-min .md-thumb:after {\n  background-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track.md-track-fill {\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb:after {\n  border-color: '{{accent-color}}';\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-sign {\n  background-color: '{{accent-color}}'; }\n  md-slider.md-THEME_NAME-theme .md-sign:after {\n    border-top-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb-text {\n  color: '{{accent-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {\n  border-color: '{{warn-color}}';\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-sign {\n  background-color: '{{warn-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {\n    border-top-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {\n  color: '{{warn-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {\n  border-color: '{{primary-color}}';\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-sign {\n  background-color: '{{primary-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {\n    border-top-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {\n  color: '{{primary-contrast}}'; }\nmd-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {\n  border-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {\n  background-color: '{{foreground-3}}'; }\n\n.md-subheader.md-THEME_NAME-theme {\n  color: '{{ foreground-2-0.23 }}';\n  background-color: '{{background-hue-3}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n\nmd-switch.md-THEME_NAME-theme .md-thumb {\n  background-color: '{{background-50}}'; }\nmd-switch.md-THEME_NAME-theme .md-bar {\n  background-color: '{{background-500}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-thumb {\n  background-color: '{{accent-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-bar {\n  background-color: '{{accent-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {\n  background-color: '{{primary-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {\n  background-color: '{{primary-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {\n  background-color: '{{warn-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {\n  background-color: '{{warn-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-thumb {\n  background-color: '{{background-400}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-bar {\n  background-color: '{{foreground-4}}'; }\nmd-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {\n  border-color: '{{foreground-1}}';\n  border-style: dotted; }\n\nmd-tabs.md-THEME_NAME-theme .md-header {\n  background-color: transparent; }\nmd-tabs.md-THEME_NAME-theme .md-paginator md-icon {\n  color: '{{primary-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent .md-header {\n  background-color: '{{accent-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {\n  color: '{{accent-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {\n    color: '{{accent-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary .md-header {\n  background-color: '{{primary-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {\n  color: '{{primary-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {\n    color: '{{primary-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary md-tab {\n  color: '{{primary-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {\n    color: '{{foreground-3}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {\n    color: '{{primary-contrast}}';\n    background-color: '{{primary-contrast-0.1}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {\n    color: '{{primary-contrast}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {\n    color: '{{primary-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn .md-header {\n  background-color: '{{warn-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {\n  color: '{{warn-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {\n    color: '{{warn-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme md-tabs-ink-bar {\n  color: '{{accent-color}}';\n  background: '{{accent-color}}'; }\nmd-tabs.md-THEME_NAME-theme md-tab {\n  color: '{{foreground-2}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab[disabled] {\n    color: '{{foreground-3}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab:focus {\n    color: '{{foreground-1}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab.active {\n    color: '{{primary-color}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {\n    color: '{{accent-100}}'; }\n\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme label {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {\n  border-color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {\n  border-color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {\n  color: '{{foreground-2}}'; }\nmd-input-group.md-THEME_NAME-theme .md-input[disabled] {\n  border-bottom-color: '{{foreground-4}}';\n  color: '{{foreground-3}}'; }\n\nmd-toast.md-THEME_NAME-theme {\n  background-color: '{{foreground-1}}';\n  color: '{{background-50}}'; }\n  md-toast.md-THEME_NAME-theme .md-button {\n    color: '{{background-50}}'; }\n    md-toast.md-THEME_NAME-theme .md-button.md-highlight {\n      color: '{{primary-A200}}'; }\n      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {\n        color: '{{accent-A200}}'; }\n      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {\n        color: '{{warn-A200}}'; }\n\nmd-toolbar.md-THEME_NAME-theme {\n  background-color: '{{primary-color}}';\n  color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme .md-button {\n    color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-accent {\n    background-color: '{{accent-color}}';\n    color: '{{accent-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-warn {\n    background-color: '{{warn-color}}';\n    color: '{{warn-contrast}}'; }\n\nmd-tooltip.md-THEME_NAME-theme {\n  color: '{{background-A100}}'; }\n  md-tooltip.md-THEME_NAME-theme .md-background {\n    background-color: '{{foreground-2}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/demos/gridList/demoBasicUsage/style.scss",
    "content": "md-icon {\n    width:50%;height:50%\n}\n\nmd-icon svg {\n  -webkit-border-radius: 50%;\n    -moz-border-radius: 50%;\n    border-radius: 50%;\n}\n\n.s64 {\n  font-size:64px;\n}\n\n.s32 {\n  \n  font-size:48px;\n\n}\n\nmd-icon.fa {\n  display:block;\n  padding-left:0px;\n}\n\nmd-icon.s32 span {\n  padding-left:8px;\n}\n\nmd-grid-list {\n  margin: 8px; }\n.gray {\n  background: #f5f5f5; }\n.green {\n  background: #b9f6ca; }\n.yellow {\n  background: #ffff8d; }\n.blue {\n  background: #84ffff; }\n.darkBlue {\n  background: #80d8ff; }\n.deepBlue {\n  background: #448aff; }\n.purple {\n  background: #b388ff; }\n.lightPurple {\n  background: #8c9eff; }\n.red {\n  background: #ff8a80; }\n.pink {\n  background: #ff80ab; }\n\nmd-grid-tile {\n  -webkit-transition: all 500ms ease-out 100ms;\n    -moz-transition: all 500ms ease-out 100ms;\n    -o-transition: all 500ms ease-out 100ms;\n    transition: all 500ms ease-out 100ms;\n}\n\nmd-grid-tile md-grid-tile-footer {\n  background:  rgba(0,0,0,.68);\n  height: 36px;\n  \n}\n\nmd-grid-tile-footer figcaption  {\n  width:100%;\n}\n\nmd-grid-tile-footer figcaption h3 {\n  margin:0px;\n  font-weight:700;\n  width:100%;\n  text-align:center;\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/demos/gridList/demoDynamicTiles/style.scss",
    "content": "md-icon {\n    width:50%;height:50%\n}\n\nmd-icon svg {\n  -webkit-border-radius: 50%;\n    -moz-border-radius: 50%;\n    border-radius: 50%;\n}\n\n.s64 {\n  font-size:64px;\n}\n\n.s32 {\n  \n  font-size:48px;\n\n}\n\nmd-icon.fa {\n  display:block;\n  padding-left:0px;\n}\n\nmd-icon.s32 span {\n  padding-left:8px;\n}\n\nmd-grid-list {\n  margin: 8px; }\n.gray {\n  background: #f5f5f5; }\n.green {\n  background: #b9f6ca; }\n.yellow {\n  background: #ffff8d; }\n.blue {\n  background: #84ffff; }\n.darkBlue {\n  background: #80d8ff; }\n.deepBlue {\n  background: #448aff; }\n.purple {\n  background: #b388ff; }\n.lightPurple {\n  background: #8c9eff; }\n.red {\n  background: #ff8a80; }\n.pink {\n  background: #ff80ab; }\n\n\nmd-grid-tile {\n  transition: all 300ms ease-out 50ms;\n}\n\n\nmd-grid-tile md-icon {\n  padding-bottom: 32px;\n}\n\nmd-grid-tile md-grid-tile-footer {\n  background:  rgba(0,0,0,.68);\n  height: 36px;\n  \n}\n\nmd-grid-tile-footer figcaption  {\n  width:100%;\n}\n\nmd-grid-tile-footer figcaption h3 {\n  margin:0px;\n  font-weight:700;\n  width:100%;\n  text-align:center;\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/demos/gridList/demoResponsiveUsage/style.scss",
    "content": ""
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/autocomplete/autocomplete-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-autocomplete {\n  background: '{{background-50}}'; }\n  md-autocomplete button md-icon path {\n    fill: '{{background-600}}'; }\n  md-autocomplete button:after {\n    background: '{{background-600-0.3}}'; }\n  md-autocomplete ul {\n    background: '{{background-50}}'; }\n    md-autocomplete ul li {\n      border-top: 1px solid '{{background-400}}';\n      color: '{{background-900}}'; }\n      md-autocomplete ul li .highlight {\n        color: '{{background-600}}'; }\n      md-autocomplete ul li:hover, md-autocomplete ul li.selected {\n        background: '{{background-200}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/autocomplete/autocomplete.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n@-webkit-keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@-webkit-keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\n@keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\nmd-content {\n  overflow: visible; }\n\nmd-autocomplete {\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n  border-radius: 2px;\n  display: block;\n  height: 40px;\n  position: relative;\n  overflow: visible; }\n  md-autocomplete md-autocomplete-wrap {\n    display: block;\n    position: relative;\n    overflow: visible;\n    height: 40px; }\n    md-autocomplete md-autocomplete-wrap md-progress-linear {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      width: 100%;\n      height: 3px;\n      transition: none; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear .md-container {\n        transition: none;\n        top: auto;\n        height: 3px; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter.ng-enter-active {\n          opacity: 1; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave.ng-leave-active {\n          opacity: 0; }\n  md-autocomplete input {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    box-sizing: border-box;\n    border: none;\n    box-shadow: none;\n    padding: 0 15px;\n    font-size: 14px;\n    line-height: 40px;\n    height: 40px;\n    outline: none;\n    z-index: 2;\n    background: transparent; }\n    md-autocomplete input::-ms-clear {\n      display: none; }\n  md-autocomplete button {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    line-height: 20px;\n    z-index: 2;\n    text-align: center;\n    width: 20px;\n    height: 20px;\n    cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    padding: 0;\n    font-size: 12px;\n    background: transparent; }\n    md-autocomplete button:after {\n      content: '';\n      position: absolute;\n      top: -6px;\n      right: -6px;\n      bottom: -6px;\n      left: -6px;\n      border-radius: 50%;\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      opacity: 0;\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      z-index: -1; }\n    md-autocomplete button:focus:after {\n      -webkit-transform: scale(1);\n              transform: scale(1);\n      opacity: 1; }\n    md-autocomplete button md-icon {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      -webkit-transform: translate3d(-50%, -50%, 0) scale(0.9);\n              transform: translate3d(-50%, -50%, 0) scale(0.9); }\n      md-autocomplete button md-icon path {\n        stroke-width: 0; }\n    md-autocomplete button.ng-enter {\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-enter.ng-enter-active {\n        -webkit-transform: scale(1);\n                transform: scale(1); }\n    md-autocomplete button.ng-leave {\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-leave.ng-leave-active {\n        -webkit-transform: scale(0);\n                transform: scale(0); }\n  md-autocomplete ul {\n    position: absolute;\n    top: 100%;\n    left: 0;\n    right: 0;\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n    margin: 0;\n    list-style: none;\n    padding: 0;\n    overflow: auto;\n    max-height: 225.5px;\n    z-index: 49; }\n    md-autocomplete ul li {\n      border-top: 1px solid #ddd;\n      padding: 0 15px;\n      line-height: 40px;\n      font-size: 14px;\n      overflow: hidden;\n      height: 40px;\n      transition: background 0.15s linear;\n      cursor: pointer;\n      margin: 0; }\n      md-autocomplete ul li.ng-enter, md-autocomplete ul li.ng-hide-remove {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-in 0.2s;\n                animation: md-autocomplete-list-in 0.2s; }\n      md-autocomplete ul li.ng-leave, md-autocomplete ul li.ng-hide-add {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-out 0.2s;\n                animation: md-autocomplete-list-out 0.2s; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/autocomplete/autocomplete.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.autocomplete');\ngoog.require('ng.material.components.icon');\ngoog.require('ng.material.core');\n(function () {\n  'use strict';\n  /**\n   * @ngdoc module\n   * @name material.components.autocomplete\n   */\n  /*\n   * @see js folder for autocomplete implementation\n   */\n  angular.module('material.components.autocomplete', [\n    'material.core',\n    'material.components.icon'\n  ]);\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdAutocompleteCtrl', MdAutocompleteCtrl);\n\n  function MdAutocompleteCtrl ($scope, $element, $timeout, $q, $mdUtil, $mdConstant) {\n\n    //-- private variables\n    var self = this,\n        itemParts = $scope.itemsExpr.split(/ in /i),\n        itemExpr = itemParts[1],\n        elements = {\n          main:  $element[0],\n          ul:    $element[0].getElementsByTagName('ul')[0],\n          input: $element[0].getElementsByTagName('input')[0]\n        },\n        promise = null,\n        cache = {};\n\n    //-- public variables\n    self.scope = $scope;\n    self.parent = $scope.$parent;\n    self.itemName = itemParts[0];\n    self.matches = [];\n    self.loading = false;\n    self.hidden = true;\n    self.index = 0;\n    self.keydown = keydown;\n    self.blur = blur;\n    self.clear = clearValue;\n    self.select = select;\n    self.getCurrentDisplayValue = getCurrentDisplayValue;\n    self.fetch = $mdUtil.debounce(fetchResults);\n\n    return init();\n\n    //-- start method definitions\n    function init () {\n      configureWatchers();\n      configureAria();\n    }\n\n    function configureAria () {\n      var ul = angular.element(elements.ul),\n          input = angular.element(elements.input),\n          id = ul.attr('id') || 'ul_' + $mdUtil.nextUid();\n      ul.attr('id', id);\n      input.attr('aria-owns', id);\n    }\n\n    function getItemScope (item) {\n      if (!item) return;\n      var locals = {};\n      if (self.itemName) locals[self.itemName] = $scope.selectedItem;\n      return locals;\n    }\n\n    function configureWatchers () {\n      $scope.$watch('searchText', function (searchText) {\n        self.index = -1;\n        if (!searchText || searchText.length < Math.max(parseInt($scope.minLength, 10), 1)) {\n          self.loading = false;\n          self.matches = [];\n          self.hidden = shouldHide();\n          return;\n        }\n        var term = searchText.toLowerCase();\n        if (promise && promise.cancel) {\n          promise.cancel();\n          promise = null;\n        }\n        if (!$scope.noCache && cache[term]) {\n          self.matches = cache[term];\n        } else {\n          self.fetch(searchText);\n        }\n        self.hidden = shouldHide();\n        if ($scope.textChange) $scope.textChange(getItemScope($scope.selectedItem));\n      });\n      $scope.$watch('selectedItem', function (selectedItem) {\n        if ($scope.itemChange) $scope.itemChange(getItemScope(selectedItem));\n      });\n    }\n\n    function fetchResults (searchText) {\n      var items = $scope.$parent.$eval(itemExpr),\n          term = searchText.toLowerCase();\n      if (angular.isArray(items)) {\n        handleResults(items);\n      } else {\n        self.loading = true;\n        promise = $q.when(items).then(handleResults);\n      }\n      function handleResults (matches) {\n        cache[term] = matches;\n        if (searchText !== $scope.searchText) return; //-- just cache the results if old request\n        promise = null;\n        self.loading = false;\n        self.matches = matches;\n        self.hidden = shouldHide();\n      }\n    }\n\n    function blur () {\n      self.hidden = true;\n    }\n\n    function keydown (event) {\n      switch (event.keyCode) {\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.min(self.index + 1, self.matches.length - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.UP_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.max(0, self.index - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.ENTER:\n            if (self.loading || self.index < 0) return;\n            event.preventDefault();\n            select(self.index);\n            break;\n        case $mdConstant.KEY_CODE.ESCAPE:\n            self.matches = [];\n            self.hidden = true;\n            self.index = -1;\n            break;\n        case $mdConstant.KEY_CODE.TAB:\n            break;\n        default:\n      }\n    }\n\n    function clearValue () {\n      $scope.searchText = '';\n      select(-1);\n      elements.input.focus();\n    }\n\n    function shouldHide () {\n      return self.matches.length === 1 && $scope.searchText === getDisplayValue(self.matches[0]);\n    }\n\n    function getCurrentDisplayValue () {\n      return getDisplayValue(self.matches[self.index]);\n    }\n\n    function getDisplayValue (item) {\n      return (item && $scope.itemText) ? $scope.itemText(getItemScope(item)) : item;\n    }\n\n    function select (index) {\n      $scope.selectedItem = self.matches[index];\n      $scope.searchText = getDisplayValue($scope.selectedItem) || $scope.searchText;\n      self.hidden = true;\n      self.index = -1;\n      self.matches = [];\n    }\n\n    function updateScroll () {\n      var top = 41 * self.index,\n          bot = top + 41,\n          hgt = 41 * 5.5;\n      if (top < elements.ul.scrollTop) {\n        elements.ul.scrollTop = top;\n      } else if (bot > elements.ul.scrollTop + hgt) {\n        elements.ul.scrollTop = bot - hgt;\n      }\n    }\n\n  }\n  MdAutocompleteCtrl.$inject = [\"$scope\", \"$element\", \"$timeout\", \"$q\", \"$mdUtil\", \"$mdConstant\"];\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocomplete', MdAutocomplete);\n\n  /**\n   * @ngdoc directive\n   * @name mdAutocomplete\n   * @module material.components.autocomplete\n   *\n   * @description\n   * `<md-autocomplete>` is a special input component with a drop-down of all possible matches to a custom query.\n   * This component allows you to provide real-time suggestions as the user types in the input area.\n   *\n   * @param {string=} md-search-text A model to bind the search query text to\n   * @param {object=} md-selected-item A model to bind the selected item to\n   * @param {expression} md-items An expression in the format of `item in items` to iterate over matches for your search.\n   * @param {string=} md-item-text An expression that will convert your object to a single string.\n   * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n   * @param {boolean=} md-no-cache Disables the internal caching that happens in autocomplete\n   * @param {expression} md-selected-item-change An expression to be run each time a new item is selected\n   * @param {expression} md-search-text-change An expression to be run each time the search text updates\n   * @param {boolean=} ng-disabled Determines whether or not to disable the input field\n   * @param {number=} md-min-length Specifies the minimum length of text before autocomplete will make suggestions\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <md-autocomplete\n   *       md-selected-item=\"selectedItem\"\n   *       md-search-text=\"searchText\"\n   *       md-items=\"item in getMatches(searchText)\"\n   *       md-item-text=\"item.display\">\n   *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n   *   </md-autocomplete>\n   * </hljs>\n   */\n\n  function MdAutocomplete () {\n    return {\n      template:     '\\\n        <md-autocomplete-wrap role=\"listbox\">\\\n          <input type=\"text\"\\\n              ng-disabled=\"isDisabled\"\\\n              ng-model=\"searchText\"\\\n              ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"\\\n              ng-blur=\"$mdAutocompleteCtrl.blur()\"\\\n              placeholder=\"{{placeholder}}\"\\\n              aria-label=\"{{placeholder}}\"\\\n              aria-autocomplete=\"list\"\\\n              aria-haspopup=\"true\"\\\n              aria-activedescendant=\"\"\\\n              aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>\\\n          <button\\\n              type=\"button\"\\\n              ng-if=\"searchText\"\\\n              ng-click=\"$mdAutocompleteCtrl.clear()\">\\\n              <md-icon md-svg-icon=\"cancel\"></md-icon>\\\n              <span class=\"visually-hidden\">Clear</span>\\\n              </button>\\\n          <md-progress-linear ng-if=\"$mdAutocompleteCtrl.loading\" md-mode=\"indeterminate\"></md-progress-linear>\\\n        </md-autocomplete-wrap>\\\n        <ul role=\"presentation\">\\\n          <li ng-repeat=\"(index, item) in $mdAutocompleteCtrl.matches\"\\\n              ng-class=\"{ selected: index === $mdAutocompleteCtrl.index }\"\\\n              ng-show=\"searchText && !$mdAutocompleteCtrl.hidden\"\\\n              ng-click=\"$mdAutocompleteCtrl.select(index)\"\\\n              ng-transclude\\\n              md-autocomplete-list-item=\"$mdAutocompleteCtrl.itemName\">\\\n          </li>\\\n        </ul>\\\n        <aria-status\\\n            class=\"visually-hidden\"\\\n            role=\"status\"\\\n            aria-live=\"assertive\">\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length === 1\">There is 1 match available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length > 1\">There are {{$mdAutocompleteCtrl.matches.length}} matches available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index >= 0\">{{ $mdAutocompleteCtrl.getCurrentDisplayValue() }}</p>\\\n        </aria-status>',\n      transclude:   true,\n      controller:   'MdAutocompleteCtrl',\n      controllerAs: '$mdAutocompleteCtrl',\n      scope:        {\n        searchText:   '=mdSearchText',\n        selectedItem: '=mdSelectedItem',\n        itemsExpr:    '@mdItems',\n        itemText:     '&mdItemText',\n        placeholder:  '@placeholder',\n        noCache:      '=mdNoCache',\n        itemChange:   '&mdSelectedItemChange',\n        textChange:   '&mdSearchTextChange',\n        isDisabled:   '=ngDisabled',\n        minLength:    '=mdMinLength'\n      }\n    };\n  }\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdHighlightCtrl', MdHighlightCtrl);\n\n  function MdHighlightCtrl ($scope, $element, $interpolate) {\n    var term = $element.attr('md-highlight-text'),\n        text = $interpolate($element.text())($scope);\n    $scope.$watch(term, function (term) {\n      var regex = new RegExp('^' + sanitize(term), 'i'),\n          html = text.replace(regex, '<span class=\"highlight\">$&</span>');\n      $element.html(html);\n    });\n\n    function sanitize (term) {\n      if (!term) return term;\n      return term.replace(/[\\*\\[\\]\\(\\)\\{\\}\\\\\\^\\$]/g, '\\\\$&');\n    }\n  }\n  MdHighlightCtrl.$inject = [\"$scope\", \"$element\", \"$interpolate\"];\n\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdHighlightText', MdHighlight);\n\n  /**\n   * @ngdoc directive\n   * @name mdHighlightText\n   * @module material.components.autocomplete\n   *\n   * @description\n   * The `md-highlight-text` directive allows you to specify text that should be highlighted within\n   * an element.  Highlighted text will be wrapped in `<span class=\"highlight\"></span>` which can\n   * be styled through CSS.  Please note that child elements may not be used with this directive.\n   *\n   * @param {string=} md-highlight-text A model to be searched for\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   * <input placeholder=\"Enter a search term...\" ng-model=\"searchTerm\" type=\"text\" />\n   * <ul>\n   *   <li ng-repeat=\"result in results\" md-highlight-text=\"searchTerm\">\n   *     {{result.text}}\n   *   </li>\n   * </ul>\n   * </hljs>\n   */\n\n  function MdHighlight () {\n    return {\n      terminal: true,\n      scope: false,\n      controller: 'MdHighlightCtrl'\n    };\n  }\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocompleteListItem', MdAutocompleteListItem);\n\n  function MdAutocompleteListItem ($compile, $mdUtil) {\n    return {\n      require: '^?mdAutocomplete',\n      terminal: true,\n      link: link,\n      scope: false\n    };\n    function link (scope, element, attr, ctrl) {\n      var newScope = ctrl.parent.$new(false, ctrl.parent),\n          itemName = ctrl.scope.$eval(attr.mdAutocompleteListItem);\n      newScope[itemName] = scope.item;\n      $compile(element.contents())(newScope);\n      element.attr({ 'role': 'option', 'id': 'item_' + $mdUtil.nextUid() });\n    }\n  }\n  MdAutocompleteListItem.$inject = [\"$compile\", \"$mdUtil\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/backdrop/backdrop-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-backdrop.md-opaque.md-THEME_NAME-theme {\n  background-color: '{{foreground-4-0.5}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/backdrop/backdrop.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-backdrop {\n  z-index: 50;\n  background-color: rgba(0, 0, 0, 0);\n  position: fixed;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0; }\n  md-backdrop.md-select-backdrop {\n    z-index: 81; }\n  md-backdrop.md-dialog-backdrop {\n    z-index: 79; }\n  md-backdrop.md-bottom-sheet-backdrop {\n    z-index: 69; }\n  md-backdrop.md-sidenav-backdrop {\n    z-index: 59; }\n  md-backdrop.ng-enter {\n    -webkit-animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both;\n            animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both; }\n  md-backdrop.ng-leave {\n    -webkit-animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both;\n            animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both; }\n\n@-webkit-keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@-webkit-keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n\n@keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/backdrop/backdrop.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.backdrop');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.backdrop\n * @description Backdrop\n */\n\n/**\n * @ngdoc directive\n * @name mdBackdrop\n * @module material.components.backdrop\n *\n * @restrict E\n *\n * @description\n * `<md-backdrop>` is a backdrop element used by other coponents, such as dialog and bottom sheet.\n * Apply class `opaque` to make the backdrop use the theme backdrop color.\n *\n */\n\nangular.module('material.components.backdrop', [\n  'material.core'\n])\n  .directive('mdBackdrop', BackdropDirective);\n\nfunction BackdropDirective($mdTheming) {\n  return $mdTheming;\n}\nBackdropDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-bottom-sheet.md-THEME_NAME-theme {\n  background-color: '{{background-50}}';\n  border-top-color: '{{background-300}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {\n    color: '{{foreground-1}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    background-color: '{{background-50}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    color: '{{foreground-1}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-bottom-sheet {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 8px 16px 88px 16px;\n  z-index: 70;\n  border-top: 1px solid;\n  -webkit-transform: translate3d(0, 80px, 0);\n          transform: translate3d(0, 80px, 0);\n  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  transition-property: -webkit-transform;\n  transition-property: transform; }\n  md-bottom-sheet.md-has-header {\n    padding-top: 0; }\n  md-bottom-sheet.ng-enter {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n  md-bottom-sheet.ng-enter-active {\n    opacity: 1;\n    display: block;\n    -webkit-transform: translate3d(0, 80px, 0) !important;\n            transform: translate3d(0, 80px, 0) !important; }\n  md-bottom-sheet.ng-leave-active {\n    -webkit-transform: translate3d(0, 100%, 0) !important;\n            transform: translate3d(0, 100%, 0) !important;\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-bottom-sheet .md-subheader {\n    background-color: transparent;\n    font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif;\n    line-height: 56px;\n    padding: 0;\n    white-space: nowrap; }\n  md-bottom-sheet md-inline-icon {\n    display: inline-block;\n    height: 24px;\n    width: 24px;\n    fill: #444; }\n  md-bottom-sheet md-item {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    outline: none; }\n    md-bottom-sheet md-item:hover {\n      cursor: pointer; }\n  md-bottom-sheet.md-list md-item {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    height: 48px; }\n    md-bottom-sheet.md-list md-item div.md-icon-container {\n      display: inline-block;\n      height: 24px;\n      margin-right: 32px; }\n  md-bottom-sheet.md-grid {\n    padding-left: 24px;\n    padding-right: 24px;\n    padding-top: 0; }\n    md-bottom-sheet.md-grid md-list {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-flex-direction: row;\n          -ms-flex-direction: row;\n              flex-direction: row;\n      -webkit-flex-wrap: wrap;\n          -ms-flex-wrap: wrap;\n              flex-wrap: wrap;\n      transition: all 0.5s;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center; }\n    md-bottom-sheet.md-grid md-item {\n      -webkit-flex-direction: column;\n          -ms-flex-direction: column;\n              flex-direction: column;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      transition: all 0.5s;\n      height: 96px;\n      margin-top: 8px;\n      margin-bottom: 8px;\n      /* Mixin for how many grid items to show per row */ }\n      @media screen and (max-width: 600px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 33.33333%;\n              -ms-flex: 1 1 33.33333%;\n                  flex: 1 1 33.33333%;\n          max-width: 33.33333%; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n+1) {\n            -webkit-align-items: flex-start;\n                -ms-flex-align: start;\n                    align-items: flex-start; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n) {\n            -webkit-align-items: flex-end;\n                -ms-flex-align: end;\n                    align-items: flex-end; } }\n      @media screen and (min-width: 600px) and (max-width: 960px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 25%;\n              -ms-flex: 1 1 25%;\n                  flex: 1 1 25%;\n          max-width: 25%; } }\n      @media screen and (min-width: 960px) and (max-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 16.66667%;\n              -ms-flex: 1 1 16.66667%;\n                  flex: 1 1 16.66667%;\n          max-width: 16.66667%; } }\n      @media screen and (min-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-flex: 1 1 14.28571%;\n              -ms-flex: 1 1 14.28571%;\n                  flex: 1 1 14.28571%;\n          max-width: 14.28571%; } }\n      md-bottom-sheet.md-grid md-item .md-item-content {\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 48px;\n        padding-bottom: 16px; }\n      md-bottom-sheet.md-grid md-item .md-grid-item-content {\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 80px; }\n      md-bottom-sheet.md-grid md-item .md-icon-container {\n        display: inline-block;\n        box-sizing: border-box;\n        height: 48px;\n        width: 48px;\n        margin: 0 0; }\n      md-bottom-sheet.md-grid md-item p.md-grid-text {\n        font-weight: 300;\n        line-height: 16px;\n        font-size: 13px;\n        margin: 0;\n        white-space: nowrap;\n        width: 64px;\n        text-align: center;\n        padding-top: 8px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/bottomSheet/bottomSheet.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.bottomSheet');\ngoog.require('ng.material.components.backdrop');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.bottomSheet\n * @description\n * BottomSheet\n */\nangular.module('material.components.bottomSheet', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdBottomSheet', MdBottomSheetDirective)\n  .provider('$mdBottomSheet', MdBottomSheetProvider);\n\nfunction MdBottomSheetDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdBottomSheet\n * @module material.components.bottomSheet\n *\n * @description\n * `$mdBottomSheet` opens a bottom sheet over the app and provides a simple promise API.\n *\n * ## Restrictions\n *\n * - The bottom sheet's template must have an outer `<md-bottom-sheet>` element.\n * - Add the `md-grid` class to the bottom sheet for a grid layout.\n * - Add the `md-list` class to the bottom sheet for a list layout.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openBottomSheet()\">\n *     Open a Bottom Sheet!\n *   </md-button>\n * </div>\n * </hljs>\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdBottomSheet) {\n *   $scope.openBottomSheet = function() {\n *     $mdBottomSheet.show({\n *       template: '<md-bottom-sheet>Hello!</md-bottom-sheet>'\n *     });\n *   };\n * });\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdBottomSheet#show\n *\n * @description\n * Show a bottom sheet with the specified options.\n *\n * @param {object} options An options object, with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *   be used as the content of the bottom sheet. Restrictions: the template must\n *   have an outer `md-bottom-sheet` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *   template string.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n *     This scope will be destroyed when the bottom sheet is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `controller` - `{string=}`: The controller to associate with this bottom sheet.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *   be used as names of values to inject into the controller. For example,\n *   `locals: {three: 3}` would inject `three` into the controller with the value\n *   of 3.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *   the location of the click will be used as the starting point for the opening animation\n *   of the the dialog.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *   and the bottom sheet will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the bottom sheet to. Defaults to appending\n *     to the root element of the application.\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the bottom sheet is open.\n *     Default true.\n *\n * @returns {promise} A promise that can be resolved with `$mdBottomSheet.hide()` or\n * rejected with `$mdBottomSheet.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#hide\n *\n * @description\n * Hide the existing bottom sheet and resolve the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#cancel\n *\n * @description\n * Hide the existing bottom sheet and reject the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n */\n\nfunction MdBottomSheetProvider($$interimElementProvider) {\n  // how fast we need to flick down to close the sheet, pixels/ms\n  var CLOSING_VELOCITY = 0.5;\n  var PADDING = 80; // same as css\n\n  bottomSheetDefaults.$inject = [\"$animate\", \"$mdConstant\", \"$timeout\", \"$$rAF\", \"$compile\", \"$mdTheming\", \"$mdBottomSheet\", \"$rootElement\", \"$rootScope\", \"$mdGesture\"];\n  return $$interimElementProvider('$mdBottomSheet')\n    .setDefaults({\n      methods: ['disableParentScroll', 'escapeToClose', 'targetEvent'],\n      options: bottomSheetDefaults\n    });\n\n  /* @ngInject */\n  function bottomSheetDefaults($animate, $mdConstant, $timeout, $$rAF, $compile, $mdTheming, $mdBottomSheet, $rootElement, $rootScope, $mdGesture) {\n    var backdrop;\n\n    return {\n      themable: true,\n      targetEvent: null,\n      onShow: onShow,\n      onRemove: onRemove,\n      escapeToClose: true,\n      disableParentScroll: true\n    };\n\n    function onShow(scope, element, options) {\n      // Add a backdrop that will close on click\n      backdrop = $compile('<md-backdrop class=\"md-opaque md-bottom-sheet-backdrop\">')(scope);\n      backdrop.on('click', function() {\n        $timeout($mdBottomSheet.cancel);\n      });\n\n      $mdTheming.inherit(backdrop, options.parent);\n\n      $animate.enter(backdrop, options.parent, null);\n\n      var bottomSheet = new BottomSheet(element, options.parent);\n      options.bottomSheet = bottomSheet;\n\n      // Give up focus on calling item\n      options.targetEvent && angular.element(options.targetEvent.target).blur();\n      $mdTheming.inherit(bottomSheet.element, options.parent);\n\n      if (options.disableParentScroll) {\n        options.lastOverflow = options.parent.css('overflow');\n        options.parent.css('overflow', 'hidden');\n      }\n\n      return $animate.enter(bottomSheet.element, options.parent)\n        .then(function() {\n          var focusable = angular.element(\n            element[0].querySelector('button') ||\n            element[0].querySelector('a') ||\n            element[0].querySelector('[ng-click]')\n          );\n          focusable.focus();\n\n          if (options.escapeToClose) {\n            options.rootElementKeyupCallback = function(e) {\n              if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n                $timeout($mdBottomSheet.cancel);\n              }\n            };\n            $rootElement.on('keyup', options.rootElementKeyupCallback);\n          }\n        });\n\n    }\n\n    function onRemove(scope, element, options) {\n      var bottomSheet = options.bottomSheet;\n\n\n      $animate.leave(backdrop);\n      return $animate.leave(bottomSheet.element).then(function() {\n        if (options.disableParentScroll) {\n          options.parent.css('overflow', options.lastOverflow);\n          delete options.lastOverflow;\n        }\n\n        bottomSheet.cleanup();\n\n        // Restore focus\n        options.targetEvent && angular.element(options.targetEvent.target).focus();\n      });\n    }\n\n    /**\n     * BottomSheet class to apply bottom-sheet behavior to an element\n     */\n    function BottomSheet(element, parent) {\n      var deregister = $mdGesture.register(parent, 'drag', { horizontal: false });\n      parent.on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      return {\n        element: element,\n        cleanup: function cleanup() {\n          deregister();\n          parent.off('$md.dragstart', onDragStart)\n            .off('$md.drag', onDrag)\n            .off('$md.dragend', onDragEnd);\n        }\n      };\n\n      function onDragStart(ev) {\n        // Disable transitions on transform so that it feels fast\n        element.css($mdConstant.CSS.TRANSITION_DURATION, '0ms');\n      }\n\n      function onDrag(ev) {\n        var transform = ev.pointer.distanceY;\n        if (transform < 5) {\n          // Slow down drag when trying to drag up, and stop after PADDING\n          transform = Math.max(-PADDING, transform / 2);\n        }\n        element.css($mdConstant.CSS.TRANSFORM, 'translate3d(0,' + (PADDING + transform) + 'px,0)');\n      }\n\n      function onDragEnd(ev) {\n        if (ev.pointer.distanceY > 0 &&\n            (ev.pointer.distanceY > 20 || Math.abs(ev.pointer.velocityY) > CLOSING_VELOCITY)) {\n          var distanceRemaining = element.prop('offsetHeight') - ev.pointer.distanceY;\n          var transitionDuration = Math.min(distanceRemaining / ev.pointer.velocityY * 0.75, 500);\n          element.css($mdConstant.CSS.TRANSITION_DURATION, transitionDuration + 'ms');\n          $timeout($mdBottomSheet.cancel);\n        } else {\n          element.css($mdConstant.CSS.TRANSITION_DURATION, '');\n          element.css($mdConstant.CSS.TRANSFORM, '');\n        }\n      }\n    }\n\n  }\n\n}\nMdBottomSheetProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/button/button-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-toolbar .md-button.md-THEME_NAME-theme.md-fab {\n  background-color: white; }\n\n.md-button.md-THEME_NAME-theme {\n  border-radius: 3px; }\n  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {\n    background-color: '{{background-500-0.2}}'; }\n  .md-button.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {\n      color: '{{primary-contrast}}';\n      background-color: '{{primary-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {\n        background-color: '{{primary-600}}'; }\n  .md-button.md-THEME_NAME-theme.md-fab {\n    border-radius: 50%;\n    background-color: '{{accent-color}}';\n    color: '{{accent-contrast}}'; }\n    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {\n      background-color: '{{accent-A700}}'; }\n  .md-button.md-THEME_NAME-theme.md-raised {\n    color: '{{background-contrast}}';\n    background-color: '{{background-50}}'; }\n    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {\n      background-color: '{{background-200}}'; }\n  .md-button.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {\n      color: '{{warn-contrast}}';\n      background-color: '{{warn-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {\n        background-color: '{{warn-700}}'; }\n  .md-button.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {\n      color: '{{accent-contrast}}';\n      background-color: '{{accent-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {\n        background-color: '{{accent-700}}'; }\n  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {\n    color: '{{foreground-3}}';\n    background-color: transparent;\n    cursor: not-allowed; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/button/button.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n/**\n * Position a FAB button.\n */\n.md-button {\n  color: currentColor;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  position: relative;\n  outline: none;\n  border: 0;\n  padding: 6px;\n  margin: 0;\n  background: transparent;\n  white-space: nowrap;\n  text-align: center;\n  text-transform: uppercase;\n  font-weight: 500;\n  font-style: inherit;\n  font-variant: inherit;\n  font-size: inherit;\n  font-family: inherit;\n  line-height: inherit;\n  text-decoration: none;\n  cursor: pointer;\n  overflow: hidden;\n  transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-button:focus {\n    outline: none; }\n  .md-button:hover {\n    text-decoration: none; }\n  .md-button.ng-hide {\n    transition: none; }\n  .md-button.md-cornered {\n    border-radius: 0; }\n  .md-button.md-icon {\n    padding: 0;\n    background: none; }\n  .md-button.md-raised {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  .md-button.md-fab {\n    z-index: 20;\n    width: 56px;\n    height: 56px;\n    border-radius: 50%;\n    border-radius: 50%;\n    overflow: hidden;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    transition: 0.2s linear;\n    transition-property: -webkit-transform, box-shadow;\n    transition-property: transform, box-shadow; }\n    .md-button.md-fab.md-fab-bottom-right {\n      top: auto;\n      right: 20px;\n      bottom: 20px;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-bottom-left {\n      top: auto;\n      right: auto;\n      bottom: 20px;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-right {\n      top: 20px;\n      right: 20px;\n      bottom: auto;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-left {\n      top: 20px;\n      right: auto;\n      bottom: auto;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab md-icon {\n      margin-top: 0; }\n    .md-button.md-fab.md-mini {\n      width: 40px;\n      height: 40px; }\n  .md-button:not([disabled]).md-raised:focus, .md-button:not([disabled]).md-raised:hover, .md-button:not([disabled]).md-fab:focus, .md-button:not([disabled]).md-fab:hover {\n    -webkit-transform: translate3d(0, -1px, 0);\n            transform: translate3d(0, -1px, 0); }\n\n.md-toast-open-top .md-button.md-fab-top-left, .md-toast-open-top .md-button.md-fab-top-right {\n  -webkit-transform: translate3d(0, 42px, 0);\n          transform: translate3d(0, 42px, 0); }\n  .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, 41px, 0);\n            transform: translate3d(0, 41px, 0); }\n\n.md-toast-open-bottom .md-button.md-fab-bottom-left, .md-toast-open-bottom .md-button.md-fab-bottom-right {\n  -webkit-transform: translate3d(0, -42px, 0);\n          transform: translate3d(0, -42px, 0); }\n  .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, -43px, 0);\n            transform: translate3d(0, -43px, 0); }\n\n.md-button-group {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  width: 100%; }\n\n.md-button-group > .md-button {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  display: block;\n  overflow: hidden;\n  width: 0;\n  border-width: 1px 0px 1px 1px;\n  border-radius: 0;\n  text-align: center;\n  text-overflow: ellipsis;\n  white-space: nowrap; }\n  .md-button-group > .md-button:first-child {\n    border-radius: 2px 0px 0px 2px; }\n  .md-button-group > .md-button:last-child {\n    border-right-width: 1px;\n    border-radius: 0px 2px 2px 0px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/button/button.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.button');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.button\n * @description\n *\n * Button\n */\nangular.module('material.components.button', [\n  'material.core'\n])\n  .directive('mdButton', MdButtonDirective);\n\n/**\n * @ngdoc directive\n * @name mdButton\n * @module material.components.button\n *\n * @restrict E\n *\n * @description\n * `<md-button>` is a button directive with optional ink ripples (default enabled).\n *\n * If you supply a `href` or `ng-href` attribute, it will become an `<a>` element. Otherwise, it will\n * become a `<button>` element.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the FAB button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {boolean=} md-no-ink If present, disable ripple ink effects.\n * @param {expression=} ng-disabled En/Disable based on the expression\n * @param {string=} md-ripple-size Overrides the default ripple size logic. Options: `full`, `partial`, `auto`\n * @param {string=} aria-label Adds alternative text to button for accessibility, useful for icon buttons.\n * If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-button>\n *    Button\n *  </md-button>\n *  <md-button href=\"http://google.com\" class=\"md-button-colored\">\n *    I'm a link\n *  </md-button>\n *  <md-button ng-disabled=\"true\" class=\"md-colored\">\n *    I'm a disabled button\n *  </md-button>\n * </hljs>\n */\nfunction MdButtonDirective($mdInkRipple, $mdTheming, $mdAria) {\n\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: getTemplate,\n    link: postLink\n  };\n\n  function isAnchor(attr) {\n    return angular.isDefined(attr.href) || angular.isDefined(attr.ngHref);\n  }\n  \n  function getTemplate(element, attr) {\n    return isAnchor(attr) ?\n           '<a class=\"md-button\" ng-transclude></a>' :\n           '<button class=\"md-button\" ng-transclude></button>';\n  }\n\n  function postLink(scope, element, attr) {\n    var node = element[0];\n    $mdTheming(element);\n    $mdInkRipple.attachButtonBehavior(scope, element);\n\n    var elementHasText = node.textContent.trim();\n    if (!elementHasText) {\n      $mdAria.expect(element, 'aria-label');\n    }\n\n    // For anchor elements, we have to set tabindex manually when the \n    // element is disabled\n    if (isAnchor(attr) && angular.isDefined(attr.ngDisabled) ) {\n      scope.$watch(attr.ngDisabled, function(isDisabled) {\n        element.attr('tabindex', isDisabled ? -1 : 0);\n      });\n    }\n  }\n\n}\nMdButtonDirective.$inject = [\"$mdInkRipple\", \"$mdTheming\", \"$mdAria\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/card/card-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-card.md-THEME_NAME-theme {\n  border-radius: 2px; }\n  md-card.md-THEME_NAME-theme .md-card-image {\n    border-radius: 2px 2px 0 0; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/card/card.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-card {\n  box-sizing: border-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  margin: 8px;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n  md-card > img, md-card > :not(md-card-content) img {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0;\n    width: 100%; }\n  md-card md-card-content {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 16px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/card/card.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.card');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.card\n *\n * @description\n * Card components.\n */\nangular.module('material.components.card', [\n  'material.core'\n])\n  .directive('mdCard', mdCardDirective);\n\n\n\n/**\n * @ngdoc directive\n * @name mdCard\n * @module material.components.card\n *\n * @restrict E\n *\n * @description\n * The `<md-card>` directive is a container element used within `<md-content>` containers.\n *\n * Cards have constant width and variable heights; where the maximum height is limited to what can\n * fit within a single view on a platform, but it can temporarily expand as needed\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-card>\n *  <img src=\"img/washedout.png\" class=\"md-card-image\">\n *  <h2>Paracosm</h2>\n *  <p>\n *    The titles of Washed Out's breakthrough song and the first single from Paracosm share the * two most important words in Ernest Greene's musical language: feel it. It's a simple request, as well...\n *  </p>\n * </md-card>\n * </hljs>\n *\n */\nfunction mdCardDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $mdTheming($element);\n    }\n  };\n}\nmdCardDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/checkbox/checkbox-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-checkbox.md-THEME_NAME-theme .md-ripple {\n  color: '{{accent-600}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon {\n  background-color: '{{accent-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {\n  color: '{{primary-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {\n  background-color: '{{primary-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {\n  color: '{{warn-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {\n  background-color: '{{warn-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled] .md-icon {\n  border-color: '{{foreground-3}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {\n  background-color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/checkbox/checkbox.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-checkbox {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-checkbox .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 18px;\n    height: 18px; }\n    md-checkbox .md-container:after {\n      content: '';\n      position: absolute;\n      top: -10px;\n      right: -10px;\n      bottom: -10px;\n      left: -10px; }\n    md-checkbox .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -15px;\n      top: -15px;\n      right: -15px;\n      bottom: -15px; }\n  md-checkbox .md-icon {\n    transition: 240ms;\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 18px;\n    height: 18px;\n    border: 2px solid;\n    border-radius: 2px; }\n  md-checkbox.md-checked .md-icon {\n    border: none; }\n  md-checkbox[disabled] {\n    cursor: no-drop; }\n  md-checkbox:focus .md-label:not(:empty) {\n    border-color: black; }\n  md-checkbox.md-checked .md-icon:after {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg);\n    position: absolute;\n    left: 6px;\n    top: 2px;\n    display: table;\n    width: 6px;\n    height: 12px;\n    border: 2px solid;\n    border-top: 0;\n    border-left: 0;\n    content: ' '; }\n  md-checkbox .md-label {\n    border: 1px dotted transparent;\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    -webkit-user-select: text;\n       -moz-user-select: text;\n        -ms-user-select: text;\n            user-select: text; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/checkbox/checkbox.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.checkbox');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.checkbox\n * @description Checkbox module!\n */\nangular.module('material.components.checkbox', [\n  'material.core'\n])\n  .directive('mdCheckbox', MdCheckboxDirective);\n\n/**\n * @ngdoc directive\n * @name mdCheckbox\n * @module material.components.checkbox\n * @restrict E\n *\n * @description\n * The checkbox directive is used like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the checkbox is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects\n * @param {string=} aria-label Adds label to checkbox for accessibility.\n * Defaults to checkbox's text. If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-checkbox ng-model=\"isChecked\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-checkbox>\n *\n * <md-checkbox md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-checkbox>\n *\n * <md-checkbox ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-checkbox>\n *\n * </hljs>\n *\n */\nfunction MdCheckboxDirective(inputDirective, $mdInkRipple, $mdAria, $mdConstant, $mdTheming, $mdUtil) {\n  inputDirective = inputDirective[0];\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    require: '?ngModel',\n    template: \n      '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n        '<div class=\"md-icon\"></div>' +\n      '</div>' +\n      '<div ng-transclude class=\"md-label\"></div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n\n    tAttrs.type = 'checkbox';\n    tAttrs.tabIndex = 0;\n    tElement.attr('role', tAttrs.type);\n\n    return function postLink(scope, element, attr, ngModelCtrl) {\n      ngModelCtrl = ngModelCtrl || $mdUtil.fakeNgModel();\n      var checked = false;\n      $mdTheming(element);\n\n      if (attr.ngChecked) {\n        scope.$watch(\n            scope.$eval.bind(scope, attr.ngChecked),\n            ngModelCtrl.$setViewValue.bind(ngModelCtrl)\n        );\n      }\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      // Reuse the original input[type=checkbox] directive from Angular core.\n      // This is a bit hacky as we need our own event listener and own render\n      // function.\n      inputDirective.link.pre(scope, {\n        on: angular.noop,\n        0: {}\n      }, attr, [ngModelCtrl]);\n\n      element.on('click', listener)\n        .on('keypress', keypressHandler);\n      ngModelCtrl.$render = render;\n\n      function keypressHandler(ev) {\n        if(ev.which === $mdConstant.KEY_CODE.SPACE) {\n          ev.preventDefault();\n          listener(ev);\n        }\n      }\n      function listener(ev) {\n        if (element[0].hasAttribute('disabled')) return;\n\n        scope.$apply(function() {\n          checked = !checked;\n          ngModelCtrl.$setViewValue(checked, ev && ev.type);\n          ngModelCtrl.$render();\n        });\n      }\n\n      function render() {\n        checked = ngModelCtrl.$viewValue;\n        if(checked) {\n          element.addClass(CHECKED_CSS);\n        } else {\n          element.removeClass(CHECKED_CSS);\n        }\n      }\n    };\n  }\n}\nMdCheckboxDirective.$inject = [\"inputDirective\", \"$mdInkRipple\", \"$mdAria\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/content/content-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-content.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/content/content.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-content {\n  display: block;\n  position: relative;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch; }\n  md-content[md-scroll-y] {\n    overflow-y: auto;\n    overflow-x: hidden; }\n  md-content[md-scroll-x] {\n    overflow-x: auto;\n    overflow-y: hidden; }\n  md-content.md-padding {\n    padding: 8px; }\n\n@media (min-width: 600px) {\n  md-content.md-padding {\n    padding: 16px; }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/content/content.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.content');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.content\n *\n * @description\n * Scrollable content\n */\nangular.module('material.components.content', [\n  'material.core'\n])\n  .directive('mdContent', mdContentDirective);\n\n/**\n * @ngdoc directive\n * @name mdContent\n * @module material.components.content\n *\n * @restrict E\n *\n * @description\n * The `<md-content>` directive is a container element useful for scrollable content\n *\n * ### Restrictions\n *\n * - Add the `md-padding` class to make the content padded.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-content class=\"md-padding\">\n *      Lorem ipsum dolor sit amet, ne quod novum mei.\n *  </md-content>\n * </hljs>\n *\n */\n\nfunction mdContentDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: ['$scope', '$element', ContentController],\n    link: function(scope, element, attr) {\n      var node = element[0];\n\n      $mdTheming(element);\n      scope.$broadcast('$mdContentLoaded', element);\n\n      iosScrollFix(element[0]);\n    }\n  };\n\n  function ContentController($scope, $element) {\n    this.$scope = $scope;\n    this.$element = $element;\n  }\n}\nmdContentDirective.$inject = [\"$mdTheming\"];\n\nfunction iosScrollFix(node) {\n  // IOS FIX:\n  // If we scroll where there is no more room for the webview to scroll,\n  // by default the webview itself will scroll up and down, this looks really\n  // bad.  So if we are scrolling to the very top or bottom, add/subtract one\n  angular.element(node).on('$md.pressdown', function(ev) {\n    // Only touch events\n    if (ev.pointer.type !== 't') return;\n    // Don't let a child content's touchstart ruin it for us.\n    if (ev.$materialScrollFixed) return;\n    ev.$materialScrollFixed = true;\n\n    if (node.scrollTop === 0) {\n      node.scrollTop = 1;\n    } else if (node.scrollHeight === node.scrollTop + node.offsetHeight) {\n      node.scrollTop -= 1;\n    }\n  });\n}\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/core/core.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n/* Sizes:\n  0    <= size < 600  Phone\n  600  <= size < 960  Tablet\n  960  <= size < 1200 Tablet-Landscape\n  1200 <= size         PC\n*/\n[layout] {\n  box-sizing: border-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n[layout=column] {\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n\n[layout=row] {\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row; }\n\n[layout-padding], [layout-padding] > [flex] {\n  padding: 8px; }\n\n[layout-margin], [layout-margin] > [flex] {\n  margin: 8px; }\n\n[layout-wrap] {\n  -webkit-flex-wrap: wrap;\n      -ms-flex-wrap: wrap;\n          flex-wrap: wrap; }\n\n[layout-fill] {\n  margin: 0;\n  min-height: 100%;\n  width: 100%; }\n\n@-moz-document url-prefix() {\n  [layout-fill] {\n    margin: 0;\n    width: 100%;\n    min-height: auto;\n    height: inherit; } }\n\n[flex] {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1; }\n\n[flex=\"0\"] {\n  -webkit-flex: 0 0 0%;\n      -ms-flex: 0 0 0%;\n          flex: 0 0 0%; }\n\n[layout=\"row\"] > [flex=\"0\"] {\n  max-width: 0%; }\n\n[layout=\"column\"] > [flex=\"0\"] {\n  max-height: 0%; }\n\n[flex=\"5\"] {\n  -webkit-flex: 0 0 5%;\n      -ms-flex: 0 0 5%;\n          flex: 0 0 5%; }\n\n[layout=\"row\"] > [flex=\"5\"] {\n  max-width: 5%; }\n\n[layout=\"column\"] > [flex=\"5\"] {\n  max-height: 5%; }\n\n[flex=\"10\"] {\n  -webkit-flex: 0 0 10%;\n      -ms-flex: 0 0 10%;\n          flex: 0 0 10%; }\n\n[layout=\"row\"] > [flex=\"10\"] {\n  max-width: 10%; }\n\n[layout=\"column\"] > [flex=\"10\"] {\n  max-height: 10%; }\n\n[flex=\"15\"] {\n  -webkit-flex: 0 0 15%;\n      -ms-flex: 0 0 15%;\n          flex: 0 0 15%; }\n\n[layout=\"row\"] > [flex=\"15\"] {\n  max-width: 15%; }\n\n[layout=\"column\"] > [flex=\"15\"] {\n  max-height: 15%; }\n\n[flex=\"20\"] {\n  -webkit-flex: 0 0 20%;\n      -ms-flex: 0 0 20%;\n          flex: 0 0 20%; }\n\n[layout=\"row\"] > [flex=\"20\"] {\n  max-width: 20%; }\n\n[layout=\"column\"] > [flex=\"20\"] {\n  max-height: 20%; }\n\n[flex=\"25\"] {\n  -webkit-flex: 0 0 25%;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%; }\n\n[layout=\"row\"] > [flex=\"25\"] {\n  max-width: 25%; }\n\n[layout=\"column\"] > [flex=\"25\"] {\n  max-height: 25%; }\n\n[flex=\"30\"] {\n  -webkit-flex: 0 0 30%;\n      -ms-flex: 0 0 30%;\n          flex: 0 0 30%; }\n\n[layout=\"row\"] > [flex=\"30\"] {\n  max-width: 30%; }\n\n[layout=\"column\"] > [flex=\"30\"] {\n  max-height: 30%; }\n\n[flex=\"35\"] {\n  -webkit-flex: 0 0 35%;\n      -ms-flex: 0 0 35%;\n          flex: 0 0 35%; }\n\n[layout=\"row\"] > [flex=\"35\"] {\n  max-width: 35%; }\n\n[layout=\"column\"] > [flex=\"35\"] {\n  max-height: 35%; }\n\n[flex=\"40\"] {\n  -webkit-flex: 0 0 40%;\n      -ms-flex: 0 0 40%;\n          flex: 0 0 40%; }\n\n[layout=\"row\"] > [flex=\"40\"] {\n  max-width: 40%; }\n\n[layout=\"column\"] > [flex=\"40\"] {\n  max-height: 40%; }\n\n[flex=\"45\"] {\n  -webkit-flex: 0 0 45%;\n      -ms-flex: 0 0 45%;\n          flex: 0 0 45%; }\n\n[layout=\"row\"] > [flex=\"45\"] {\n  max-width: 45%; }\n\n[layout=\"column\"] > [flex=\"45\"] {\n  max-height: 45%; }\n\n[flex=\"50\"] {\n  -webkit-flex: 0 0 50%;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%; }\n\n[layout=\"row\"] > [flex=\"50\"] {\n  max-width: 50%; }\n\n[layout=\"column\"] > [flex=\"50\"] {\n  max-height: 50%; }\n\n[flex=\"55\"] {\n  -webkit-flex: 0 0 55%;\n      -ms-flex: 0 0 55%;\n          flex: 0 0 55%; }\n\n[layout=\"row\"] > [flex=\"55\"] {\n  max-width: 55%; }\n\n[layout=\"column\"] > [flex=\"55\"] {\n  max-height: 55%; }\n\n[flex=\"60\"] {\n  -webkit-flex: 0 0 60%;\n      -ms-flex: 0 0 60%;\n          flex: 0 0 60%; }\n\n[layout=\"row\"] > [flex=\"60\"] {\n  max-width: 60%; }\n\n[layout=\"column\"] > [flex=\"60\"] {\n  max-height: 60%; }\n\n[flex=\"65\"] {\n  -webkit-flex: 0 0 65%;\n      -ms-flex: 0 0 65%;\n          flex: 0 0 65%; }\n\n[layout=\"row\"] > [flex=\"65\"] {\n  max-width: 65%; }\n\n[layout=\"column\"] > [flex=\"65\"] {\n  max-height: 65%; }\n\n[flex=\"70\"] {\n  -webkit-flex: 0 0 70%;\n      -ms-flex: 0 0 70%;\n          flex: 0 0 70%; }\n\n[layout=\"row\"] > [flex=\"70\"] {\n  max-width: 70%; }\n\n[layout=\"column\"] > [flex=\"70\"] {\n  max-height: 70%; }\n\n[flex=\"75\"] {\n  -webkit-flex: 0 0 75%;\n      -ms-flex: 0 0 75%;\n          flex: 0 0 75%; }\n\n[layout=\"row\"] > [flex=\"75\"] {\n  max-width: 75%; }\n\n[layout=\"column\"] > [flex=\"75\"] {\n  max-height: 75%; }\n\n[flex=\"80\"] {\n  -webkit-flex: 0 0 80%;\n      -ms-flex: 0 0 80%;\n          flex: 0 0 80%; }\n\n[layout=\"row\"] > [flex=\"80\"] {\n  max-width: 80%; }\n\n[layout=\"column\"] > [flex=\"80\"] {\n  max-height: 80%; }\n\n[flex=\"85\"] {\n  -webkit-flex: 0 0 85%;\n      -ms-flex: 0 0 85%;\n          flex: 0 0 85%; }\n\n[layout=\"row\"] > [flex=\"85\"] {\n  max-width: 85%; }\n\n[layout=\"column\"] > [flex=\"85\"] {\n  max-height: 85%; }\n\n[flex=\"90\"] {\n  -webkit-flex: 0 0 90%;\n      -ms-flex: 0 0 90%;\n          flex: 0 0 90%; }\n\n[layout=\"row\"] > [flex=\"90\"] {\n  max-width: 90%; }\n\n[layout=\"column\"] > [flex=\"90\"] {\n  max-height: 90%; }\n\n[flex=\"95\"] {\n  -webkit-flex: 0 0 95%;\n      -ms-flex: 0 0 95%;\n          flex: 0 0 95%; }\n\n[layout=\"row\"] > [flex=\"95\"] {\n  max-width: 95%; }\n\n[layout=\"column\"] > [flex=\"95\"] {\n  max-height: 95%; }\n\n[flex=\"100\"] {\n  -webkit-flex: 0 0 100%;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%; }\n\n[layout=\"row\"] > [flex=\"100\"] {\n  max-width: 100%; }\n\n[layout=\"column\"] > [flex=\"100\"] {\n  max-height: 100%; }\n\n[layout=\"row\"] > [flex=\"33\"], [layout=\"row\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-width: 33.33%; }\n[layout=\"row\"] > [flex=\"66\"], [layout=\"row\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-width: 66.66%; }\n\n[layout=\"column\"] > [flex=\"33\"], [layout=\"column\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-height: 33.33%; }\n[layout=\"column\"] > [flex=\"66\"], [layout=\"column\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-height: 66.66%; }\n\n[layout-align=\"center\"], [layout-align=\"center center\"], [layout-align=\"center start\"], [layout-align=\"center end\"] {\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n[layout-align=\"end\"], [layout-align=\"end center\"], [layout-align=\"end start\"], [layout-align=\"end end\"] {\n  -webkit-justify-content: flex-end;\n      -ms-flex-pack: end;\n          justify-content: flex-end; }\n\n[layout-align=\"space-around\"], [layout-align=\"space-around center\"], [layout-align=\"space-around start\"], [layout-align=\"space-around end\"] {\n  -webkit-justify-content: space-around;\n      -ms-flex-pack: distribute;\n          justify-content: space-around; }\n\n[layout-align=\"space-between\"], [layout-align=\"space-between center\"], [layout-align=\"space-between start\"], [layout-align=\"space-between end\"] {\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between; }\n\n[layout-align=\"center center\"], [layout-align=\"start center\"], [layout-align=\"end center\"], [layout-align=\"space-between center\"], [layout-align=\"space-around center\"] {\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center; }\n\n[layout-align=\"center start\"], [layout-align=\"start start\"], [layout-align=\"end start\"], [layout-align=\"space-between start\"], [layout-align=\"space-around start\"] {\n  -webkit-align-items: flex-start;\n      -ms-flex-align: start;\n          align-items: flex-start; }\n\n[layout-align=\"center end\"], [layout-align=\"start end\"], [layout-align=\"end end\"], [layout-align=\"space-between end\"], [layout-align=\"space-around end\"] {\n  -webkit-align-items: flex-end;\n      -ms-flex-align: end;\n          align-items: flex-end; }\n\n[flex-order=\"0\"] {\n  -webkit-order: 0;\n      -ms-flex-order: 0;\n          order: 0; }\n\n[flex-order=\"1\"] {\n  -webkit-order: 1;\n      -ms-flex-order: 1;\n          order: 1; }\n\n[flex-order=\"2\"] {\n  -webkit-order: 2;\n      -ms-flex-order: 2;\n          order: 2; }\n\n[flex-order=\"3\"] {\n  -webkit-order: 3;\n      -ms-flex-order: 3;\n          order: 3; }\n\n[flex-order=\"4\"] {\n  -webkit-order: 4;\n      -ms-flex-order: 4;\n          order: 4; }\n\n[flex-order=\"5\"] {\n  -webkit-order: 5;\n      -ms-flex-order: 5;\n          order: 5; }\n\n[flex-order=\"6\"] {\n  -webkit-order: 6;\n      -ms-flex-order: 6;\n          order: 6; }\n\n[flex-order=\"7\"] {\n  -webkit-order: 7;\n      -ms-flex-order: 7;\n          order: 7; }\n\n[flex-order=\"8\"] {\n  -webkit-order: 8;\n      -ms-flex-order: 8;\n          order: 8; }\n\n[flex-order=\"9\"] {\n  -webkit-order: 9;\n      -ms-flex-order: 9;\n          order: 9; }\n\n/**\n * `hide-gt-sm show-gt-lg` should hide from 600px to 1200px\n * `show-md hide-gt-sm` should show from 0px to 960px and hide at >960px\n * `hide-gt-md show-gt-sm` should show everywhere (show overrides hide)`\n */\n@media (max-width: 599px) {\n  [hide-sm]:not([show-sm]):not([show]), [hide]:not([show-sm]):not([show]) {\n    display: none; }\n\n  [flex-order-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-sm=\"center\"], [layout-align-sm=\"center center\"], [layout-align-sm=\"center start\"], [layout-align-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-sm=\"end\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-sm=\"space-around\"], [layout-align-sm=\"space-around center\"], [layout-align-sm=\"space-around start\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-sm=\"space-between\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-sm=\"center center\"], [layout-align-sm=\"start center\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-sm=\"center start\"], [layout-align-sm=\"start start\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-sm=\"center end\"], [layout-align-sm=\"start end\"], [layout-align-sm=\"end end\"], [layout-align-sm=\"space-between end\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"33\"], [layout=\"row\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-sm=\"66\"], [layout=\"row\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-sm=\"33\"], [layout=\"column\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-sm=\"66\"], [layout=\"column\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) {\n  [flex-order-gt-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-sm=\"center\"], [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-sm=\"end\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-sm=\"space-around\"], [layout-align-gt-sm=\"space-around center\"], [layout-align-gt-sm=\"space-around start\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-sm=\"space-between\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"start center\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"start start\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-sm=\"center end\"], [layout-align-gt-sm=\"start end\"], [layout-align-gt-sm=\"end end\"], [layout-align-gt-sm=\"space-between end\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"33\"], [layout=\"row\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-sm=\"66\"], [layout=\"row\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"33\"], [layout=\"column\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-sm=\"66\"], [layout=\"column\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) and (max-width: 959px) {\n  [hide]:not([show-gt-sm]):not([show-md]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]) {\n    display: none; }\n\n  [hide-md]:not([show-md]):not([show]) {\n    display: none; }\n\n  [flex-order-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-md=\"center\"], [layout-align-md=\"center center\"], [layout-align-md=\"center start\"], [layout-align-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-md=\"end\"], [layout-align-md=\"end center\"], [layout-align-md=\"end start\"], [layout-align-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-md=\"space-around\"], [layout-align-md=\"space-around center\"], [layout-align-md=\"space-around start\"], [layout-align-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-md=\"space-between\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-md=\"center center\"], [layout-align-md=\"start center\"], [layout-align-md=\"end center\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-md=\"center start\"], [layout-align-md=\"start start\"], [layout-align-md=\"end start\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-md=\"center end\"], [layout-align-md=\"start end\"], [layout-align-md=\"end end\"], [layout-align-md=\"space-between end\"], [layout-align-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-md=\"33\"], [layout=\"row\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-md=\"66\"], [layout=\"row\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-md=\"33\"], [layout=\"column\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-md=\"66\"], [layout=\"column\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) {\n  [flex-order-gt-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-md=\"center\"], [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-md=\"end\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-md=\"space-around\"], [layout-align-gt-md=\"space-around center\"], [layout-align-gt-md=\"space-around start\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-md=\"space-between\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"start center\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"start start\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-md=\"center end\"], [layout-align-gt-md=\"start end\"], [layout-align-gt-md=\"end end\"], [layout-align-gt-md=\"space-between end\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"33\"], [layout=\"row\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-md=\"66\"], [layout=\"row\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"33\"], [layout=\"column\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-md=\"66\"], [layout=\"column\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) and (max-width: 1199px) {\n  [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]) {\n    display: none; }\n\n  [hide-lg]:not([show-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-lg=\"center\"], [layout-align-lg=\"center center\"], [layout-align-lg=\"center start\"], [layout-align-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-lg=\"end\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-lg=\"space-around\"], [layout-align-lg=\"space-around center\"], [layout-align-lg=\"space-around start\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-lg=\"space-between\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-lg=\"center center\"], [layout-align-lg=\"start center\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-lg=\"center start\"], [layout-align-lg=\"start start\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-lg=\"center end\"], [layout-align-lg=\"start end\"], [layout-align-lg=\"end end\"], [layout-align-lg=\"space-between end\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"33\"], [layout=\"row\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-lg=\"66\"], [layout=\"row\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-lg=\"33\"], [layout=\"column\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-lg=\"66\"], [layout=\"column\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 1200px) {\n  [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-gt-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-lg=\"center\"], [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-lg=\"end\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-lg=\"space-around\"], [layout-align-gt-lg=\"space-around center\"], [layout-align-gt-lg=\"space-around start\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-lg=\"space-between\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"start center\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"start start\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-lg=\"center end\"], [layout-align-gt-lg=\"start end\"], [layout-align-gt-lg=\"end end\"], [layout-align-gt-lg=\"space-between end\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"33\"], [layout=\"row\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-lg=\"66\"], [layout=\"row\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"33\"], [layout=\"column\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-lg=\"66\"], [layout=\"column\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n*, *:before, *:after {\n  box-sizing: border-box; }\n\n:focus {\n  outline: none; }\n\nhtml, body {\n  height: 100%;\n  color: rgba(0, 0, 0, 0.87);\n  background: white;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  -webkit-touch-callout: none;\n  -webkit-text-size-adjust: 100%;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility; }\n  html p, body p {\n    line-height: 1.846; }\n  html h3, body h3 {\n    display: block;\n    -webkit-margin-before: 1em;\n    -webkit-margin-after: 1em;\n    -webkit-margin-start: 0px;\n    -webkit-margin-end: 0px;\n    font-size: 1.17em;\n    font-weight: bold; }\n\nbutton, select, html, textarea, input {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\nbody {\n  margin: 0;\n  padding: 0;\n  outline: none; }\n\n.inset {\n  padding: 10px; }\n\nbutton {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\na {\n  background: transparent;\n  outline: none; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nh2 {\n  font-size: 1.5em;\n  margin: 0.83em 0; }\n\nh3 {\n  font-size: 1.17em;\n  margin: 1em 0; }\n\nh4 {\n  font-size: 1em;\n  margin: 1.33em 0; }\n\nh5 {\n  font-size: 0.83em;\n  margin: 1.67em 0; }\n\nh6 {\n  font-size: 0.75em;\n  margin: 2.33em 0; }\n\nselect, button, textarea, input {\n  margin: 0;\n  font-size: 100%;\n  font-family: inherit;\n  vertical-align: baseline; }\n\ninput[type=\"reset\"], input[type=\"submit\"], html input[type=\"button\"], button {\n  cursor: pointer;\n  -webkit-appearance: button; }\n  input[type=\"reset\"][disabled], input[type=\"submit\"][disabled], html input[type=\"button\"][disabled], button[disabled] {\n    cursor: default; }\n\ntextarea {\n  vertical-align: top;\n  overflow: auto; }\n\ninput[type=\"radio\"], input[type=\"checkbox\"] {\n  padding: 0;\n  box-sizing: border-box; }\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box; }\n  input[type=\"search\"]::-webkit-search-decoration, input[type=\"search\"]::-webkit-search-cancel-button {\n    -webkit-appearance: none; }\n\n.visually-hidden {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  text-transform: none;\n  width: 1px; }\n\n.md-shadow {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: inherit;\n  pointer-events: none; }\n\n.md-shadow-bottom-z-1 {\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-shadow-bottom-z-2 {\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4); }\n\n.md-shadow-animated.md-shadow {\n  transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); }\n\n/*\n * A container inside of a rippling element (eg a button),\n * which contains all of the individual ripples\n */\n.md-ripple-container {\n  pointer-events: none;\n  position: absolute;\n  overflow: hidden;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1); }\n\n.md-ripple {\n  position: absolute;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n  opacity: 0;\n  border-radius: 50%; }\n  .md-ripple.md-ripple-placed {\n    transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1);\n    transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-ripple.md-ripple-scaled {\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  .md-ripple.md-ripple-active, .md-ripple.md-ripple-full, .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n\nmd-tab > .md-ripple-container .md-ripple {\n  box-sizing: content-box;\n  background-color: transparent !important;\n  border-width: 0;\n  border-style: solid;\n  opacity: 0.2;\n  -webkit-transform: none !important;\n          transform: none !important; }\n  md-tab > .md-ripple-container .md-ripple.md-ripple-active, md-tab > .md-ripple-container .md-ripple.md-ripple-full, md-tab > .md-ripple-container .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/core/core.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.core');\n\n(function() {\n'use strict';\n\n/**\n * Initialization function that validates environment\n * requirements.\n */\nangular\n  .module('material.core', [ 'material.core.theming' ])\n  .config( MdCoreConfigure );\n\n\nfunction MdCoreConfigure($provide, $mdThemingProvider) {\n\n  $provide.decorator('$$rAF', [\"$delegate\", rAFDecorator]);\n\n  $mdThemingProvider.theme('default')\n    .primaryPalette('indigo')\n    .accentPalette('pink')\n    .warnPalette('red')\n    .backgroundPalette('grey');\n}\nMdCoreConfigure.$inject = [\"$provide\", \"$mdThemingProvider\"];\n\nfunction rAFDecorator( $delegate ) {\n  /**\n   * Use this to throttle events that come in often.\n   * The throttled function will always use the *last* invocation before the\n   * coming frame.\n   *\n   * For example, window resize events that fire many times a second:\n   * If we set to use an raf-throttled callback on window resize, then\n   * our callback will only be fired once per frame, with the last resize\n   * event that happened before that frame.\n   *\n   * @param {function} callback function to debounce\n   */\n  $delegate.throttle = function(cb) {\n    var queueArgs, alreadyQueued, queueCb, context;\n    return function debounced() {\n      queueArgs = arguments;\n      context = this;\n      queueCb = cb;\n      if (!alreadyQueued) {\n        alreadyQueued = true;\n        $delegate(function() {\n          queueCb.apply(context, queueArgs);\n          alreadyQueued = false;\n        });\n      }\n    };\n  };\n  return $delegate;\n}\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n.factory('$mdConstant', MdConstantFactory);\n\nfunction MdConstantFactory($$rAF, $sniffer) {\n\n  var webkit = /webkit/i.test($sniffer.vendorPrefix);\n  function vendorProperty(name) {\n    return webkit ?  ('webkit' + name.charAt(0).toUpperCase() + name.substring(1)) : name;\n  }\n\n  return {\n    KEY_CODE: {\n      ENTER: 13,\n      ESCAPE: 27,\n      SPACE: 32,\n      LEFT_ARROW : 37,\n      UP_ARROW : 38,\n      RIGHT_ARROW : 39,\n      DOWN_ARROW : 40,\n      TAB : 9\n    },\n    CSS: {\n      /* Constants */\n      TRANSITIONEND: 'transitionend' + (webkit ? ' webkitTransitionEnd' : ''),\n      ANIMATIONEND: 'animationend' + (webkit ? ' webkitAnimationEnd' : ''),\n\n      TRANSFORM: vendorProperty('transform'),\n      TRANSFORM_ORIGIN: vendorProperty('transformOrigin'),\n      TRANSITION: vendorProperty('transition'),\n      TRANSITION_DURATION: vendorProperty('transitionDuration'),\n      ANIMATION_PLAY_STATE: vendorProperty('animationPlayState'),\n      ANIMATION_DURATION: vendorProperty('animationDuration'),\n      ANIMATION_NAME: vendorProperty('animationName'),\n      ANIMATION_TIMING: vendorProperty('animationTimingFunction'),\n      ANIMATION_DIRECTION: vendorProperty('animationDirection')\n    },\n    MEDIA: {\n      'sm': '(max-width: 600px)',\n      'gt-sm': '(min-width: 600px)',\n      'md': '(min-width: 600px) and (max-width: 960px)',\n      'gt-md': '(min-width: 960px)',\n      'lg': '(min-width: 960px) and (max-width: 1200px)',\n      'gt-lg': '(min-width: 1200px)'\n    },\n    MEDIA_PRIORITY: [\n      'gt-lg',\n      'lg',\n      'gt-md',\n      'md',\n      'gt-sm',\n      'sm'\n    ]\n  };\n}\nMdConstantFactory.$inject = [\"$$rAF\", \"$sniffer\"];\n\n})();\n\n(function(){\n\n  angular\n    .module('material.core')\n    .config( [\"$provide\", function($provide){\n       $provide.decorator('$mdUtil', ['$delegate', function ($delegate){\n           /**\n            * Inject the iterator facade to easily support iteration and accessors\n            * @see iterator below\n            */\n           $delegate.iterator = Iterator;\n\n           return $delegate;\n         }\n       ]);\n     }]);\n\n  /**\n   * iterator is a list facade to easily support iteration and accessors\n   *\n   * @param items Array list which this iterator will enumerate\n   * @param reloop Boolean enables iterator to consider the list as an endless reloop\n   */\n  function Iterator(items, reloop) {\n    var trueFn = function() { return true; };\n\n    if (items && !angular.isArray(items)) {\n      items = Array.prototype.slice.call(items);\n    }\n\n    reloop = !!reloop;\n    var _items = items || [ ];\n\n    // Published API\n    return {\n      items: getItems,\n      count: count,\n\n      inRange: inRange,\n      contains: contains,\n      indexOf: indexOf,\n      itemAt: itemAt,\n\n      findBy: findBy,\n\n      add: add,\n      remove: remove,\n\n      first: first,\n      last: last,\n      next: angular.bind(null, findSubsequentItem, false),\n      previous: angular.bind(null, findSubsequentItem, true),\n\n      hasPrevious: hasPrevious,\n      hasNext: hasNext\n\n    };\n\n    /**\n     * Publish copy of the enumerable set\n     * @returns {Array|*}\n     */\n    function getItems() {\n      return [].concat(_items);\n    }\n\n    /**\n     * Determine length of the list\n     * @returns {Array.length|*|number}\n     */\n    function count() {\n      return _items.length;\n    }\n\n    /**\n     * Is the index specified valid\n     * @param index\n     * @returns {Array.length|*|number|boolean}\n     */\n    function inRange(index) {\n      return _items.length && ( index > -1 ) && (index < _items.length );\n    }\n\n    /**\n     * Can the iterator proceed to the next item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasNext(item) {\n      return item ? inRange(indexOf(item) + 1) : false;\n    }\n\n    /**\n     * Can the iterator proceed to the previous item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasPrevious(item) {\n      return item ? inRange(indexOf(item) - 1) : false;\n    }\n\n    /**\n     * Get item at specified index/position\n     * @param index\n     * @returns {*}\n     */\n    function itemAt(index) {\n      return inRange(index) ? _items[index] : null;\n    }\n\n    /**\n     * Find all elements matching the key/value pair\n     * otherwise return null\n     *\n     * @param val\n     * @param key\n     *\n     * @return array\n     */\n    function findBy(key, val) {\n      return _items.filter(function(item) {\n        return item[key] === val;\n      });\n    }\n\n    /**\n     * Add item to list\n     * @param item\n     * @param index\n     * @returns {*}\n     */\n    function add(item, index) {\n      if ( !item ) return -1;\n\n      if (!angular.isNumber(index)) {\n        index = _items.length;\n      }\n\n      _items.splice(index, 0, item);\n\n      return indexOf(item);\n    }\n\n    /**\n     * Remove item from list...\n     * @param item\n     */\n    function remove(item) {\n      if ( contains(item) ){\n        _items.splice(indexOf(item), 1);\n      }\n    }\n\n    /**\n     * Get the zero-based index of the target item\n     * @param item\n     * @returns {*}\n     */\n    function indexOf(item) {\n      return _items.indexOf(item);\n    }\n\n    /**\n     * Boolean existence check\n     * @param item\n     * @returns {boolean}\n     */\n    function contains(item) {\n      return item && (indexOf(item) > -1);\n    }\n\n    /**\n     * Return first item in the list\n     * @returns {*}\n     */\n    function first() {\n      return _items.length ? _items[0] : null;\n    }\n\n    /**\n     * Return last item in the list...\n     * @returns {*}\n     */\n    function last() {\n      return _items.length ? _items[_items.length - 1] : null;\n    }\n\n    /**\n     * Find the next item. If reloop is true and at the end of the list, it will go back to the\n     * first item. If given, the `validate` callback will be used to determine whether the next item\n     * is valid. If not valid, it will try to find the next item again.\n     *\n     * @param {boolean} backwards Specifies the direction of searching (forwards/backwards)\n     * @param {*} item The item whose subsequent item we are looking for\n     * @param {Function=} validate The `validate` function\n     * @param {integer=} limit The recursion limit\n     *\n     * @returns {*} The subsequent item or null\n     */\n    function findSubsequentItem(backwards, item, validate, limit) {\n      validate = validate || trueFn;\n\n      var curIndex = indexOf(item);\n      while (true) {\n        if (!inRange(curIndex)) return null;\n\n        var nextIndex = curIndex + (backwards ? -1 : 1);\n        var foundItem = null;\n        if (inRange(nextIndex)) {\n          foundItem = _items[nextIndex];\n        } else if (reloop) {\n          foundItem = backwards ? last() : first();\n          nextIndex = indexOf(foundItem);\n        }\n\n        if ((foundItem === null) || (nextIndex === limit)) return null;\n        if (validate(foundItem)) return foundItem;\n\n        if (angular.isUndefined(limit)) limit = nextIndex;\n\n        curIndex = nextIndex;\n      }\n    }\n  }\n\n})();\n\nangular.module('material.core')\n.factory('$mdMedia', mdMediaFactory);\n\n/**\n * Exposes a function on the '$mdMedia' service which will return true or false,\n * whether the given media query matches. Re-evaluates on resize. Allows presets\n * for 'sm', 'md', 'lg'.\n *\n * @example $mdMedia('sm') == true if device-width <= sm\n * @example $mdMedia('(min-width: 1200px)') == true if device-width >= 1200px\n * @example $mdMedia('max-width: 300px') == true if device-width <= 300px (sanitizes input, adding parens)\n */\nfunction mdMediaFactory($mdConstant, $rootScope, $window) {\n  var queries = {};\n  var mqls = {};\n  var results = {};\n  var normalizeCache = {};\n\n  $mdMedia.getResponsiveAttribute = getResponsiveAttribute;\n  $mdMedia.getQuery = getQuery;\n  $mdMedia.watchResponsiveAttributes = watchResponsiveAttributes;\n\n  return $mdMedia;\n\n  function $mdMedia(query) {\n    var validated = queries[query];\n    if (angular.isUndefined(validated)) {\n      validated = queries[query] = validate(query);\n    }\n\n    var result = results[validated];\n    if (angular.isUndefined(result)) {\n      result = add(validated);\n    }\n\n    return result;\n  }\n\n  function validate(query) {\n    return $mdConstant.MEDIA[query] ||\n           ((query.charAt(0) !== '(') ? ('(' + query + ')') : query);\n  }\n\n  function add(query) {\n    var result = mqls[query] = $window.matchMedia(query);\n    result.addListener(onQueryChange);\n    return (results[result.media] = !!result.matches);\n  }\n\n  function onQueryChange(query) {\n    $rootScope.$evalAsync(function() {\n      results[query.media] = !!query.matches;\n    });\n  }\n\n  function getQuery(name) {\n    return mqls[name];\n  }\n\n  function getResponsiveAttribute(attrs, attrName) {\n    for (var i = 0; i < $mdConstant.MEDIA_PRIORITY.length; i++) {\n      var mediaName = $mdConstant.MEDIA_PRIORITY[i];\n      if (!mqls[queries[mediaName]].matches) {\n        continue;\n      }\n\n      var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n      if (attrs[normalizedName]) {\n        return attrs[normalizedName];\n      }\n    }\n\n    // fallback on unprefixed\n    return attrs[getNormalizedName(attrs, attrName)];\n  }\n\n  function watchResponsiveAttributes(attrNames, attrs, watchFn) {\n    var unwatchFns = [];\n    attrNames.forEach(function(attrName) {\n      var normalizedName = getNormalizedName(attrs, attrName);\n      if (attrs[normalizedName]) {\n        unwatchFns.push(\n            attrs.$observe(normalizedName, angular.bind(void 0, watchFn, null)));\n      }\n\n      for (var mediaName in $mdConstant.MEDIA) {\n        var normalizedName = getNormalizedName(attrs, attrName + '-' + mediaName);\n        if (!attrs[normalizedName]) {\n          return;\n        }\n\n        unwatchFns.push(attrs.$observe(normalizedName, angular.bind(void 0, watchFn, mediaName)));\n      }\n    });\n\n    return function unwatch() {\n      unwatchFns.forEach(function(fn) { fn(); })\n    };\n  }\n\n  // Improves performance dramatically\n  function getNormalizedName(attrs, attrName) {\n    return normalizeCache[attrName] ||\n        (normalizeCache[attrName] = attrs.$normalize(attrName));\n  }\n}\nmdMediaFactory.$inject = [\"$mdConstant\", \"$rootScope\", \"$window\"];\n\n(function() {\n'use strict';\n\n/*\n * This var has to be outside the angular factory, otherwise when\n * there are multiple material apps on the same page, each app\n * will create its own instance of this array and the app's IDs\n * will not be unique.\n */\nvar nextUniqueId = ['0','0','0'];\n\nangular.module('material.core')\n.factory('$mdUtil', [\"$cacheFactory\", \"$document\", \"$timeout\", \"$q\", \"$window\", \"$mdConstant\", function($cacheFactory, $document, $timeout, $q, $window, $mdConstant) {\n  var Util;\n\n  function getNode(el) {\n    return el[0] || el;\n  }\n\n  return Util = {\n    now: window.performance ?\n      angular.bind(window.performance, window.performance.now) : \n      Date.now,\n\n    clientRect: function(element, offsetParent, isOffsetRect) {\n      var node = getNode(element);\n      offsetParent = getNode(offsetParent || node.offsetParent || document.body);\n      var nodeRect = node.getBoundingClientRect();\n\n      // The user can ask for an offsetRect: a rect relative to the offsetParent,\n      // or a clientRect: a rect relative to the page\n      var offsetRect = isOffsetRect ?\n        offsetParent.getBoundingClientRect() : \n        { left: 0, top: 0, width: 0, height: 0 };\n      return {\n        left: nodeRect.left - offsetRect.left + offsetParent.scrollLeft,\n        top: nodeRect.top - offsetRect.top + offsetParent.scrollTop,\n        width: nodeRect.width,\n        height: nodeRect.height\n      };\n    },\n    offsetRect: function(element, offsetParent) {\n      return Util.clientRect(element, offsetParent, true);\n    },\n\n    floatingScrollbars: function() {\n      if (this.floatingScrollbars.cached === undefined) {\n        var tempNode = angular.element('<div style=\"z-index: -1; position: absolute; height: 1px; overflow-y: scroll\"><div style=\"height: 2px;\"></div></div>');\n        $document[0].body.appendChild(tempNode[0]);\n        this.floatingScrollbars.cached = (tempNode[0].offsetWidth == tempNode[0].childNodes[0].offsetWidth);\n        tempNode.remove();\n      }\n      return this.floatingScrollbars.cached;\n    },\n\n    // Mobile safari only allows you to set focus in click event listeners...\n    forceFocus: function(element) {\n      var node = element[0] || element;\n\n      document.addEventListener('click', function focusOnClick(ev) {\n        if (ev.target === node && ev.$focus) {\n          node.focus();\n          ev.stopImmediatePropagation();\n          ev.preventDefault();\n          node.removeEventListener('click', focusOnClick);\n        }\n      }, true);\n\n      var newEvent = document.createEvent('MouseEvents');\n      newEvent.initMouseEvent('click', false, true, window, {}, 0, 0, 0, 0,\n                       false, false, false, false, 0, null);\n      newEvent.$material = true;\n      newEvent.$focus = true;\n      node.dispatchEvent(newEvent);\n    },\n\n    transitionEndPromise: function(element) {\n      var deferred = $q.defer();\n      element.on($mdConstant.CSS.TRANSITIONEND, finished);\n      function finished(ev) {\n        // Make sure this transitionend didn't bubble up from a child\n        if (ev.target === element[0]) {\n          element.off($mdConstant.CSS.TRANSITIONEND, finished);\n          deferred.resolve();\n        }\n      }\n      return deferred.promise;\n    },\n\n    fakeNgModel: function() {\n      return {\n        $fake: true,\n        $setTouched : angular.noop,\n        $setViewValue: function(value) {\n          this.$viewValue = value;\n          this.$render(value);\n          this.$viewChangeListeners.forEach(function(cb) { cb(); });\n        },\n        $isEmpty: function(value) {\n          return (''+value).length === 0;\n        },\n        $parsers: [],\n        $formatters: [],\n        $viewChangeListeners: [],\n        $render: angular.noop\n      };\n    },\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds.\n    // @param wait Integer value of msecs to delay (since last debounce reset); default value 10 msecs\n    // @param invokeApply should the $timeout trigger $digest() dirty checking\n    debounce: function (func, wait, scope, invokeApply) {\n      var timer;\n\n      return function debounced() {\n        var context = scope,\n          args = Array.prototype.slice.call(arguments);\n\n        $timeout.cancel(timer);\n        timer = $timeout(function() {\n\n          timer = undefined;\n          func.apply(context, args);\n\n        }, wait || 10, invokeApply );\n      };\n    },\n\n    // Returns a function that can only be triggered every `delay` milliseconds.\n    // In other words, the function will not be called unless it has been more\n    // than `delay` milliseconds since the last call.\n    throttle: function throttle(func, delay) {\n      var recent;\n      return function throttled() {\n        var context = this;\n        var args = arguments;\n        var now = Util.now();\n\n        if (!recent || (now - recent > delay)) {\n          func.apply(context, args);\n          recent = now;\n        }\n      };\n    },\n\n    /**\n     * Measures the number of milliseconds taken to run the provided callback\n     * function. Uses a high-precision timer if available.\n     */\n    time: function time(cb) {\n      var start = Util.now();\n      cb();\n      return Util.now() - start;\n    },\n\n    /**\n     * nextUid, from angular.js.\n     * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\n     * characters such as '012ABC'. The reason why we are not using simply a number counter is that\n     * the number string gets longer over time, and it can also overflow, where as the nextId\n     * will grow much slower, it is a string, and it will never overflow.\n     *\n     * @returns an unique alpha-numeric string\n     */\n    nextUid: function() {\n      var index = nextUniqueId.length;\n      var digit;\n\n      while(index) {\n        index--;\n        digit = nextUniqueId[index].charCodeAt(0);\n        if (digit == 57 /*'9'*/) {\n          nextUniqueId[index] = 'A';\n          return nextUniqueId.join('');\n        }\n        if (digit == 90  /*'Z'*/) {\n          nextUniqueId[index] = '0';\n        } else {\n          nextUniqueId[index] = String.fromCharCode(digit + 1);\n          return nextUniqueId.join('');\n        }\n      }\n      nextUniqueId.unshift('0');\n      return nextUniqueId.join('');\n    },\n\n    // Stop watchers and events from firing on a scope without destroying it,\n    // by disconnecting it from its parent and its siblings' linked lists.\n    disconnectScope: function disconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't destroy the root scope or a scope that has been already destroyed\n      if (scope.$root === scope) return;\n      if (scope.$$destroyed ) return;\n\n      var parent = scope.$parent;\n      scope.$$disconnected = true;\n\n      // See Scope.$destroy\n      if (parent.$$childHead === scope) parent.$$childHead = scope.$$nextSibling;\n      if (parent.$$childTail === scope) parent.$$childTail = scope.$$prevSibling;\n      if (scope.$$prevSibling) scope.$$prevSibling.$$nextSibling = scope.$$nextSibling;\n      if (scope.$$nextSibling) scope.$$nextSibling.$$prevSibling = scope.$$prevSibling;\n\n      scope.$$nextSibling = scope.$$prevSibling = null;\n\n    },\n\n    // Undo the effects of disconnectScope above.\n    reconnectScope: function reconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't disconnect the root node or scope already disconnected\n      if (scope.$root === scope) return;\n      if (!scope.$$disconnected) return;\n\n      var child = scope;\n\n      var parent = child.$parent;\n      child.$$disconnected = false;\n      // See Scope.$new for this logic...\n      child.$$prevSibling = parent.$$childTail;\n      if (parent.$$childHead) {\n        parent.$$childTail.$$nextSibling = child;\n        parent.$$childTail = child;\n      } else {\n        parent.$$childHead = parent.$$childTail = child;\n      }\n    },\n  /*\n   * getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName\n   *\n   * @param el Element to start walking the DOM from\n   * @param tagName Tag name to find closest to el, such as 'form'\n   */\n    getClosest: function getClosest(el, tagName) {\n      tagName = tagName.toUpperCase();\n      do {\n        if (el.nodeName === tagName) {\n          return el;\n        }\n      } while (el = el.parentNode);\n      return null;\n    }\n  };\n\n}]);\n\n/*\n * Since removing jQuery from the demos, some code that uses `element.focus()` is broken.\n *\n * We need to add `element.focus()`, because it's testable unlike `element[0].focus`.\n *\n * TODO(ajoslin): This should be added in a better place later.\n */\n\nangular.element.prototype.focus = angular.element.prototype.focus || function() {\n  if (this.length) {\n    this[0].focus();\n  }\n  return this;\n};\nangular.element.prototype.blur = angular.element.prototype.blur || function() {\n  if (this.length) {\n    this[0].blur();\n  }\n  return this;\n};\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdAria', AriaService);\n\nfunction AriaService($$rAF, $log, $window) {\n\n  return {\n    expect: expect,\n    expectAsync: expectAsync,\n    expectWithText: expectWithText\n  };\n\n  /**\n   * Check if expected attribute has been specified on the target element or child\n   * @param element\n   * @param attrName\n   * @param {optional} defaultValue What to set the attr to if no value is found\n   */\n  function expect(element, attrName, defaultValue) {\n    var node = element[0];\n\n    if (!node.hasAttribute(attrName) && !childHasAttribute(node, attrName)) {\n\n      defaultValue = angular.isString(defaultValue) ? defaultValue.trim() : '';\n      if (defaultValue.length) {\n        element.attr(attrName, defaultValue);\n      } else {\n        $log.warn('ARIA: Attribute \"', attrName, '\", required for accessibility, is missing on node:', node);\n      }\n\n    }\n  }\n\n  function expectAsync(element, attrName, defaultValueGetter) {\n    // Problem: when retrieving the element's contents synchronously to find the label,\n    // the text may not be defined yet in the case of a binding.\n    // There is a higher chance that a binding will be defined if we wait one frame.\n    $$rAF(function() {\n      expect(element, attrName, defaultValueGetter());\n    });\n  }\n\n  function expectWithText(element, attrName) {\n    expectAsync(element, attrName, function() {\n      return getText(element);\n    });\n  }\n\n  function getText(element) {\n    return element.text().trim();\n  }\n\n  function childHasAttribute(node, attrName) {\n    var hasChildren = node.hasChildNodes(),\n        hasAttr = false;\n\n    function isHidden(el) {\n      var style = el.currentStyle ? el.currentStyle : $window.getComputedStyle(el);\n      return (style.display === 'none');\n    }\n\n    if(hasChildren) {\n      var children = node.childNodes;\n      for(var i=0; i<children.length; i++){\n        var child = children[i];\n        if(child.nodeType === 1 && child.hasAttribute(attrName)) {\n          if(!isHidden(child)){\n            hasAttr = true;\n          }\n        }\n      }\n    }\n    return hasAttr;\n  }\n}\nAriaService.$inject = [\"$$rAF\", \"$log\", \"$window\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdCompiler', mdCompilerService);\n\nfunction mdCompilerService($q, $http, $injector, $compile, $controller, $templateCache) {\n  /* jshint validthis: true */\n\n  /*\n   * @ngdoc service\n   * @name $mdCompiler\n   * @module material.core\n   * @description\n   * The $mdCompiler service is an abstraction of angular's compiler, that allows the developer\n   * to easily compile an element with a templateUrl, controller, and locals.\n   *\n   * @usage\n   * <hljs lang=\"js\">\n   * $mdCompiler.compile({\n   *   templateUrl: 'modal.html',\n   *   controller: 'ModalCtrl',\n   *   locals: {\n   *     modal: myModalInstance;\n   *   }\n   * }).then(function(compileData) {\n   *   compileData.element; // modal.html's template in an element\n   *   compileData.link(myScope); //attach controller & scope to element\n   * });\n   * </hljs>\n   */\n\n   /*\n    * @ngdoc method\n    * @name $mdCompiler#compile\n    * @description A helper to compile an HTML template/templateUrl with a given controller,\n    * locals, and scope.\n    * @param {object} options An options object, with the following properties:\n    *\n    *    - `controller` - `{(string=|function()=}` Controller fn that should be associated with\n    *      newly created scope or the name of a registered controller if passed as a string.\n    *    - `controllerAs` - `{string=}` A controller alias name. If present the controller will be\n    *      published to scope under the `controllerAs` name.\n    *    - `template` - `{string=}` An html template as a string.\n    *    - `templateUrl` - `{string=}` A path to an html template.\n    *    - `transformTemplate` - `{function(template)=}` A function which transforms the template after\n    *      it is loaded. It will be given the template string as a parameter, and should\n    *      return a a new string representing the transformed template.\n    *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n    *      be injected into the controller. If any of these dependencies are promises, the compiler\n    *      will wait for them all to be resolved, or if one is rejected before the controller is\n    *      instantiated `compile()` will fail..\n    *      * `key` - `{string}`: a name of a dependency to be injected into the controller.\n    *      * `factory` - `{string|function}`: If `string` then it is an alias for a service.\n    *        Otherwise if function, then it is injected and the return value is treated as the\n    *        dependency. If the result is a promise, it is resolved before its value is \n    *        injected into the controller.\n    *\n    * @returns {object=} promise A promise, which will be resolved with a `compileData` object.\n    * `compileData` has the following properties: \n    *\n    *   - `element` - `{element}`: an uncompiled element matching the provided template.\n    *   - `link` - `{function(scope)}`: A link function, which, when called, will compile\n    *     the element and instantiate the provided controller (if given).\n    *   - `locals` - `{object}`: The locals which will be passed into the controller once `link` is\n    *     called. If `bindToController` is true, they will be coppied to the ctrl instead\n    *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n    */\n  this.compile = function(options) {\n    var templateUrl = options.templateUrl;\n    var template = options.template || '';\n    var controller = options.controller;\n    var controllerAs = options.controllerAs;\n    var resolve = options.resolve || {};\n    var locals = options.locals || {};\n    var transformTemplate = options.transformTemplate || angular.identity;\n    var bindToController = options.bindToController;\n\n    // Take resolve values and invoke them.  \n    // Resolves can either be a string (value: 'MyRegisteredAngularConst'),\n    // or an invokable 'factory' of sorts: (value: function ValueGetter($dependency) {})\n    angular.forEach(resolve, function(value, key) {\n      if (angular.isString(value)) {\n        resolve[key] = $injector.get(value);\n      } else {\n        resolve[key] = $injector.invoke(value);\n      }\n    });\n    //Add the locals, which are just straight values to inject\n    //eg locals: { three: 3 }, will inject three into the controller\n    angular.extend(resolve, locals);\n\n    if (templateUrl) {\n      resolve.$template = $http.get(templateUrl, {cache: $templateCache})\n        .then(function(response) {\n          return response.data;\n        });\n    } else {\n      resolve.$template = $q.when(template);\n    }\n\n    // Wait for all the resolves to finish if they are promises\n    return $q.all(resolve).then(function(locals) {\n\n      var template = transformTemplate(locals.$template);\n      var element = options.element || angular.element('<div>').html(template.trim()).contents();\n      var linkFn = $compile(element);\n\n      //Return a linking function that can be used later when the element is ready\n      return {\n        locals: locals,\n        element: element,\n        link: function link(scope) {\n          locals.$scope = scope;\n\n          //Instantiate controller if it exists, because we have scope\n          if (controller) {\n            var ctrl = $controller(controller, locals);\n            if (bindToController) {\n              angular.extend(ctrl, locals);\n            }\n            //See angular-route source for this logic\n            element.data('$ngControllerController', ctrl);\n            element.children().data('$ngControllerController', ctrl);\n\n            if (controllerAs) {\n              scope[controllerAs] = ctrl;\n            }\n          }\n          return linkFn(scope);\n        }\n      };\n    });\n\n  };\n}\nmdCompilerService.$inject = [\"$q\", \"$http\", \"$injector\", \"$compile\", \"$controller\", \"$templateCache\"];\n})();\n\n(function() {\n'use strict';\n\n/*\n * TODO: Add support for multiple fingers on the `pointer` object (enables pinch gesture)\n */\n\nvar START_EVENTS = 'mousedown touchstart pointerdown';\nvar MOVE_EVENTS = 'mousemove touchmove pointermove';\nvar END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';\nvar HANDLERS;\n\ndocument.contains || (document.contains = function(node) {\n  return document.body.contains(node);\n});\n\n// TODO add windows phone to this\nvar userAgent = navigator.userAgent || navigator.vendor || window.opera;\nvar isIos = userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/iPod/i);\nvar isAndroid = userAgent.match(/Android/i);\nvar shouldHijackClicks = isIos || isAndroid;\n\nif (shouldHijackClicks) {\n  document.addEventListener('click', function(ev) {\n    // Space/enter on a button, and submit events, can send clicks\n    var isKeyClick = ev.clientX === 0 && ev.clientY === 0;\n    if (isKeyClick || ev.$material) return;\n\n    // Prevent clicks unless they're sent by material\n    ev.preventDefault();\n    ev.stopPropagation();\n  }, true);\n}\n\nangular.element(document)\n  .on(START_EVENTS, gestureStart)\n  .on(MOVE_EVENTS, gestureMove)\n  .on(END_EVENTS, gestureEnd)\n  // For testing\n  .on('$$mdGestureReset', function() {\n    lastPointer = pointer = null;\n  });\n\n// The state of the current and previous 'pointer' (user's hand)\nvar pointer, lastPointer;\n\nfunction runHandlers(handlerEvent, event) {\n  var handler;\n  for (var handlerName in HANDLERS) {\n    handler = HANDLERS[handlerName];\n    if (handlerEvent === 'start') {\n      // Run cancel to reset any handlers' state\n      handler.cancel();\n    }\n    handler[handlerEvent](event, pointer);\n  }\n}\n\nfunction gestureStart(ev) {\n  // If we're already touched down, abort\n  if (pointer) return;\n\n  var now = +Date.now();\n\n  // iOS & old android bug: after a touch event, a click event is sent 350 ms later.\n  // If <400ms have passed, don't allow an event of a different type than the previous event\n  if (lastPointer && !typesMatch(ev, lastPointer) && (now - lastPointer.endTime < 1500)) {\n    return;\n  }\n\n  pointer = makeStartPointer(ev);\n\n  runHandlers('start', ev);\n}\n\nfunction gestureMove(ev) {\n  if (!pointer || !typesMatch(ev, pointer)) return;\n\n  updatePointerState(ev, pointer);\n  runHandlers('move', ev);\n}\n\nfunction gestureEnd(ev) {\n  if (!pointer || !typesMatch(ev, pointer)) return;\n\n  updatePointerState(ev, pointer);\n  pointer.endTime = +Date.now();\n\n  runHandlers('end', ev);\n\n  lastPointer = pointer;\n  pointer = null;\n}\n\n/******** Helpers *********/\nfunction typesMatch(ev, pointer) {\n  return ev && pointer && ev.type.charAt(0) === pointer.type;\n}\n\nfunction getEventPoint(ev) {\n  ev = ev.originalEvent || ev; // support jQuery events\n  return (ev.touches && ev.touches[0]) ||\n    (ev.changedTouches && ev.changedTouches[0]) ||\n    ev;\n}\n\nfunction updatePointerState(ev, pointer) {\n  var point = getEventPoint(ev);\n  var x = pointer.x = point.pageX;\n  var y = pointer.y = point.pageY;\n\n  pointer.distanceX = x - pointer.startX;\n  pointer.distanceY = y - pointer.startY;\n  pointer.distance = Math.sqrt(\n    pointer.distanceX * pointer.distanceX + pointer.distanceY * pointer.distanceY\n  );\n\n  pointer.directionX = pointer.distanceX > 0 ? 'right' : pointer.distanceX < 0 ? 'left' : '';\n  pointer.directionY = pointer.distanceY > 0 ? 'up' : pointer.distanceY < 0 ? 'down' : '';\n\n  pointer.duration = +Date.now() - pointer.startTime;\n  pointer.velocityX = pointer.distanceX / pointer.duration;\n  pointer.velocityY = pointer.distanceY / pointer.duration;\n}\n\n\nfunction makeStartPointer(ev) {\n  var point = getEventPoint(ev);\n  var startPointer = {\n    startTime: +Date.now(),\n    target: ev.target,\n    // 'p' for pointer, 'm' for mouse, 't' for touch\n    type: ev.type.charAt(0)\n  };\n  startPointer.startX = startPointer.x = point.pageX;\n  startPointer.startY = startPointer.y = point.pageY;\n  return startPointer;\n}\n\nangular.module('material.core')\n.run([\"$mdGesture\", function($mdGesture) {}]) // make sure $mdGesture is always instantiated\n.factory('$mdGesture', [\"$$MdGestureHandler\", \"$$rAF\", \"$timeout\", function($$MdGestureHandler, $$rAF, $timeout) {\n  HANDLERS = {};\n\n  if (shouldHijackClicks) {\n    addHandler('click', {\n      options: {\n        maxDistance: 6\n      },\n      onEnd: function(ev, pointer) {\n        if (pointer.distance < this.state.options.maxDistance) {\n          this.dispatchEvent(ev, 'click');\n        }\n      }\n    });\n  }\n\n  addHandler('press', {\n    onStart: function(ev, pointer) {\n      this.dispatchEvent(ev, '$md.pressdown');\n    },\n    onEnd: function(ev, pointer) {\n      this.dispatchEvent(ev, '$md.pressup');\n    }\n  });\n\n\n  addHandler('hold', {\n    options: {\n      // If the user keeps his finger within the same <maxDistance> area for\n      // <delay> ms, dispatch a hold event.\n      maxDistance: 6,\n      delay: 500,\n    },\n    onCancel: function() {\n      $timeout.cancel(this.state.timeout);\n    },\n    onStart: function(ev, pointer) {\n      // For hold, require a parent to be registered with $mdGesture.register()\n      // Because we prevent scroll events, this is necessary.\n      if (!this.state.registeredParent) return this.cancel();\n\n      this.state.pos = {x: pointer.x, y: pointer.y};\n      this.state.timeout = $timeout(angular.bind(this, function holdDelayFn() {\n        this.dispatchEvent(ev, '$md.hold');\n        this.cancel(); //we're done!\n      }), this.state.options.delay, false);\n    },\n    onMove: function(ev, pointer) {\n      // Don't scroll while waiting for hold\n      ev.preventDefault();\n      var dx = this.state.pos.x - pointer.x;\n      var dy = this.state.pos.y - pointer.y;\n      if (Math.sqrt(dx*dx + dy*dy) > this.options.maxDistance) {\n        this.cancel();\n      }\n    },\n    onEnd: function(ev, pointer) {\n      this.onCancel();\n    },\n  });\n\n  addHandler('drag', {\n    options: {\n      minDistance: 6,\n      horizontal: true,\n    },\n    onStart: function(ev) {\n      // For drag, require a parent to be registered with $mdGesture.register()\n      if (!this.state.registeredParent) this.cancel();\n    },\n    onMove: function(ev, pointer) {\n      var shouldStartDrag, shouldCancel;\n      // Don't allow touch events to scroll while we're dragging or\n      // deciding if this touchmove is a proper drag\n      ev.preventDefault();\n\n      if (!this.state.dragPointer) {\n        if (this.state.options.horizontal) {\n          shouldStartDrag = Math.abs(pointer.distanceX) > this.state.options.minDistance;\n          shouldCancel = Math.abs(pointer.distanceY) > this.state.options.minDistance * 1.5;\n        } else {\n          shouldStartDrag = Math.abs(pointer.distanceY) > this.state.options.minDistance;\n          shouldCancel = Math.abs(pointer.distanceX) > this.state.options.minDistance * 1.5;\n        }\n\n        if (shouldStartDrag) {\n          // Create a new pointer, starting at this point where the drag started.\n          this.state.dragPointer = makeStartPointer(ev);\n          updatePointerState(ev, this.state.dragPointer);\n          this.dispatchEvent(ev, '$md.dragstart', this.state.dragPointer);\n\n        } else if (shouldCancel) {\n          this.cancel();\n        }\n      } else {\n        this.dispatchDragMove(ev);\n      }\n    },\n    // Only dispatch these every frame; any more is unnecessray\n    dispatchDragMove: $$rAF.throttle(function(ev) {\n      // Make sure the drag didn't stop while waiting for the next frame\n      if (this.state.isRunning) {\n        updatePointerState(ev, this.state.dragPointer);\n        this.dispatchEvent(ev, '$md.drag', this.state.dragPointer);\n      }\n    }),\n    onEnd: function(ev, pointer) {\n      if (this.state.dragPointer) {\n        updatePointerState(ev, this.state.dragPointer);\n        this.dispatchEvent(ev, '$md.dragend', this.state.dragPointer);\n      }\n    }\n  });\n\n  addHandler('swipe', {\n    options: {\n      minVelocity: 0.65,\n      minDistance: 10,\n    },\n    onEnd: function(ev, pointer) {\n      if (Math.abs(pointer.velocityX) > this.state.options.minVelocity &&\n          Math.abs(pointer.distanceX) > this.state.options.minDistance) {\n        var eventType = pointer.directionX == 'left' ? '$md.swipeleft' : '$md.swiperight';\n        this.dispatchEvent(ev, eventType);\n      }\n    }\n  });\n\n  var self;\n  return self = {\n    handler: addHandler,\n    register: register\n  };\n\n  function addHandler(name, definition) {\n    var handler = new $$MdGestureHandler(name);\n    angular.extend(handler, definition);\n    HANDLERS[name] = handler;\n    return self;\n  }\n\n  function register(element, handlerName, options) {\n    var handler = HANDLERS[ handlerName.replace(/^\\$md./, '') ];\n    if (!handler) {\n      throw new Error('Failed to register element with handler ' + handlerName + '. ' +\n                      'Available handlers: ' + Object.keys(HANDLERS).join(', '));\n    }\n    return handler.registerElement(element, options);\n  }\n}])\n.factory('$$MdGestureHandler', [\"$$rAF\", function($$rAF) {\n\n  function GestureHandler(name) {\n    this.name = name;\n    this.state = {};\n  }\n  GestureHandler.prototype = {\n    onStart: angular.noop,\n    onMove: angular.noop,\n    onEnd: angular.noop,\n    onCancel: angular.noop,\n    options: {},\n\n    dispatchEvent: typeof window.jQuery !== 'undefined' && angular.element === window.jQuery ?\n      jQueryDispatchEvent :\n      nativeDispatchEvent,\n\n    start: function(ev, pointer) {\n      if (this.state.isRunning) return;\n      var parentTarget = this.getNearestParent(ev.target);\n      var parentTargetOptions = parentTarget && parentTarget.$mdGesture[this.name] || {};\n\n      this.state = {\n        isRunning: true,\n        options: angular.extend({}, this.options, parentTargetOptions),\n        registeredParent: parentTarget\n      };\n      this.onStart(ev, pointer);\n    },\n    move: function(ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onMove(ev, pointer);\n    },\n    end: function(ev, pointer) {\n      if (!this.state.isRunning) return;\n      this.onEnd(ev, pointer);\n      this.state.isRunning = false;\n    },\n    cancel: function(ev, pointer) {\n      this.onCancel(ev, pointer);\n      this.state = {};\n    },\n\n    // Find and return the nearest parent element that has been registered via\n    // $mdGesture.register(element, 'handlerName').\n    getNearestParent: function(node) {\n      var current = node;\n      while (current) {\n        if ( (current.$mdGesture || {})[this.name] ) {\n          return current;\n        }\n        current = current.parentNode;\n      }\n    },\n\n    registerElement: function(element, options) {\n      var self = this;\n      element[0].$mdGesture = element[0].$mdGesture || {};\n      element[0].$mdGesture[this.name] = options || {};\n      element.on('$destroy', onDestroy);\n\n      return onDestroy;\n\n      function onDestroy() {\n        delete element[0].$mdGesture[self.name];\n        element.off('$destroy', onDestroy);\n      }\n    },\n  };\n\n  function jQueryDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj = new angular.element.Event(eventType)\n\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n\n    angular.extend(eventObj, {\n      clientX: eventPointer.x,\n      clientY: eventPointer.y,\n      screenX: eventPointer.x,\n      screenY: eventPointer.y,\n      pageX: eventPointer.x,\n      pageY: eventPointer.y,\n      ctrlKey: srcEvent.ctrlKey,\n      altKey: srcEvent.altKey,\n      shiftKey: srcEvent.shiftKey,\n      metaKey: srcEvent.metaKey\n    });\n    angular.element(eventPointer.target).trigger(eventObj);\n  }\n\n  /*\n   * NOTE: nativeDispatchEvent is very performance sensitive.\n   */\n  function nativeDispatchEvent(srcEvent, eventType, eventPointer) {\n    eventPointer = eventPointer || pointer;\n    var eventObj;\n\n    if (eventType === 'click') {\n      eventObj = document.createEvent('MouseEvents');\n      eventObj.initMouseEvent(\n        'click', true, true, window, srcEvent.detail,\n        eventPointer.x, eventPointer.y, eventPointer.x, eventPointer.y,\n        srcEvent.ctrlKey, srcEvent.altKey, srcEvent.shiftKey, srcEvent.metaKey,\n        srcEvent.button, srcEvent.relatedTarget || null\n      );\n\n    } else {\n      eventObj = document.createEvent('CustomEvent');\n      eventObj.initCustomEvent(eventType, true, true, {});\n    }\n    eventObj.$material = true;\n    eventObj.pointer = eventPointer;\n    eventObj.srcEvent = srcEvent;\n    eventPointer.target.dispatchEvent(eventObj);\n  }\n\n  return GestureHandler;\n}]);\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .provider('$$interimElement', InterimElementProvider);\n\n/*\n * @ngdoc service\n * @name $$interimElement\n * @module material.core\n *\n * @description\n *\n * Factory that contructs `$$interimElement.$service` services.\n * Used internally in material design for elements that appear on screen temporarily.\n * The service provides a promise-like API for interacting with the temporary\n * elements.\n *\n * ```js\n * app.service('$mdToast', function($$interimElement) {\n *   var $mdToast = $$interimElement(toastDefaultOptions);\n *   return $mdToast;\n * });\n * ```\n * @param {object=} defaultOptions Options used by default for the `show` method on the service.\n *\n * @returns {$$interimElement.$service}\n *\n */\n\nfunction InterimElementProvider() {\n  createInterimElementProvider.$get = InterimElementFactory;\n  InterimElementFactory.$inject = [\"$document\", \"$q\", \"$rootScope\", \"$timeout\", \"$rootElement\", \"$animate\", \"$interpolate\", \"$mdCompiler\", \"$mdTheming\"];\n  return createInterimElementProvider;\n\n  /**\n   * Returns a new provider which allows configuration of a new interimElement\n   * service. Allows configuration of default options & methods for options,\n   * as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)\n   */\n  function createInterimElementProvider(interimFactoryName) {\n    var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];\n\n    var customMethods = {};\n    var providerConfig = {\n      presets: {}\n    };\n\n    var provider = {\n      setDefaults: setDefaults,\n      addPreset: addPreset,\n      addMethod: addMethod,\n      $get: factory\n    };\n\n    /**\n     * all interim elements will come with the 'build' preset\n     */\n    provider.addPreset('build', {\n      methods: ['controller', 'controllerAs', 'resolve',\n        'template', 'templateUrl', 'themable', 'transformTemplate', 'parent']\n    });\n\n    factory.$inject = [\"$$interimElement\", \"$animate\", \"$injector\"];\n    return provider;\n\n    /**\n     * Save the configured defaults to be used when the factory is instantiated\n     */\n    function setDefaults(definition) {\n      providerConfig.optionsFactory = definition.options;\n      providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);\n      return provider;\n    }\n\n    /**\n     * Add a method to the factory that isn't specific to any interim element operations\n     */\n\n    function addMethod(name, fn) {\n      customMethods[name] = fn;\n      return provider;\n    }\n\n    /**\n     * Save the configured preset to be used when the factory is instantiated\n     */\n    function addPreset(name, definition) {\n      definition = definition || {};\n      definition.methods = definition.methods || [];\n      definition.options = definition.options || function() { return {}; };\n\n      if (/^cancel|hide|show$/.test(name)) {\n        throw new Error(\"Preset '\" + name + \"' in \" + interimFactoryName + \" is reserved!\");\n      }\n      if (definition.methods.indexOf('_options') > -1) {\n        throw new Error(\"Method '_options' in \" + interimFactoryName + \" is reserved!\");\n      }\n      providerConfig.presets[name] = {\n        methods: definition.methods.concat(EXPOSED_METHODS),\n        optionsFactory: definition.options,\n        argOption: definition.argOption\n      };\n      return provider;\n    }\n\n    /**\n     * Create a factory that has the given methods & defaults implementing interimElement\n     */\n    /* @ngInject */\n    function factory($$interimElement, $animate, $injector) {\n      var defaultMethods;\n      var defaultOptions;\n      var interimElementService = $$interimElement();\n\n      /*\n       * publicService is what the developer will be using.\n       * It has methods hide(), cancel(), show(), build(), and any other\n       * presets which were set during the config phase.\n       */\n      var publicService = {\n        hide: interimElementService.hide,\n        cancel: interimElementService.cancel,\n        show: showInterimElement\n      };\n\n      defaultMethods = providerConfig.methods || [];\n      // This must be invoked after the publicService is initialized\n      defaultOptions = invokeFactory(providerConfig.optionsFactory, {});\n\n      // Copy over the simple custom methods\n      angular.forEach(customMethods, function(fn, name) {\n        publicService[name] = fn;\n      });\n\n      angular.forEach(providerConfig.presets, function(definition, name) {\n        var presetDefaults = invokeFactory(definition.optionsFactory, {});\n        var presetMethods = (definition.methods || []).concat(defaultMethods);\n\n        // Every interimElement built with a preset has a field called `$type`,\n        // which matches the name of the preset.\n        // Eg in preset 'confirm', options.$type === 'confirm'\n        angular.extend(presetDefaults, { $type: name });\n\n        // This creates a preset class which has setter methods for every\n        // method given in the `.addPreset()` function, as well as every\n        // method given in the `.setDefaults()` function.\n        //\n        // @example\n        // .setDefaults({\n        //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n        //   options: dialogDefaultOptions\n        // })\n        // .addPreset('alert', {\n        //   methods: ['title', 'ok'],\n        //   options: alertDialogOptions\n        // })\n        //\n        // Set values will be passed to the options when interimElemnt.show() is called.\n        function Preset(opts) {\n          this._options = angular.extend({}, presetDefaults, opts);\n        }\n        angular.forEach(presetMethods, function(name) {\n          Preset.prototype[name] = function(value) {\n            this._options[name] = value;\n            return this;\n          };\n        });\n\n        // Create shortcut method for one-linear methods\n        if (definition.argOption) {\n          var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);\n          publicService[methodName] = function(arg) {\n            var config = publicService[name](arg);\n            return publicService.show(config);\n          };\n        }\n\n        // eg $mdDialog.alert() will return a new alert preset\n        publicService[name] = function(arg) {\n          // If argOption is supplied, eg `argOption: 'content'`, then we assume\n          // if the argument is not an options object then it is the `argOption` option.\n          //\n          // @example `$mdToast.simple('hello')` // sets options.content to hello\n          //                                     // because argOption === 'content'\n          if (arguments.length && definition.argOption && !angular.isObject(arg) &&\n              !angular.isArray(arg)) {\n            return (new Preset())[definition.argOption](arg);\n          } else {\n            return new Preset(arg);\n          }\n\n        };\n      });\n\n      return publicService;\n\n      function showInterimElement(opts) {\n        // opts is either a preset which stores its options on an _options field,\n        // or just an object made up of options\n        if (opts && opts._options) opts = opts._options;\n        return interimElementService.show(\n          angular.extend({}, defaultOptions, opts)\n        );\n      }\n\n      /**\n       * Helper to call $injector.invoke with a local of the factory name for\n       * this provider.\n       * If an $mdDialog is providing options for a dialog and tries to inject\n       * $mdDialog, a circular dependency error will happen.\n       * We get around that by manually injecting $mdDialog as a local.\n       */\n      function invokeFactory(factory, defaultVal) {\n        var locals = {};\n        locals[interimFactoryName] = publicService;\n        return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);\n      }\n\n    }\n\n  }\n\n  /* @ngInject */\n  function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate,\n                                 $interpolate, $mdCompiler, $mdTheming ) {\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        usesStandardSymbols = ((startSymbol === '{{') && (endSymbol === '}}')),\n        processTemplate  = usesStandardSymbols ? angular.identity : replaceInterpolationSymbols;\n\n    return function createInterimElementService() {\n      /*\n       * @ngdoc service\n       * @name $$interimElement.$service\n       *\n       * @description\n       * A service used to control inserting and removing an element into the DOM.\n       *\n       */\n      var stack = [];\n      var service;\n      return service = {\n        show: show,\n        hide: hide,\n        cancel: cancel\n      };\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#show\n       * @kind function\n       *\n       * @description\n       * Adds the `$interimElement` to the DOM and returns a promise that will be resolved or rejected\n       * with hide or cancel, respectively.\n       *\n       * @param {*} options is hashMap of settings\n       * @returns a Promise\n       *\n       */\n      function show(options) {\n        if (stack.length) {\n          return service.cancel().then(function() {\n            return show(options);\n          });\n        } else {\n          var interimElement = new InterimElement(options);\n          stack.push(interimElement);\n          return interimElement.show().then(function() {\n            return interimElement.deferred.promise;\n          });\n        }\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#hide\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and resolves the promise returned from `show`\n       *\n       * @param {*} resolveParam Data to resolve the promise with\n       * @returns a Promise that will be resolved after the element has been removed.\n       *\n       */\n      function hide(response) {\n        var interimElement = stack.shift();\n        return interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.resolve(response);\n        });\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#cancel\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and rejects the promise returned from `show`\n       *\n       * @param {*} reason Data to reject the promise with\n       * @returns Promise that will be resolved after the element has been removed.\n       *\n       */\n      function cancel(reason) {\n        var interimElement = stack.shift();\n        return $q.when(interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.reject(reason);\n        }));\n      }\n\n\n      /*\n       * Internal Interim Element Object\n       * Used internally to manage the DOM element and related data\n       */\n      function InterimElement(options) {\n        var self;\n        var hideTimeout, element, showDone, removeDone;\n\n        options = options || {};\n        options = angular.extend({\n          preserveScope: false,\n          scope: options.scope || $rootScope.$new(options.isolateScope),\n          onShow: function(scope, element, options) {\n            return $animate.enter(element, options.parent);\n          },\n          onRemove: function(scope, element, options) {\n            // Element could be undefined if a new element is shown before\n            // the old one finishes compiling.\n            return element && $animate.leave(element) || $q.when();\n          }\n        }, options);\n\n        if (options.template) {\n          options.template = processTemplate(options.template);\n        }\n\n        return self = {\n          options: options,\n          deferred: $q.defer(),\n          show: function() {\n            return showDone = $mdCompiler.compile(options).then(function(compileData) {\n              angular.extend(compileData.locals, self.options);\n\n              element = compileData.link(options.scope);\n\n              // Search for parent at insertion time, if not specified\n              if (angular.isFunction(options.parent)) {\n                options.parent = options.parent(options.scope, element, options);\n              } else if (angular.isString(options.parent)) {\n                options.parent = angular.element($document[0].querySelector(options.parent));\n              }\n\n              // If parent querySelector/getter function fails, or it's just null,\n              // find a default.\n              if (!(options.parent || {}).length) {\n                options.parent = $rootElement.find('body');\n                if (!options.parent.length) options.parent = $rootElement;\n              }\n\n              if (options.themable) $mdTheming(element);\n              var ret = options.onShow(options.scope, element, options);\n              return $q.when(ret)\n                .then(function(){\n                  // Issue onComplete callback when the `show()` finishes\n                  (options.onComplete || angular.noop)(options.scope, element, options);\n                  startHideTimeout();\n                });\n\n              function startHideTimeout() {\n                if (options.hideDelay) {\n                  hideTimeout = $timeout(service.cancel, options.hideDelay) ;\n                }\n              }\n            }, function(reason) { showDone = true; self.deferred.reject(reason); });\n          },\n          cancelTimeout: function() {\n            if (hideTimeout) {\n              $timeout.cancel(hideTimeout);\n              hideTimeout = undefined;\n            }\n          },\n          remove: function() {\n            self.cancelTimeout();\n            return removeDone = $q.when(showDone).then(function() {\n              var ret = element ? options.onRemove(options.scope, element, options) : true;\n              return $q.when(ret).then(function() {\n                if (!options.preserveScope) options.scope.$destroy();\n                removeDone = true;\n              });\n            });\n          }\n        };\n      }\n    };\n\n    /*\n     * Replace `{{` and `}}` in a string (usually a template) with the actual start-/endSymbols used\n     * for interpolation. This allows pre-defined templates (for components such as dialog, toast etc)\n     * to continue to work in apps that use custom interpolation start-/endSymbols.\n     *\n     * @param {string} text The text in which to replace `{{` / `}}`\n     * @returns {string} The modified string using the actual interpolation start-/endSymbols\n     */\n    function replaceInterpolationSymbols(text) {\n      if (!text || !angular.isString(text)) return text;\n      return text.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n    }\n  }\n\n}\n\n})();\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.core.componentRegistry\n   *\n   * @description\n   * A component instance registration service.\n   * Note: currently this as a private service in the SideNav component.\n   */\n  angular.module('material.core')\n    .factory('$mdComponentRegistry', ComponentRegistry);\n\n  /*\n   * @private\n   * @ngdoc factory\n   * @name ComponentRegistry\n   * @module material.core.componentRegistry\n   *\n   */\n  function ComponentRegistry($log, $q) {\n\n    var self;\n    var instances = [ ];\n    var pendings = { };\n\n    return self = {\n      /**\n       * Used to print an error when an instance for a handle isn't found.\n       */\n      notFoundError: function(handle) {\n        $log.error('No instance found for handle', handle);\n      },\n      /**\n       * Return all registered instances as an array.\n       */\n      getInstances: function() {\n        return instances;\n      },\n\n      /**\n       * Get a registered instance.\n       * @param handle the String handle to look up for a registered instance.\n       */\n      get: function(handle) {\n        if ( !isValidID(handle) ) return null;\n\n        var i, j, instance;\n        for(i = 0, j = instances.length; i < j; i++) {\n          instance = instances[i];\n          if(instance.$$mdHandle === handle) {\n            return instance;\n          }\n        }\n        return null;\n      },\n\n      /**\n       * Register an instance.\n       * @param instance the instance to register\n       * @param handle the handle to identify the instance under.\n       */\n      register: function(instance, handle) {\n        if ( !handle ) return angular.noop;\n\n        instance.$$mdHandle = handle;\n        instances.push(instance);\n        resolveWhen();\n\n        return deregister;\n\n        /**\n         * Remove registration for an instance\n         */\n        function deregister() {\n          var index = instances.indexOf(instance);\n          if (index !== -1) {\n            instances.splice(index, 1);\n          }\n        }\n\n        /**\n         * Resolve any pending promises for this instance\n         */\n        function resolveWhen() {\n          var dfd = pendings[handle];\n          if ( dfd ) {\n            dfd.resolve( instance );\n            delete pendings[handle];\n          }\n        }\n      },\n\n      /**\n       * Async accessor to registered component instance\n       * If not available then a promise is created to notify\n       * all listeners when the instance is registered.\n       */\n      when : function(handle) {\n        if ( isValidID(handle) ) {\n          var deferred = $q.defer();\n          var instance = self.get(handle);\n\n          if ( instance )  {\n            deferred.resolve( instance );\n          } else {\n            pendings[handle] = deferred;\n          }\n\n          return deferred.promise;\n        }\n        return $q.reject(\"Invalid `md-component-id` value.\");\n      }\n\n    };\n\n    function isValidID(handle){\n      return handle && (handle !== \"\");\n    }\n\n  }\n  ComponentRegistry.$inject = [\"$log\", \"$q\"];\n\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .factory('$mdInkRipple', InkRippleService)\n  .directive('mdInkRipple', InkRippleDirective)\n  .directive('mdNoInk', attrNoDirective())\n  .directive('mdNoBar', attrNoDirective())\n  .directive('mdNoStretch', attrNoDirective());\n\nfunction InkRippleDirective($mdInkRipple) {\n  return {\n    controller: angular.noop,\n    link: function (scope, element, attr) {\n      if (attr.hasOwnProperty('mdInkRippleCheckbox')) {\n        $mdInkRipple.attachCheckboxBehavior(scope, element);\n      } else {\n        $mdInkRipple.attachButtonBehavior(scope, element);\n      }\n    }\n  };\n}\nInkRippleDirective.$inject = [\"$mdInkRipple\"];\n\nfunction InkRippleService($window, $timeout) {\n\n  return {\n    attachButtonBehavior: attachButtonBehavior,\n    attachCheckboxBehavior: attachCheckboxBehavior,\n    attachTabBehavior: attachTabBehavior,\n    attach: attach\n  };\n\n  function attachButtonBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      isFAB: element.hasClass('md-fab'),\n      isMenuItem: element.hasClass('md-menu-item'),\n      center: false,\n      dimBackground: true\n    }, options));\n  }\n\n  function attachCheckboxBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: true,\n      dimBackground: false,\n      fitRipple: true\n    }, options));\n  }\n\n  function attachTabBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: false,\n      dimBackground: true,\n      outline: true\n    }, options));\n  }\n\n  function attach(scope, element, options) {\n    if (element.controller('mdNoInk')) return angular.noop;\n\n    options = angular.extend({\n      colorElement: element,\n      mousedown: true,\n      hover: true,\n      focus: true,\n      center: false,\n      mousedownPauseTime: 150,\n      dimBackground: false,\n      outline: false,\n      isFAB: false,\n      isMenuItem: false,\n      fitRipple: false\n    }, options);\n\n    var rippleSize,\n        controller = element.controller('mdInkRipple') || {},\n        counter = 0,\n        ripples = [],\n        states = [],\n        isActiveExpr = element.attr('md-highlight'),\n        isActive = false,\n        isHeld = false,\n        node = element[0],\n        rippleSizeSetting = element.attr('md-ripple-size'),\n        color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n    switch (rippleSizeSetting) {\n      case 'full':\n        options.isFAB = true;\n        break;\n      case 'partial':\n        options.isFAB = false;\n        break;\n    }\n\n    // expose onInput for ripple testing\n    if (options.mousedown) {\n      element.on('$md.pressdown', onPressDown)\n        .on('$md.pressup', onPressUp);\n    }\n\n    controller.createRipple = createRipple;\n\n    if (isActiveExpr) {\n      scope.$watch(isActiveExpr, function watchActive(newValue) {\n        isActive = newValue;\n        if (isActive && !ripples.length) {\n          $timeout(function () { createRipple(0, 0); }, 0, false);\n        }\n        angular.forEach(ripples, updateElement);\n      });\n    }\n\n    // Publish self-detach method if desired...\n    return function detach() {\n      element.off('$md.pressdown', onPressDown)\n        .off('$md.pressup', onPressUp);\n      getRippleContainer().remove();\n    };\n\n    /**\n     * Gets the current ripple container\n     * If there is no ripple container, it creates one and returns it\n     *\n     * @returns {angular.element} ripple container element\n     */\n    function getRippleContainer() {\n      var container = element.data('$mdRippleContainer');\n      if (container) return container;\n      container = angular.element('<div class=\"md-ripple-container\">');\n      element.append(container);\n      element.data('$mdRippleContainer', container);\n      return container;\n    }\n\n    function parseColor(color) {\n      if (!color) return;\n      if (color.indexOf('rgba') === 0) return color.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/, '0.1)');\n      if (color.indexOf('rgb')  === 0) return rgbToRGBA(color);\n      if (color.indexOf('#')    === 0) return hexToRGBA(color);\n\n      /**\n       * Converts a hex value to an rgba string\n       *\n       * @param {string} hex value (3 or 6 digits) to be converted\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function hexToRGBA(color) {\n        var hex = color.charAt(0) === '#' ? color.substr(1) : color,\n          dig = hex.length / 3,\n          red = hex.substr(0, dig),\n          grn = hex.substr(dig, dig),\n          blu = hex.substr(dig * 2);\n        if (dig === 1) {\n          red += red;\n          grn += grn;\n          blu += blu;\n        }\n        return 'rgba(' + parseInt(red, 16) + ',' + parseInt(grn, 16) + ',' + parseInt(blu, 16) + ',0.1)';\n      }\n\n      /**\n       * Converts rgb value to rgba string\n       *\n       * @param {string} rgb color string\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function rgbToRGBA(color) {\n        return color.replace(')', ', 0.1)').replace('(', 'a(');\n      }\n\n    }\n\n    function removeElement(elem, wait) {\n      ripples.splice(ripples.indexOf(elem), 1);\n      if (ripples.length === 0) {\n        getRippleContainer().css({ backgroundColor: '' });\n      }\n      $timeout(function () { elem.remove(); }, wait, false);\n    }\n\n    function updateElement(elem) {\n      var index = ripples.indexOf(elem),\n          state = states[index] || {},\n          elemIsActive = ripples.length > 1 ? false : isActive,\n          elemIsHeld   = ripples.length > 1 ? false : isHeld;\n      if (elemIsActive || state.animating || elemIsHeld) {\n        elem.addClass('md-ripple-visible');\n      } else if (elem) {\n        elem.removeClass('md-ripple-visible');\n        if (options.outline) {\n          elem.css({\n            width: rippleSize + 'px',\n            height: rippleSize + 'px',\n            marginLeft: (rippleSize * -1) + 'px',\n            marginTop: (rippleSize * -1) + 'px'\n          });\n        }\n        removeElement(elem, options.outline ? 450 : 650);\n      }\n    }\n\n    /**\n     * Creates a ripple at the provided coordinates\n     *\n     * @param {number} left cursor position\n     * @param {number} top cursor position\n     *\n     * @returns {angular.element} the generated ripple element\n     */\n    function createRipple(left, top) {\n\n      color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n      var container = getRippleContainer(),\n          size = getRippleSize(left, top),\n          css = getRippleCss(size, left, top),\n          elem = getRippleElement(css),\n          index = ripples.indexOf(elem),\n          state = states[index] || {};\n\n      rippleSize = size;\n\n      state.animating = true;\n\n      $timeout(function () {\n        if (options.dimBackground) {\n          container.css({ backgroundColor: color });\n        }\n        elem.addClass('md-ripple-placed md-ripple-scaled');\n        if (options.outline) {\n          elem.css({\n            borderWidth: (size * 0.5) + 'px',\n            marginLeft: (size * -0.5) + 'px',\n            marginTop: (size * -0.5) + 'px'\n          });\n        } else {\n          elem.css({ left: '50%', top: '50%' });\n        }\n        updateElement(elem);\n        $timeout(function () {\n          state.animating = false;\n          updateElement(elem);\n        }, (options.outline ? 450 : 225), false);\n      }, 0, false);\n\n      return elem;\n\n      /**\n       * Creates the ripple element with the provided css\n       *\n       * @param {object} css properties to be applied\n       *\n       * @returns {angular.element} the generated ripple element\n       */\n      function getRippleElement(css) {\n        var elem = angular.element('<div class=\"md-ripple\" data-counter=\"' + counter++ + '\">');\n        ripples.unshift(elem);\n        states.unshift({ animating: true });\n        container.append(elem);\n        css && elem.css(css);\n        return elem;\n      }\n\n      /**\n       * Calculate the ripple size\n       *\n       * @returns {number} calculated ripple diameter\n       */\n      function getRippleSize(left, top) {\n        var width = container.prop('offsetWidth'),\n            height = container.prop('offsetHeight'),\n            multiplier, size, rect;\n        if (options.isMenuItem) {\n          size = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else if (options.outline) {\n          rect = node.getBoundingClientRect();\n          left -= rect.left;\n          top -= rect.top;\n          width = Math.max(left, width - left);\n          height = Math.max(top, height - top);\n          size = 2 * Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else {\n          multiplier = options.isFAB ? 1.1 : 0.8;\n          size = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) * multiplier;\n          if (options.fitRipple) {\n            size = Math.min(height, width, size);\n          }\n        }\n        return size;\n      }\n\n      /**\n       * Generates the ripple css\n       *\n       * @param {number} the diameter of the ripple\n       * @param {number} the left cursor offset\n       * @param {number} the top cursor offset\n       *\n       * @returns {{backgroundColor: *, width: string, height: string, marginLeft: string, marginTop: string}}\n       */\n      function getRippleCss(size, left, top) {\n        var rect,\n            css = {\n              backgroundColor: rgbaToRGB(color),\n              borderColor: rgbaToRGB(color),\n              width: size + 'px',\n              height: size + 'px'\n            };\n\n        if (options.outline) {\n          css.width = 0;\n          css.height = 0;\n        } else {\n          css.marginLeft = css.marginTop = (size * -0.5) + 'px';\n        }\n\n        if (options.center) {\n          css.left = css.top = '50%';\n        } else {\n          rect = node.getBoundingClientRect();\n          css.left = Math.round((left - rect.left) / container.prop('offsetWidth') * 100) + '%';\n          css.top = Math.round((top - rect.top) / container.prop('offsetHeight') * 100) + '%';\n        }\n\n        return css;\n\n        /**\n         * Converts rgba string to rgb, removing the alpha value\n         *\n         * @param {string} rgba color\n         *\n         * @returns {string} rgb color\n         */\n        function rgbaToRGB(color) {\n          return color.replace('rgba', 'rgb').replace(/,[^\\)\\,]+\\)/, ')');\n        }\n      }\n    }\n\n    /**\n     * Handles user input start and stop events\n     *\n     */\n    function onPressDown(ev) {\n      if (!isRippleAllowed()) return;\n\n      var ripple = createRipple(ev.pointer.x, ev.pointer.y);\n      isHeld = true;\n    }\n    function onPressUp(ev) {\n      isHeld = false;\n      var ripple = ripples[ ripples.length - 1 ];\n      $timeout(function () { updateElement(ripple); }, 0, false);\n    }\n\n    /**\n     * Determines if the ripple is allowed\n     *\n     * @returns {boolean} true if the ripple is allowed, false if not\n     */\n    function isRippleAllowed() {\n      var parent = node.parentNode;\n      var grandparent = parent && parent.parentNode;\n      var ancestor = grandparent && grandparent.parentNode;\n      return !isDisabled(node) && !isDisabled(parent) && !isDisabled(grandparent) && !isDisabled(ancestor);\n      function isDisabled (elem) {\n        return elem && elem.hasAttribute && elem.hasAttribute('disabled');\n      }\n    }\n\n  }\n}\nInkRippleService.$inject = [\"$window\", \"$timeout\"];\n\n/**\n * noink/nobar/nostretch directive: make any element that has one of\n * these attributes be given a controller, so that other directives can\n * `require:` these and see if there is a `no<xxx>` parent attribute.\n *\n * @usage\n * <hljs lang=\"html\">\n * <parent md-no-ink>\n *   <child detect-no>\n *   </child>\n * </parent>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * myApp.directive('detectNo', function() {\n *   return {\n *     require: ['^?mdNoInk', ^?mdNoBar'],\n *     link: function(scope, element, attr, ctrls) {\n *       var noinkCtrl = ctrls[0];\n *       var nobarCtrl = ctrls[1];\n *       if (noInkCtrl) {\n *         alert(\"the md-no-ink flag has been specified on an ancestor!\");\n *       }\n *       if (nobarCtrl) {\n *         alert(\"the md-no-bar flag has been specified on an ancestor!\");\n *       }\n *     }\n *   };\n * });\n * </hljs>\n */\nfunction attrNoDirective() {\n  return function() {\n    return {\n      controller: angular.noop\n    };\n  };\n}\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core.theming.palette', [])\n.constant('$mdColorPalette', {\n  'red': {\n    '50': '#ffebee',\n    '100': '#ffcdd2',\n    '200': '#ef9a9a',\n    '300': '#e57373',\n    '400': '#ef5350',\n    '500': '#f44336',\n    '600': '#e53935',\n    '700': '#d32f2f',\n    '800': '#c62828',\n    '900': '#b71c1c',\n    'A100': '#ff8a80',\n    'A200': '#ff5252',\n    'A400': '#ff1744',\n    'A700': '#d50000',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n  },\n  'pink': {\n    '50': '#fce4ec',\n    '100': '#f8bbd0',\n    '200': '#f48fb1',\n    '300': '#f06292',\n    '400': '#ec407a',\n    '500': '#e91e63',\n    '600': '#d81b60',\n    '700': '#c2185b',\n    '800': '#ad1457',\n    '900': '#880e4f',\n    'A100': '#ff80ab',\n    'A200': '#ff4081',\n    'A400': '#f50057',\n    'A700': '#c51162',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 A200 A400 A700'\n  },\n  'purple': {\n    '50': '#f3e5f5',\n    '100': '#e1bee7',\n    '200': '#ce93d8',\n    '300': '#ba68c8',\n    '400': '#ab47bc',\n    '500': '#9c27b0',\n    '600': '#8e24aa',\n    '700': '#7b1fa2',\n    '800': '#6a1b9a',\n    '900': '#4a148c',\n    'A100': '#ea80fc',\n    'A200': '#e040fb',\n    'A400': '#d500f9',\n    'A700': '#aa00ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400 A700'\n  },\n  'deep-purple': {\n    '50': '#ede7f6',\n    '100': '#d1c4e9',\n    '200': '#b39ddb',\n    '300': '#9575cd',\n    '400': '#7e57c2',\n    '500': '#673ab7',\n    '600': '#5e35b1',\n    '700': '#512da8',\n    '800': '#4527a0',\n    '900': '#311b92',\n    'A100': '#b388ff',\n    'A200': '#7c4dff',\n    'A400': '#651fff',\n    'A700': '#6200ea',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200'\n  },\n  'indigo': {\n    '50': '#e8eaf6',\n    '100': '#c5cae9',\n    '200': '#9fa8da',\n    '300': '#7986cb',\n    '400': '#5c6bc0',\n    '500': '#3f51b5',\n    '600': '#3949ab',\n    '700': '#303f9f',\n    '800': '#283593',\n    '900': '#1a237e',\n    'A100': '#8c9eff',\n    'A200': '#536dfe',\n    'A400': '#3d5afe',\n    'A700': '#304ffe',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100',\n    'contrastStrongLightColors': '300 400 A200 A400'\n  },\n  'blue': {\n    '50': '#e3f2fd',\n    '100': '#bbdefb',\n    '200': '#90caf9',\n    '300': '#64b5f6',\n    '400': '#42a5f5',\n    '500': '#2196f3',\n    '600': '#1e88e5',\n    '700': '#1976d2',\n    '800': '#1565c0',\n    '900': '#0d47a1',\n    'A100': '#82b1ff',\n    'A200': '#448aff',\n    'A400': '#2979ff',\n    'A700': '#2962ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '100 200 300 400 A100',\n    'contrastStrongLightColors': '500 600 700 A200 A400 A700'\n  },\n  'light-blue': {\n    '50': '#e1f5fe',\n    '100': '#b3e5fc',\n    '200': '#81d4fa',\n    '300': '#4fc3f7',\n    '400': '#29b6f6',\n    '500': '#03a9f4',\n    '600': '#039be5',\n    '700': '#0288d1',\n    '800': '#0277bd',\n    '900': '#01579b',\n    'A100': '#80d8ff',\n    'A200': '#40c4ff',\n    'A400': '#00b0ff',\n    'A700': '#0091ea',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900 A700',\n    'contrastStrongLightColors': '500 600 700 800 A700'\n  },\n  'cyan': {\n    '50': '#e0f7fa',\n    '100': '#b2ebf2',\n    '200': '#80deea',\n    '300': '#4dd0e1',\n    '400': '#26c6da',\n    '500': '#00bcd4',\n    '600': '#00acc1',\n    '700': '#0097a7',\n    '800': '#00838f',\n    '900': '#006064',\n    'A100': '#84ffff',\n    'A200': '#18ffff',\n    'A400': '#00e5ff',\n    'A700': '#00b8d4',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700 800'\n  },\n  'teal': {\n    '50': '#e0f2f1',\n    '100': '#b2dfdb',\n    '200': '#80cbc4',\n    '300': '#4db6ac',\n    '400': '#26a69a',\n    '500': '#009688',\n    '600': '#00897b',\n    '700': '#00796b',\n    '800': '#00695c',\n    '900': '#004d40',\n    'A100': '#a7ffeb',\n    'A200': '#64ffda',\n    'A400': '#1de9b6',\n    'A700': '#00bfa5',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'green': {\n    '50': '#e8f5e9',\n    '100': '#c8e6c9',\n    '200': '#a5d6a7',\n    '300': '#81c784',\n    '400': '#66bb6a',\n    '500': '#4caf50',\n    '600': '#43a047',\n    '700': '#388e3c',\n    '800': '#2e7d32',\n    '900': '#1b5e20',\n    'A100': '#b9f6ca',\n    'A200': '#69f0ae',\n    'A400': '#00e676',\n    'A700': '#00c853',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900',\n    'contrastStrongLightColors': '500 600 700'\n  },\n  'light-green': {\n    '50': '#f1f8e9',\n    '100': '#dcedc8',\n    '200': '#c5e1a5',\n    '300': '#aed581',\n    '400': '#9ccc65',\n    '500': '#8bc34a',\n    '600': '#7cb342',\n    '700': '#689f38',\n    '800': '#558b2f',\n    '900': '#33691e',\n    'A100': '#ccff90',\n    'A200': '#b2ff59',\n    'A400': '#76ff03',\n    'A700': '#64dd17',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900',\n    'contrastStrongLightColors': '800 900'\n  },\n  'lime': {\n    '50': '#f9fbe7',\n    '100': '#f0f4c3',\n    '200': '#e6ee9c',\n    '300': '#dce775',\n    '400': '#d4e157',\n    '500': '#cddc39',\n    '600': '#c0ca33',\n    '700': '#afb42b',\n    '800': '#9e9d24',\n    '900': '#827717',\n    'A100': '#f4ff81',\n    'A200': '#eeff41',\n    'A400': '#c6ff00',\n    'A700': '#aeea00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '900',\n    'contrastStrongLightColors': '900'\n  },\n  'yellow': {\n    '50': '#fffde7',\n    '100': '#fff9c4',\n    '200': '#fff59d',\n    '300': '#fff176',\n    '400': '#ffee58',\n    '500': '#ffeb3b',\n    '600': '#fdd835',\n    '700': '#fbc02d',\n    '800': '#f9a825',\n    '900': '#f57f17',\n    'A100': '#ffff8d',\n    'A200': '#ffff00',\n    'A400': '#ffea00',\n    'A700': '#ffd600',\n    'contrastDefaultColor': 'dark'\n  },\n  'amber': {\n    '50': '#fff8e1',\n    '100': '#ffecb3',\n    '200': '#ffe082',\n    '300': '#ffd54f',\n    '400': '#ffca28',\n    '500': '#ffc107',\n    '600': '#ffb300',\n    '700': '#ffa000',\n    '800': '#ff8f00',\n    '900': '#ff6f00',\n    'A100': '#ffe57f',\n    'A200': '#ffd740',\n    'A400': '#ffc400',\n    'A700': '#ffab00',\n    'contrastDefaultColor': 'dark'\n  },\n  'orange': {\n    '50': '#fff3e0',\n    '100': '#ffe0b2',\n    '200': '#ffcc80',\n    '300': '#ffb74d',\n    '400': '#ffa726',\n    '500': '#ff9800',\n    '600': '#fb8c00',\n    '700': '#f57c00',\n    '800': '#ef6c00',\n    '900': '#e65100',\n    'A100': '#ffd180',\n    'A200': '#ffab40',\n    'A400': '#ff9100',\n    'A700': '#ff6d00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900',\n    'contrastStrongLightColors': '800 900'\n  },\n  'deep-orange': {\n    '50': '#fbe9e7',\n    '100': '#ffccbc',\n    '200': '#ffab91',\n    '300': '#ff8a65',\n    '400': '#ff7043',\n    '500': '#ff5722',\n    '600': '#f4511e',\n    '700': '#e64a19',\n    '800': '#d84315',\n    '900': '#bf360c',\n    'A100': '#ff9e80',\n    'A200': '#ff6e40',\n    'A400': '#ff3d00',\n    'A700': '#dd2c00',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100 A200',\n    'contrastStrongLightColors': '500 600 700 800 900 A400 A700'\n  },\n  'brown': {\n    '50': '#efebe9',\n    '100': '#d7ccc8',\n    '200': '#bcaaa4',\n    '300': '#a1887f',\n    '400': '#8d6e63',\n    '500': '#795548',\n    '600': '#6d4c41',\n    '700': '#5d4037',\n    '800': '#4e342e',\n    '900': '#3e2723',\n    'A100': '#d7ccc8',\n    'A200': '#bcaaa4',\n    'A400': '#8d6e63',\n    'A700': '#5d4037',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200',\n    'contrastStrongLightColors': '300 400'\n  },\n  'grey': {\n    '0': '#ffffff',\n    '50': '#fafafa',\n    '100': '#f5f5f5',\n    '200': '#eeeeee',\n    '300': '#e0e0e0',\n    '400': '#bdbdbd',\n    '500': '#9e9e9e',\n    '600': '#757575',\n    '700': '#616161',\n    '800': '#424242',\n    '900': '#212121',\n    '1000': '#000000',\n    'A100': '#ffffff',\n    'A200': '#eeeeee',\n    'A400': '#bdbdbd',\n    'A700': '#616161',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '600 700 800 900'\n  },\n  'blue-grey': {\n    '50': '#eceff1',\n    '100': '#cfd8dc',\n    '200': '#b0bec5',\n    '300': '#90a4ae',\n    '400': '#78909c',\n    '500': '#607d8b',\n    '600': '#546e7a',\n    '700': '#455a64',\n    '800': '#37474f',\n    '900': '#263238',\n    'A100': '#cfd8dc',\n    'A200': '#b0bec5',\n    'A400': '#78909c',\n    'A700': '#455a64',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300',\n    'contrastStrongLightColors': '400 500'\n  }\n});\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core.theming', ['material.core.theming.palette'])\n  .directive('mdTheme', ThemingDirective)\n  .directive('mdThemable', ThemableDirective)\n  .provider('$mdTheming', ThemingProvider)\n  .run(generateThemes);\n\n/**\n * @ngdoc provider\n * @name $mdThemingProvider\n * @module material.core\n *\n * @description Provider to configure the `$mdTheming` service.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#setDefaultTheme\n * @param {string} themeName Default theme name to be applied to elements. Default value is `default`.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#alwaysWatchTheme\n * @param {boolean} watch Whether or not to always watch themes for changes and re-apply\n * classes when they change. Default is `false`. Enabling can reduce performance.\n */\n\n// In memory storage of defined themes and color palettes (both loaded by CSS, and user specified)\nvar PALETTES;\nvar THEMES;\nvar themingProvider;\nvar generationIsDone;\n\nvar DARK_FOREGROUND = {\n  name: 'dark',\n  '1': 'rgba(0,0,0,0.87)',\n  '2': 'rgba(0,0,0,0.54)',\n  '3': 'rgba(0,0,0,0.26)',\n  '4': 'rgba(0,0,0,0.12)'\n};\nvar LIGHT_FOREGROUND = {\n  name: 'light',\n  '1': 'rgba(255,255,255,1.0)',\n  '2': 'rgba(255,255,255,0.7)',\n  '3': 'rgba(255,255,255,0.3)',\n  '4': 'rgba(255,255,255,0.12)'\n};\n\nvar DARK_SHADOW = '1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)';\nvar LIGHT_SHADOW = '';\n\nvar DARK_CONTRAST_COLOR = colorToRgbaArray('rgba(0,0,0,0.87)');\nvar LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgba(255,255,255,0.87');\nvar STRONG_LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgb(255,255,255)');\n\nvar THEME_COLOR_TYPES = ['primary', 'accent', 'warn', 'background'];\nvar DEFAULT_COLOR_TYPE = 'primary';\n\n// A color in a theme will use these hues by default, if not specified by user.\nvar LIGHT_DEFAULT_HUES = {\n  'accent': {\n    'default': 'A200',\n    'hue-1': 'A100',\n    'hue-2': 'A400',\n    'hue-3': 'A700'\n  }\n};\nvar DARK_DEFAULT_HUES = {\n  'background': {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '600',\n    'hue-3': '800'\n  }\n};\nTHEME_COLOR_TYPES.forEach(function(colorType) {\n  // Color types with unspecified default hues will use these default hue values\n  var defaultDefaultHues = {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '800',\n    'hue-3': 'A100'\n  };\n  if (!LIGHT_DEFAULT_HUES[colorType]) LIGHT_DEFAULT_HUES[colorType] = defaultDefaultHues;\n  if (!DARK_DEFAULT_HUES[colorType]) DARK_DEFAULT_HUES[colorType] = defaultDefaultHues;\n});\n\nvar VALID_HUE_VALUES = [\n  '50', '100', '200', '300', '400', '500', '600',\n  '700', '800', '900', 'A100', 'A200', 'A400', 'A700'\n];\n\nfunction ThemingProvider($mdColorPalette) {\n  PALETTES = {};\n  THEMES = {};\n  var defaultTheme = 'default';\n  var alwaysWatchTheme = false;\n\n  // Load JS Defined Palettes\n  angular.extend(PALETTES, $mdColorPalette);\n\n  // Default theme defined in core.js\n\n  ThemingService.$inject = [\"$rootScope\", \"$log\"];\n  return themingProvider = {\n    definePalette: definePalette,\n    extendPalette: extendPalette,\n    theme: registerTheme,\n\n    setDefaultTheme: function(theme) {\n      defaultTheme = theme;\n    },\n    alwaysWatchTheme: function(alwaysWatch) {\n      alwaysWatchTheme = alwaysWatch;\n    },\n    $get: ThemingService,\n    _LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,\n    _DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,\n    _PALETTES: PALETTES,\n    _THEMES: THEMES,\n    _parseRules: parseRules,\n    _rgba: rgba\n  };\n\n  // Example: $mdThemingProvider.definePalette('neonRed', { 50: '#f5fafa', ... });\n  function definePalette(name, map) {\n    map = map || {};\n    PALETTES[name] = checkPaletteValid(name, map);\n    return themingProvider;\n  }\n\n  // Returns an new object which is a copy of a given palette `name` with variables from\n  // `map` overwritten\n  // Example: var neonRedMap = $mdThemingProvider.extendPalette('red', { 50: '#f5fafafa' });\n  function extendPalette(name, map) {\n    return checkPaletteValid(name,  angular.extend({}, PALETTES[name] || {}, map) );\n  }\n\n  // Make sure that palette has all required hues\n  function checkPaletteValid(name, map) {\n    var missingColors = VALID_HUE_VALUES.filter(function(field) {\n      return !map[field];\n    });\n    if (missingColors.length) {\n      throw new Error(\"Missing colors %1 in palette %2!\"\n                      .replace('%1', missingColors.join(', '))\n                      .replace('%2', name));\n    }\n\n    return map;\n  }\n\n  // Register a theme (which is a collection of color palettes to use with various states\n  // ie. warn, accent, primary )\n  // Optionally inherit from an existing theme\n  // $mdThemingProvider.theme('custom-theme').primaryPalette('red');\n  function registerTheme(name, inheritFrom) {\n    inheritFrom = inheritFrom || 'default';\n    if (THEMES[name]) return THEMES[name];\n\n    var parentTheme = typeof inheritFrom === 'string' ? THEMES[inheritFrom] : inheritFrom;\n    var theme = new Theme(name);\n\n    if (parentTheme) {\n      angular.forEach(parentTheme.colors, function(color, colorType) {\n        theme.colors[colorType] = {\n          name: color.name,\n          // Make sure a COPY of the hues is given to the child color,\n          // not the same reference.\n          hues: angular.extend({}, color.hues)\n        };\n      });\n    }\n    THEMES[name] = theme;\n\n    return theme;\n  }\n\n  function Theme(name) {\n    var self = this;\n    self.name = name;\n    self.colors = {};\n\n    self.dark = setDark;\n    setDark(false);\n\n    function setDark(isDark) {\n      isDark = arguments.length === 0 ? true : !!isDark;\n\n      // If no change, abort\n      if (isDark === self.isDark) return;\n\n      self.isDark = isDark;\n\n      self.foregroundPalette = self.isDark ? LIGHT_FOREGROUND : DARK_FOREGROUND;\n      self.foregroundShadow = self.isDark ? DARK_SHADOW : LIGHT_SHADOW;\n      \n      // Light and dark themes have different default hues.\n      // Go through each existing color type for this theme, and for every\n      // hue value that is still the default hue value from the previous light/dark setting,\n      // set it to the default hue value from the new light/dark setting.\n      var newDefaultHues = self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES;\n      var oldDefaultHues = self.isDark ? LIGHT_DEFAULT_HUES : DARK_DEFAULT_HUES;\n      angular.forEach(newDefaultHues, function(newDefaults, colorType) {\n        var color = self.colors[colorType];\n        var oldDefaults = oldDefaultHues[colorType];\n        if (color) {\n          for (var hueName in color.hues) {\n            if (color.hues[hueName] === oldDefaults[hueName]) {\n              color.hues[hueName] = newDefaults[hueName];\n            }\n          }\n        }\n      });\n\n      return self;\n    }\n\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      var defaultHues = (self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES)[colorType];\n      self[colorType + 'Palette'] = function setPaletteType(paletteName, hues) {\n        var color = self.colors[colorType] = {\n          name: paletteName,\n          hues: angular.extend({}, defaultHues, hues)\n        };\n\n        Object.keys(color.hues).forEach(function(name) {\n          if (!defaultHues[name]) {\n            throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\"\n              .replace('%1', name)\n              .replace('%2', self.name)\n              .replace('%3', paletteName)\n              .replace('%4', Object.keys(defaultHues).join(', '))\n            );\n          }\n        });\n        Object.keys(color.hues).map(function(key) {\n          return color.hues[key];\n        }).forEach(function(hueValue) {\n          if (VALID_HUE_VALUES.indexOf(hueValue) == -1) {\n            throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\"\n              .replace('%1', hueValue)\n              .replace('%2', self.name)\n              .replace('%3', colorType)\n              .replace('%4', paletteName)\n              .replace('%5', VALID_HUE_VALUES.join(', '))\n            );\n          }\n        });\n        return self;\n      };\n\n      self[colorType + 'Color'] = function() {\n        var args = Array.prototype.slice.call(arguments);\n        console.warn('$mdThemingProviderTheme.' + colorType + 'Color() has been deprecated. ' +\n                     'Use $mdThemingProviderTheme.' + colorType + 'Palette() instead.');\n        return self[colorType + 'Palette'].apply(self, args);\n      };\n    });\n  }\n\n  /**\n   * @ngdoc service\n   * @name $mdTheming\n   *\n   * @description\n   *\n   * Service that makes an element apply theming related classes to itself.\n   *\n   * ```js\n   * app.directive('myFancyDirective', function($mdTheming) {\n   *   return {\n   *     restrict: 'e',\n   *     link: function(scope, el, attrs) {\n   *       $mdTheming(el);\n   *     }\n   *   };\n   * });\n   * ```\n   * @param {el=} element to apply theming to\n   */\n  /* @ngInject */\n  function ThemingService($rootScope, $log) {\n    applyTheme.inherit = function(el, parent) {\n      var ctrl = parent.controller('mdTheme');\n\n      var attrThemeValue = el.attr('md-theme-watch');\n      if ( (alwaysWatchTheme || angular.isDefined(attrThemeValue)) && attrThemeValue != 'false') {\n        var deregisterWatch = $rootScope.$watch(function() {\n          return ctrl && ctrl.$mdTheme || defaultTheme;\n        }, changeTheme);\n        el.on('$destroy', deregisterWatch);\n      } else {\n        var theme = ctrl && ctrl.$mdTheme || defaultTheme;\n        changeTheme(theme);\n      }\n\n      function changeTheme(theme) {\n        if (!registered(theme)) {\n          $log.warn('Attempted to use unregistered theme \\'' + theme + '\\'. ' +\n                    'Register it with $mdThemingProvider.theme().');\n        }\n        var oldTheme = el.data('$mdThemeName');\n        if (oldTheme) el.removeClass('md-' + oldTheme +'-theme');\n        el.addClass('md-' + theme + '-theme');\n        el.data('$mdThemeName', theme);\n      }\n    };\n\n    applyTheme.registered = registered;\n    applyTheme.defaultTheme = function() {\n      return defaultTheme;\n    };\n\n    return applyTheme;\n\n    function registered(theme) {\n      if (theme === undefined || theme === '') return true;\n      return THEMES[theme] !== undefined;\n    }\n\n    function applyTheme(scope, el) {\n      // Allow us to be invoked via a linking function signature.\n      if (el === undefined) {\n        el = scope;\n        scope = undefined;\n      }\n      if (scope === undefined) {\n        scope = $rootScope;\n      }\n      applyTheme.inherit(el, el);\n    }\n  }\n}\nThemingProvider.$inject = [\"$mdColorPalette\"];\n\nfunction ThemingDirective($mdTheming, $interpolate, $log) {\n  return {\n    priority: 100,\n    link: {\n      pre: function(scope, el, attrs) {\n        var ctrl = {\n          $setTheme: function(theme) {\n            if (!$mdTheming.registered(theme)) {\n              $log.warn('attempted to use unregistered theme \\'' + theme + '\\'');\n            }\n            ctrl.$mdTheme = theme;\n          }\n        };\n        el.data('$mdThemeController', ctrl);\n        ctrl.$setTheme($interpolate(attrs.mdTheme)(scope));\n        attrs.$observe('mdTheme', ctrl.$setTheme);\n      }\n    }\n  };\n}\nThemingDirective.$inject = [\"$mdTheming\", \"$interpolate\", \"$log\"];\n\nfunction ThemableDirective($mdTheming) {\n  return $mdTheming;\n}\nThemableDirective.$inject = [\"$mdTheming\"];\n\nfunction parseRules(theme, colorType, rules) {\n  checkValidPalette(theme, colorType);\n\n  rules = rules.replace(/THEME_NAME/g, theme.name);\n  var generatedRules = [];\n  var color = theme.colors[colorType];\n\n  var themeNameRegex = new RegExp('.md-' + theme.name + '-theme', 'g');\n  // Matches '{{ primary-color }}', etc\n  var hueRegex = new RegExp('(\\'|\")?{{\\\\s*(' + colorType + ')-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|\\')?','g');\n  var simpleVariableRegex = /'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow)-?(\\d\\.?\\d*)?\\s*\\}\\}'?\"?/g;\n  var palette = PALETTES[color.name];\n\n  // find and replace simple variables where we use a specific hue, not angentire palette\n  // eg. \"{{primary-100}}\"\n  //\\(' + THEME_COLOR_TYPES.join('\\|') + '\\)'\n  rules = rules.replace(simpleVariableRegex, function(match, colorType, hue, opacity) {\n    if (colorType === 'foreground') {\n      if (hue == 'shadow') {\n        return theme.foregroundShadow;\n      } else {\n        return theme.foregroundPalette[hue] || theme.foregroundPalette['1'];\n      }\n    }\n    if (hue.indexOf('hue') === 0) {\n      hue = theme.colors[colorType].hues[hue];\n    }\n    return rgba( (PALETTES[ theme.colors[colorType].name ][hue] || '').value, opacity );\n  });\n\n  // For each type, generate rules for each hue (ie. default, md-hue-1, md-hue-2, md-hue-3)\n  angular.forEach(color.hues, function(hueValue, hueName) {\n    var newRule = rules\n      .replace(hueRegex, function(match, _, colorType, hueType, opacity) {\n        return rgba(palette[hueValue][hueType === 'color' ? 'value' : 'contrast'], opacity);\n      });\n    if (hueName !== 'default') {\n      newRule = newRule.replace(themeNameRegex, '.md-' + theme.name + '-theme.md-' + hueName);\n    }\n    generatedRules.push(newRule);\n  });\n\n  return generatedRules.join('');\n}\n\n// Generate our themes at run time given the state of THEMES and PALETTES\nfunction generateThemes($injector) {\n  var themeCss = $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';\n\n  // MD_THEME_CSS is a string generated by the build process that includes all the themable\n  // components as templates\n\n  // Expose contrast colors for palettes to ensure that text is always readable\n  angular.forEach(PALETTES, sanitizePalette);\n\n  // Break the CSS into individual rules\n  var rules = themeCss.split(/\\}(?!(\\}|'|\"|;))/)\n    .filter(function(rule) { return rule && rule.length; })\n    .map(function(rule) { return rule.trim() + '}'; });\n\n  var rulesByType = {};\n  THEME_COLOR_TYPES.forEach(function(type) {\n    rulesByType[type] = '';\n  });\n  var ruleMatchRegex = new RegExp('md-(' + THEME_COLOR_TYPES.join('|') + ')', 'g');\n\n  // Sort the rules based on type, allowing us to do color substitution on a per-type basis\n  rules.forEach(function(rule) {\n    var match = rule.match(ruleMatchRegex);\n    // First: test that if the rule has '.md-accent', it goes into the accent set of rules\n    for (var i = 0, type; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf('.md-' + type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // If no eg 'md-accent' class is found, try to just find 'accent' in the rule and guess from\n    // there\n    for (i = 0; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf(type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // Default to the primary array\n    return rulesByType[DEFAULT_COLOR_TYPE] += rule;\n  });\n\n  var styleString = '';\n\n  // For each theme, use the color palettes specified for `primary`, `warn` and `accent`\n  // to generate CSS rules.\n  angular.forEach(THEMES, function(theme) {\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      styleString += parseRules(theme, colorType, rulesByType[colorType] + '');\n    });\n    if (theme.colors.primary.name == theme.colors.accent.name) {\n      console.warn(\"$mdThemingProvider: Using the same palette for primary and\" +\n                   \" accent. This violates the material design spec.\");\n    }\n  });\n\n  // Insert our newly minted styles into the DOM\n  if (!generationIsDone) {\n    var style = document.createElement('style');\n    style.innerHTML = styleString;\n    var head = document.getElementsByTagName('head')[0];\n    head.insertBefore(style, head.firstElementChild);\n    generationIsDone = true;\n  }\n\n  // The user specifies a 'default' contrast color as either light or dark,\n  // then explicitly lists which hues are the opposite contrast (eg. A100 has dark, A200 has light)\n  function sanitizePalette(palette) {\n    var defaultContrast = palette.contrastDefaultColor;\n    var lightColors = palette.contrastLightColors || [];\n    var strongLightColors = palette.contrastStrongLightColors || [];\n    var darkColors = palette.contrastDarkColors || [];\n\n    // These colors are provided as space-separated lists\n    if (typeof lightColors === 'string') lightColors = lightColors.split(' ');\n    if (typeof strongLightColors === 'string') strongLightColors = strongLightColors.split(' ');\n    if (typeof darkColors === 'string') darkColors = darkColors.split(' ');\n\n    // Cleanup after ourselves\n    delete palette.contrastDefaultColor;\n    delete palette.contrastLightColors;\n    delete palette.contrastStrongLightColors;\n    delete palette.contrastDarkColors;\n\n    // Change { 'A100': '#fffeee' } to { 'A100': { value: '#fffeee', contrast:DARK_CONTRAST_COLOR }\n    angular.forEach(palette, function(hueValue, hueName) {\n      if (angular.isObject(hueValue)) return; // Already converted\n      // Map everything to rgb colors\n      var rgbValue = colorToRgbaArray(hueValue);\n      if (!rgbValue) {\n        throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\"\n                        .replace('%1', hueValue)\n                        .replace('%2', palette.name)\n                        .replace('%3', hueName));\n      }\n\n      palette[hueName] = {\n        value: rgbValue,\n        contrast: getContrastColor()\n      };\n      function getContrastColor() {\n        if (defaultContrast === 'light') {\n          if (darkColors.indexOf(hueName) > -1) {\n            return DARK_CONTRAST_COLOR;\n          } else {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR \n              : LIGHT_CONTRAST_COLOR;\n          }\n        } else {\n          if (lightColors.indexOf(hueName) > -1) {\n            return strongLightColors.indexOf(hueName) > -1 ? STRONG_LIGHT_CONTRAST_COLOR \n              : LIGHT_CONTRAST_COLOR;\n          } else {\n            return DARK_CONTRAST_COLOR;\n          }\n        }\n      }\n    });\n  }\n\n}\ngenerateThemes.$inject = [\"$injector\"];\n\nfunction checkValidPalette(theme, colorType) {\n  // If theme attempts to use a palette that doesnt exist, throw error\n  if (!PALETTES[ (theme.colors[colorType] || {}).name ]) {\n    throw new Error(\n      \"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\"\n                    .replace('%1', theme.name)\n                    .replace('%2', colorType)\n                    .replace('%3', Object.keys(PALETTES).join(', '))\n    );\n  }\n}\n\nfunction colorToRgbaArray(clr) {\n  if (angular.isArray(clr) && clr.length == 3) return clr;\n  if (/^rgb/.test(clr)) {\n    return clr.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g, '').split(',').map(function(value, i) {\n      return i == 3 ? parseFloat(value, 10) : parseInt(value, 10);\n    });\n  }\n  if (clr.charAt(0) == '#') clr = clr.substring(1);\n  if (!/^([a-fA-F0-9]{3}){1,2}$/g.test(clr)) return;\n\n  var dig = clr.length / 3;\n  var red = clr.substr(0, dig);\n  var grn = clr.substr(dig, dig);\n  var blu = clr.substr(dig * 2);\n  if (dig === 1) {\n    red += red;\n    grn += grn;\n    blu += blu;\n  }\n  return [parseInt(red, 16), parseInt(grn, 16), parseInt(blu, 16)];\n}\n\nfunction rgba(rgbArray, opacity) {\n  if (rgbArray.length == 4) {\n    rgbArray = angular.copy(rgbArray);\n    opacity ? rgbArray.pop() : opacity = rgbArray.pop();\n  }\n  return opacity && (typeof opacity == 'number' || (typeof opacity == 'string' && opacity.length)) ?\n    'rgba(' + rgbArray.join(',') + ',' + opacity + ')' :\n    'rgb(' + rgbArray.join(',') + ')';\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/core/default-theme.js",
    "content": "angular.module(\"material.core\").constant(\"$MD_THEME_CSS\", \"md-autocomplete {  background: '{{background-50}}'; }  md-autocomplete button md-icon path {    fill: '{{background-600}}'; }  md-autocomplete button:after {    background: '{{background-600-0.3}}'; }  md-autocomplete ul {    background: '{{background-50}}'; }    md-autocomplete ul li {      border-top: 1px solid '{{background-400}}';      color: '{{background-900}}'; }      md-autocomplete ul li .highlight {        color: '{{background-600}}'; }      md-autocomplete ul li:hover, md-autocomplete ul li.selected {        background: '{{background-200}}'; }md-backdrop.md-opaque.md-THEME_NAME-theme {  background-color: '{{foreground-4-0.5}}'; }md-bottom-sheet.md-THEME_NAME-theme {  background-color: '{{background-50}}';  border-top-color: '{{background-300}}'; }  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {    color: '{{foreground-1}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    background-color: '{{background-50}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    color: '{{foreground-1}}'; }md-toolbar .md-button.md-THEME_NAME-theme.md-fab {  background-color: white; }.md-button.md-THEME_NAME-theme {  border-radius: 3px; }  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {    background-color: '{{background-500-0.2}}'; }  .md-button.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {      color: '{{primary-contrast}}';      background-color: '{{primary-color}}'; }      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {        background-color: '{{primary-600}}'; }  .md-button.md-THEME_NAME-theme.md-fab {    border-radius: 50%;    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {      background-color: '{{accent-A700}}'; }  .md-button.md-THEME_NAME-theme.md-raised {    color: '{{background-contrast}}';    background-color: '{{background-50}}'; }    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {      background-color: '{{background-200}}'; }  .md-button.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {      color: '{{warn-contrast}}';      background-color: '{{warn-color}}'; }      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {        background-color: '{{warn-700}}'; }  .md-button.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {      color: '{{accent-contrast}}';      background-color: '{{accent-color}}'; }      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {        background-color: '{{accent-700}}'; }  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {    color: '{{foreground-3}}';    background-color: transparent;    cursor: not-allowed; }md-card.md-THEME_NAME-theme {  border-radius: 2px; }  md-card.md-THEME_NAME-theme .md-card-image {    border-radius: 2px 2px 0 0; }md-checkbox.md-THEME_NAME-theme .md-ripple {  color: '{{accent-600}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon {  background-color: '{{accent-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {  color: '{{primary-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {  background-color: '{{primary-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {  color: '{{warn-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {  background-color: '{{warn-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme[disabled] .md-icon {  border-color: '{{foreground-3}}'; }md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {  background-color: '{{foreground-3}}'; }md-content.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-dialog.md-THEME_NAME-theme {  border-radius: 4px;  background-color: '{{background-hue-3}}'; }  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {    border-top-color: '{{foreground-4}}'; }md-divider.md-THEME_NAME-theme {  border-top-color: '{{foreground-4}}'; }md-icon.md-THEME_NAME-theme.md-primary {  color: '{{primary-color}}'; }md-icon.md-THEME_NAME-theme.md-accent {  color: '{{accent-color}}'; }md-icon.md-THEME_NAME-theme.md-warn {  color: '{{warn-color}}'; }md-icon.md-THEME_NAME-theme.md-danger {  color: '{{danger-color}}'; }md-input-container.md-THEME_NAME-theme .md-input {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}';  text-shadow: '{{foreground-shadow}}'; }  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {  color: '{{foreground-2}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {  border-color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {  color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {  border-color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {  border-bottom-color: transparent;  color: '{{foreground-3}}';  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);  background-image: -ms-linear-gradient(left, transparent 0%, '{{foreground-4}}' 100%); }md-progress-circular.md-THEME_NAME-theme {  background-color: transparent; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {    border-top-color: '{{primary-color}}';    border-bottom-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-top-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-right-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {    border-left-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {    border-top-color: '{{warn-color}}';    border-bottom-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-top-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-right-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {    border-left-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {    border-top-color: '{{accent-color}}';    border-bottom-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-top-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-right-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {    border-left-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme .md-container {  background-color: '{{primary-100}}'; }md-progress-linear.md-THEME_NAME-theme .md-bar {  background-color: '{{primary-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-container {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {  background-color: '{{warn-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-container {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {  background-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }md-radio-button.md-THEME_NAME-theme .md-off {  border-color: '{{foreground-2}}'; }md-radio-button.md-THEME_NAME-theme .md-on {  background-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-off {  border-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {  color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme .md-container .md-ripple {  color: '{{accent-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {  background-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {  border-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {  color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {  color: '{{primary-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {  background-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {  border-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {  color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {  color: '{{warn-600}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {  border-color: '{{foreground-3}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {  border-color: '{{foreground-3}}'; }md-radio-group.md-THEME_NAME-theme:focus:not(:empty) {  border-color: '{{foreground-1}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label {  border-bottom-color: '{{primary-color}}';  color: '{{ foreground-1 }}'; }  md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label.md-placeholder {    color: '{{ foreground-1 }}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-label {  border-bottom-color: '{{accent-color}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-label {  border-bottom-color: '{{warn-color}}'; }md-select.md-THEME_NAME-theme[disabled] .md-select-label {  color: '{{foreground-3}}'; }  md-select.md-THEME_NAME-theme[disabled] .md-select-label.md-placeholder {    color: '{{foreground-3}}'; }md-select.md-THEME_NAME-theme .md-select-label {  border-bottom-color: '{{foreground-4}}'; }  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {    color: '{{foreground-2}}'; }md-select-menu.md-THEME_NAME-theme md-optgroup {  color: '{{foreground-2}}'; }  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {    color: '{{foreground-1}}'; }md-select-menu.md-THEME_NAME-theme md-option[selected] {  background-color: '{{primary-50}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {    background-color: '{{primary-100}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {    background-color: '{{accent-50}}'; }    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {      background-color: '{{accent-100}}'; }md-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {  background: '{{background-200}}'; }md-sidenav.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track {  background-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme .md-track-ticks {  background-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-focus-thumb {  background-color: '{{foreground-2}}'; }md-slider.md-THEME_NAME-theme .md-focus-ring {  border-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-disabled-thumb {  border-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme.md-min .md-thumb:after {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track.md-track-fill {  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb:after {  border-color: '{{accent-color}}';  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-sign {  background-color: '{{accent-color}}'; }  md-slider.md-THEME_NAME-theme .md-sign:after {    border-top-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb-text {  color: '{{accent-contrast}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {  border-color: '{{warn-color}}';  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-sign {  background-color: '{{warn-color}}'; }  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {    border-top-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {  color: '{{warn-contrast}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {  border-color: '{{primary-color}}';  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-sign {  background-color: '{{primary-color}}'; }  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {    border-top-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {  color: '{{primary-contrast}}'; }md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {  border-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {  background-color: '{{foreground-3}}'; }.md-subheader.md-THEME_NAME-theme {  color: '{{ foreground-2-0.23 }}';  background-color: '{{background-hue-3}}'; }  .md-subheader.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme .md-thumb {  background-color: '{{background-50}}'; }md-switch.md-THEME_NAME-theme .md-bar {  background-color: '{{background-500}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-thumb {  background-color: '{{accent-color}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-bar {  background-color: '{{accent-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {  background-color: '{{primary-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {  background-color: '{{primary-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {  background-color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {  background-color: '{{warn-color-0.5}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-thumb {  background-color: '{{background-400}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-bar {  background-color: '{{foreground-4}}'; }md-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {  border-color: '{{foreground-1}}';  border-style: dotted; }md-tabs.md-THEME_NAME-theme .md-header {  background-color: transparent; }md-tabs.md-THEME_NAME-theme .md-paginator md-icon {  color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent .md-header {  background-color: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {  color: '{{accent-100}}'; }  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {    color: '{{accent-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary .md-header {  background-color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {    color: '{{primary-contrast}}';    background-color: '{{primary-contrast-0.1}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {    color: '{{primary-contrast}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-warn .md-header {  background-color: '{{warn-color}}'; }md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {  color: '{{warn-100}}'; }  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {    color: '{{warn-contrast}}'; }md-tabs.md-THEME_NAME-theme md-tabs-ink-bar {  color: '{{accent-color}}';  background: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme md-tab {  color: '{{foreground-2}}'; }  md-tabs.md-THEME_NAME-theme md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme md-tab:focus {    color: '{{foreground-1}}'; }  md-tabs.md-THEME_NAME-theme md-tab.active {    color: '{{primary-color}}'; }  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {    color: '{{accent-100}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  text-shadow: '{{foreground-shadow}}'; }  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme label {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {  border-color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused label {  color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {  border-color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {  color: '{{foreground-2}}'; }md-input-group.md-THEME_NAME-theme .md-input[disabled] {  border-bottom-color: '{{foreground-4}}';  color: '{{foreground-3}}'; }md-toast.md-THEME_NAME-theme {  background-color: '{{foreground-1}}';  color: '{{background-50}}'; }  md-toast.md-THEME_NAME-theme .md-button {    color: '{{background-50}}'; }    md-toast.md-THEME_NAME-theme .md-button.md-highlight {      color: '{{primary-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {        color: '{{accent-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {        color: '{{warn-A200}}'; }md-toolbar.md-THEME_NAME-theme {  background-color: '{{primary-color}}';  color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme .md-button {    color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-accent {    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-warn {    background-color: '{{warn-color}}';    color: '{{warn-contrast}}'; }md-tooltip.md-THEME_NAME-theme {  color: '{{background-A100}}'; }  md-tooltip.md-THEME_NAME-theme .md-background {    background-color: '{{foreground-2}}'; }\");"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/dialog/dialog-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-dialog.md-THEME_NAME-theme {\n  border-radius: 4px;\n  background-color: '{{background-hue-3}}'; }\n  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {\n    border-top-color: '{{foreground-4}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/dialog/dialog.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n.md-dialog-container {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 80; }\n\nmd-dialog {\n  opacity: 0;\n  min-width: 240px;\n  max-width: 80%;\n  max-height: 80%;\n  position: relative;\n  overflow: hidden;\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2);\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-dialog.transition-in {\n    opacity: 1;\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0) scale(1);\n            transform: translate3d(0, 0, 0) scale(1); }\n  md-dialog.transition-out {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 100%, 0) scale(0.2);\n            transform: translate3d(0, 100%, 0) scale(0.2); }\n  md-dialog md-content {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 24px;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch; }\n    md-dialog md-content:not([layout=row]) > *:first-child:not(.md-subheader) {\n      margin-top: 0px; }\n  md-dialog .md-actions {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    box-sizing: border-box;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end;\n    padding: 16px 16px;\n    min-height: 40px; }\n    md-dialog .md-actions > * {\n      margin-left: 8px; }\n  md-dialog.md-content-overflow .md-actions {\n    border-top: 1px solid; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/dialog/dialog.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.dialog');\ngoog.require('ng.material.components.backdrop');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.dialog\n */\nangular.module('material.components.dialog', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdDialog', MdDialogDirective)\n  .provider('$mdDialog', MdDialogProvider);\n\nfunction MdDialogDirective($$rAF, $mdTheming) {\n  return {\n    restrict: 'E',\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n      $$rAF(function() {\n        var content = element[0].querySelector('md-content');\n        if (content && content.scrollHeight > content.clientHeight) {\n          element.addClass('md-content-overflow');\n        }\n      });\n    }\n  };\n}\nMdDialogDirective.$inject = [\"$$rAF\", \"$mdTheming\"];\n\n/**\n * @ngdoc service\n * @name $mdDialog\n * @module material.components.dialog\n *\n * @description\n * `$mdDialog` opens a dialog over the app to inform users about critical information or require\n *  them to make decisions. There are two approaches for setup: a simple promise API\n *  and regular object syntax.\n *\n * ## Restrictions\n *\n * - The dialog is always given an isolate scope.\n * - The dialog's template must have an outer `<md-dialog>` element.\n *   Inside, use an `<md-content>` element for the dialog's content, and use\n *   an element with class `md-actions` for the dialog's actions.\n *\n * @usage\n * ### HTML\n *\n * <hljs lang=\"html\">\n * <div  ng-app=\"demoApp\" ng-controller=\"EmployeeController\">\n *   <md-button ng-click=\"showAlert()\" class=\"md-raised md-warn\">\n *     Employee Alert!\n *   </md-button>\n *   <md-button ng-click=\"showDialog($event)\" class=\"md-raised\">\n *     Custom Dialog\n *   </md-button>\n *   <md-button ng-click=\"closeAlert()\" ng-disabled=\"!hasAlert()\" class=\"md-raised\">\n *     Close Alert\n *   </md-button>\n *   <md-button ng-click=\"showGreeting($event)\" class=\"md-raised md-primary\" >\n *     Greet Employee\n *   </md-button>\n * </div>\n * </hljs>\n *\n * ### JavaScript: object syntax\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *    .module('demoApp', ['ngMaterial'])\n *    .controller('AppCtrl', AppController);\n *\n *   function AppController($scope, $mdDialog) {\n *     var alert;\n *     $scope.showAlert = showAlert;\n *     $scope.showDialog = showDialog;\n *     $scope.items = [1, 2, 3];\n *\n *     // Internal method\n *     function showAlert() {\n *       alert = $mdDialog.alert({\n *         title: 'Attention',\n *         content: 'This is an example of how easy dialogs can be!',\n *         ok: 'Close'\n *       });\n *\n *       $mdDialog\n *         .show( alert )\n *         .finally(function() {\n *           alert = undefined;\n *         });\n *     }\n *\n *     function showDialog($event) {\n *        var parentEl = angular.element(document.body);\n *        $mdDialog.show({\n *          parent: parentEl,\n *          targetEvent: $event,\n *          template:\n *            '<md-dialog aria-label=\"List dialog\">' +\n *            '  <md-content>'+\n *            '    <md-list>'+\n *            '      <md-item ng-repeat=\"item in items\">'+\n *            '       <p>Number {{item}}</p>' +\n *            '      </md-item>'+\n *            '    </md-list>'+\n *            '  </md-content>' +\n *            '  <div class=\"md-actions\">' +\n *            '    <md-button ng-click=\"closeDialog()\">' +\n *            '      Close Dialog' +\n *            '    </md-button>' +\n *            '  </div>' +\n *            '</md-dialog>',\n *          locals: {\n *            items: $scope.items\n *          },\n *          controller: DialogController\n *       });\n *       function DialogController(scope, $mdDialog, items) {\n *         scope.items = items;\n *         scope.closeDialog = function() {\n *           $mdDialog.hide();\n *         }\n *       }\n *     }\n *\n * })(angular);\n * </hljs>\n *\n * ### JavaScript: promise API syntax, custom dialog template\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *     .module('demoApp', ['ngMaterial'])\n *     .controller('EmployeeController', EmployeeEditor)\n *     .controller('GreetingController', GreetingController);\n *\n *   // Fictitious Employee Editor to show how to use simple and complex dialogs.\n *\n *   function EmployeeEditor($scope, $mdDialog) {\n *     var alert;\n *\n *     $scope.showAlert = showAlert;\n *     $scope.closeAlert = closeAlert;\n *     $scope.showGreeting = showCustomGreeting;\n *\n *     $scope.hasAlert = function() { return !!alert };\n *     $scope.userName = $scope.userName || 'Bobby';\n *\n *     // Dialog #1 - Show simple alert dialog and cache\n *     // reference to dialog instance\n *\n *     function showAlert() {\n *       alert = $mdDialog.alert()\n *         .title('Attention, ' + $scope.userName)\n *         .content('This is an example of how easy dialogs can be!')\n *         .ok('Close');\n *\n *       $mdDialog\n *           .show( alert )\n *           .finally(function() {\n *             alert = undefined;\n *           });\n *     }\n *\n *     // Close the specified dialog instance and resolve with 'finished' flag\n *     // Normally this is not needed, just use '$mdDialog.hide()' to close\n *     // the most recent dialog popup.\n *\n *     function closeAlert() {\n *       $mdDialog.hide( alert, \"finished\" );\n *       alert = undefined;\n *     }\n *\n *     // Dialog #2 - Demonstrate more complex dialogs construction and popup.\n *\n *     function showCustomGreeting($event) {\n *         $mdDialog.show({\n *           targetEvent: $event,\n *           template:\n *             '<md-dialog>' +\n *\n *             '  <md-content>Hello {{ employee }}!</md-content>' +\n *\n *             '  <div class=\"md-actions\">' +\n *             '    <md-button ng-click=\"closeDialog()\">' +\n *             '      Close Greeting' +\n *\n *             '    </md-button>' +\n *             '  </div>' +\n *             '</md-dialog>',\n *           controller: 'GreetingController',\n *           onComplete: afterShowAnimation,\n *           locals: { employee: $scope.userName }\n *         });\n *\n *         // When the 'enter' animation finishes...\n *\n *         function afterShowAnimation(scope, element, options) {\n *            // post-show code here: DOM element focus, etc.\n *         }\n *     }\n *   }\n *\n *   // Greeting controller used with the more complex 'showCustomGreeting()' custom dialog\n *\n *   function GreetingController($scope, $mdDialog, employee) {\n *     // Assigned from construction <code>locals</code> options...\n *     $scope.employee = employee;\n *\n *     $scope.closeDialog = function() {\n *       // Easily hides most recent dialog shown...\n *       // no specific instance reference is needed.\n *       $mdDialog.hide();\n *     };\n *   }\n *\n * })(angular);\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#alert\n *\n * @description\n * Builds a preconfigured dialog with the specified message.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n * - $mdDialogPreset#theme(string) - sets the theme of the dialog\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#confirm\n *\n * @description\n * Builds a preconfigured dialog with the specified message. You can call show and the promise returned\n * will be resolved only if the user clicks the confirm action on the dialog.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * Additionally, it supports the following methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n * - $mdDialogPreset#cancel(string) - sets cancel button text to string\n * - $mdDialogPreset#theme(string) - sets the theme of the dialog\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#show\n *\n * @description\n * Show a dialog with the specified options.\n *\n * @param {object} optionsOrPreset Either provide an `$mdDialogPreset` returned from `alert()`, and\n * `confirm()`, or an options object with the following properties:\n *   - `templateUrl` - `{string=}`: The url of a template that will be used as the content\n *   of the dialog.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual template string.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new isolate scope.\n *     This scope will be destroyed when the dialog is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the dialog is open.\n *     Default true.\n *   - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop behind the dialog.\n *     Default true.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the dialog to\n *     close it. Default true.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the dialog.\n *     Default true.\n *   - `controller` - `{string=}`: The controller to associate with the dialog. The controller\n *     will be injected with the local `$mdDialog`, which passes along a scope for the dialog.\n *   - `locals` - `{object=}`: An object containing key/value pairs. The keys will be used as names\n *     of values to inject into the controller. For example, `locals: {three: 3}` would inject\n *     `three` into the controller, with the value 3. If `bindToController` is true, they will be\n *     copied to the controller instead. \n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values, and the\n *     dialog will not open until all of the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the dialog to. Defaults to appending\n *     to the root element of the application.\n *   - `onComplete` `{function=}`: Callback function used to announce when the show() action is\n *     finished.\n *\n * @returns {promise} A promise that can be resolved with `$mdDialog.hide()` or\n * rejected with `$mdDialog.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#hide\n *\n * @description\n * Hide an existing dialog and resolve the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#cancel\n *\n * @description\n * Hide an existing dialog and reject the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n */\n\nfunction MdDialogProvider($$interimElementProvider) {\n\n  var alertDialogMethods = ['title', 'content', 'ariaLabel', 'ok'];\n\n  advancedDialogOptions.$inject = [\"$mdDialog\", \"$mdTheming\"];\n  dialogDefaultOptions.$inject = [\"$timeout\", \"$rootElement\", \"$compile\", \"$animate\", \"$mdAria\", \"$document\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$$rAF\", \"$q\", \"$mdDialog\"];\n  return $$interimElementProvider('$mdDialog')\n    .setDefaults({\n      methods: ['disableParentScroll', 'hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n      options: dialogDefaultOptions\n    })\n    .addPreset('alert', {\n      methods: ['title', 'content', 'ariaLabel', 'ok', 'theme'],\n      options: advancedDialogOptions\n    })\n    .addPreset('confirm', {\n      methods: ['title', 'content', 'ariaLabel', 'ok', 'cancel', 'theme'],\n      options: advancedDialogOptions\n    });\n\n  /* @ngInject */\n  function advancedDialogOptions($mdDialog, $mdTheming) {\n    return {\n      template: [\n        '<md-dialog md-theme=\"{{ dialog.theme }}\" aria-label=\"{{ dialog.ariaLabel }}\">',\n          '<md-content>',\n            '<h2>{{ dialog.title }}</h2>',\n            '<p>{{ dialog.content }}</p>',\n          '</md-content>',\n          '<div class=\"md-actions\">',\n            '<md-button ng-if=\"dialog.$type == \\'confirm\\'\" ng-click=\"dialog.abort()\">',\n              '{{ dialog.cancel }}',\n            '</md-button>',\n            '<md-button ng-click=\"dialog.hide()\" class=\"md-primary\">',\n              '{{ dialog.ok }}',\n            '</md-button>',\n          '</div>',\n        '</md-dialog>'\n      ].join(''),\n      controller: function mdDialogCtrl() {\n        this.hide = function() {\n          $mdDialog.hide(true);\n        };\n        this.abort = function() {\n          $mdDialog.cancel();\n        };\n      },\n      controllerAs: 'dialog',\n      bindToController: true,\n      theme: $mdTheming.defaultTheme()\n    };\n  }\n\n  /* @ngInject */\n  function dialogDefaultOptions($timeout, $rootElement, $compile, $animate, $mdAria, $document,\n                                $mdUtil, $mdConstant, $mdTheming, $$rAF, $q, $mdDialog) {\n    return {\n      hasBackdrop: true,\n      isolateScope: true,\n      onShow: onShow,\n      onRemove: onRemove,\n      clickOutsideToClose: true,\n      escapeToClose: true,\n      targetEvent: null,\n      disableParentScroll: true,\n      transformTemplate: function(template) {\n        return '<div class=\"md-dialog-container\">' + template + '</div>';\n      }\n    };\n\n\n    // On show method for dialogs\n    function onShow(scope, element, options) {\n      // Incase the user provides a raw dom element, always wrap it in jqLite\n      options.parent = angular.element(options.parent);\n\n      options.popInTarget = angular.element((options.targetEvent || {}).target);\n      var closeButton = findCloseButton();\n\n      configureAria(element.find('md-dialog'));\n\n      if (options.hasBackdrop) {\n        // Fix for IE 10\n        var computeFrom = (options.parent[0] == $document[0].body && $document[0].documentElement \n                           && $document[0].scrollTop) ? angular.element($document[0].documentElement) : options.parent;\n        var parentOffset = computeFrom.prop('scrollTop');\n        options.backdrop = angular.element('<md-backdrop class=\"md-dialog-backdrop md-opaque\">');\n        $mdTheming.inherit(options.backdrop, options.parent);\n        $animate.enter(options.backdrop, options.parent);\n        element.css('top', parentOffset +'px');\n      }\n\n      if (options.disableParentScroll) {\n        options.lastOverflow = options.parent.css('overflow');\n        options.parent.css('overflow', 'hidden');\n      }\n\n      return dialogPopIn(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      )\n      .then(function() {\n        if (options.escapeToClose) {\n          options.rootElementKeyupCallback = function(e) {\n            if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          $rootElement.on('keyup', options.rootElementKeyupCallback);\n        }\n\n        if (options.clickOutsideToClose) {\n          options.dialogClickOutsideCallback = function(ev) {\n            // Only close if we click the flex container outside the backdrop\n            if (ev.target === element[0]) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          element.on('click', options.dialogClickOutsideCallback);\n        }\n        closeButton.focus();\n      });\n\n\n      function findCloseButton() {\n        //If no element with class dialog-close, try to find the last\n        //button child in md-actions and assume it is a close button\n        var closeButton = element[0].querySelector('.dialog-close');\n        if (!closeButton) {\n          var actionButtons = element[0].querySelectorAll('.md-actions button');\n          closeButton = actionButtons[ actionButtons.length - 1 ];\n        }\n        return angular.element(closeButton);\n      }\n\n    }\n\n    // On remove function for all dialogs\n    function onRemove(scope, element, options) {\n\n      if (options.backdrop) {\n        $animate.leave(options.backdrop);\n      }\n      if (options.disableParentScroll) {\n        options.parent.css('overflow', options.lastOverflow);\n        delete options.lastOverflow;\n      }\n      if (options.escapeToClose) {\n        $rootElement.off('keyup', options.rootElementKeyupCallback);\n      }\n      if (options.clickOutsideToClose) {\n        element.off('click', options.dialogClickOutsideCallback);\n      }\n      return dialogPopOut(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      ).then(function() {\n        options.scope.$destroy();\n        element.remove();\n        options.popInTarget && options.popInTarget.focus();\n      });\n\n    }\n\n    /**\n     * Inject ARIA-specific attributes appropriate for Dialogs\n     */\n    function configureAria(element) {\n      element.attr({\n        'role': 'dialog'\n      });\n\n      var dialogContent = element.find('md-content');\n      if (dialogContent.length === 0){\n        dialogContent = element;\n      }\n      $mdAria.expectAsync(element, 'aria-label', function() {\n        var words = dialogContent.text().split(/\\s+/);\n        if (words.length > 3) words = words.slice(0,3).concat('...');\n        return words.join(' ');\n      });\n    }\n\n    function dialogPopIn(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      parentElement.append(container);\n      transformToClickElement(dialogEl, clickElement);\n\n      $$rAF(function() {\n        dialogEl.addClass('transition-in')\n          .css($mdConstant.CSS.TRANSFORM, '');\n      });\n\n      return $mdUtil.transitionEndPromise(dialogEl);\n    }\n\n    function dialogPopOut(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      dialogEl.addClass('transition-out').removeClass('transition-in');\n      transformToClickElement(dialogEl, clickElement);\n\n      return $mdUtil.transitionEndPromise(dialogEl);\n    }\n\n    function transformToClickElement(dialogEl, clickElement) {\n      if (clickElement) {\n        var clickRect = clickElement[0].getBoundingClientRect();\n        var dialogRect = dialogEl[0].getBoundingClientRect();\n\n        var scaleX = Math.min(0.5, clickRect.width / dialogRect.width);\n        var scaleY = Math.min(0.5, clickRect.height / dialogRect.height);\n\n        dialogEl.css($mdConstant.CSS.TRANSFORM, 'translate3d(' +\n          (-dialogRect.left + clickRect.left + clickRect.width/2 - dialogRect.width/2) + 'px,' +\n          (-dialogRect.top + clickRect.top + clickRect.height/2 - dialogRect.height/2) + 'px,' +\n          '0) scale(' + scaleX + ',' + scaleY + ')'\n        );\n      }\n    }\n\n    function dialogTransitionEnd(dialogEl) {\n      var deferred = $q.defer();\n      dialogEl.on($mdConstant.CSS.TRANSITIONEND, finished);\n      function finished(ev) {\n        //Make sure this transitionend didn't bubble up from a child\n        if (ev.target === dialogEl[0]) {\n          dialogEl.off($mdConstant.CSS.TRANSITIONEND, finished);\n          deferred.resolve();\n        }\n      }\n      return deferred.promise;\n    }\n\n  }\n}\nMdDialogProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/divider/divider-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-divider.md-THEME_NAME-theme {\n  border-top-color: '{{foreground-4}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/divider/divider.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-divider {\n  display: block;\n  border-top: 1px solid;\n  margin: 0; }\n  md-divider[md-inset] {\n    margin-left: 80px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/divider/divider.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.divider');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.divider\n * @description Divider module!\n */\nangular.module('material.components.divider', [\n  'material.core'\n])\n  .directive('mdDivider', MdDividerDirective);\n\nfunction MdDividerController(){}\n\n/**\n * @ngdoc directive\n * @name mdDivider\n * @module material.components.divider\n * @restrict E\n *\n * @description\n * Dividers group and separate content within lists and page layouts using strong visual and spatial distinctions. This divider is a thin rule, lightweight enough to not distract the user from content.\n *\n * @param {boolean=} md-inset Add this attribute to activate the inset divider style.\n * @usage\n * <hljs lang=\"html\">\n * <md-divider></md-divider>\n *\n * <md-divider md-inset></md-divider>\n * </hljs>\n *\n */\nfunction MdDividerDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: $mdTheming,\n    controller: [MdDividerController]\n  };\n}\nMdDividerDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/gridList/gridList-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.0-rc1-master-91053dc\n */\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/gridList/gridList.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-grid-list {\n  display: block;\n  position: relative; }\n  md-grid-list md-grid-tile {\n    display: block;\n    position: absolute; }\n    md-grid-list md-grid-tile figure {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      -webkit-justify-content: center;\n          -ms-flex-pack: center;\n              justify-content: center;\n      height: 100%;\n      position: absolute;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      padding: 0;\n      margin: 0; }\n    md-grid-list md-grid-tile md-grid-tile-header, md-grid-list md-grid-tile md-grid-tile-footer {\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-flex-direction: row;\n          -ms-flex-direction: row;\n              flex-direction: row;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      height: 48px;\n      color: #fff;\n      background: rgba(0, 0, 0, 0.18);\n      overflow: hidden;\n      position: absolute;\n      left: 0;\n      right: 0; }\n      md-grid-list md-grid-tile md-grid-tile-header h3, md-grid-list md-grid-tile md-grid-tile-header h4, md-grid-list md-grid-tile md-grid-tile-footer h3, md-grid-list md-grid-tile md-grid-tile-footer h4 {\n        font-weight: 400;\n        margin: 0 0 0 16px; }\n      md-grid-list md-grid-tile md-grid-tile-header h3, md-grid-list md-grid-tile md-grid-tile-footer h3 {\n        font-size: 14px; }\n      md-grid-list md-grid-tile md-grid-tile-header h4, md-grid-list md-grid-tile md-grid-tile-footer h4 {\n        font-size: 12px; }\n    md-grid-list md-grid-tile md-grid-tile-header {\n      top: 0; }\n    md-grid-list md-grid-tile md-grid-tile-footer {\n      bottom: 0; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/gridList/gridList.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.gridList');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.gridList\n */\nangular.module('material.components.gridList', ['material.core'])\n       .directive('mdGridList', GridListDirective)\n       .directive('mdGridTile', GridTileDirective)\n       .directive('mdGridTileFooter', GridTileCaptionDirective)\n       .directive('mdGridTileHeader', GridTileCaptionDirective)\n       .factory('$mdGridLayout', GridLayoutFactory);\n\n/**\n * @ngdoc directive\n * @name mdGridList\n * @module material.components.gridList\n * @restrict E\n * @description\n * Grid lists are an alternative to standard list views. Grid lists are distinct\n * from grids used for layouts and other visual presentations.\n *\n * A grid list is best suited to presenting a homogenous data type, typically\n * images, and is optimized for visual comprehension and differentiating between\n * like data types.\n *\n * A grid list is a continuous element consisting of tessellated, regular\n * subdivisions called cells that contain tiles (`md-grid-tile`).\n *\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7OVlEaXZ5YmU1Xzg/components_grids_usage2.png\"\n *    style=\"width: 300px; height: auto; margin-right: 16px;\" alt=\"Concept of grid explained visually\">\n * <img src=\"//material-design.storage.googleapis.com/publish/v_2/material_ext_publish/0Bx4BSt6jniD7VGhsOE5idWlJWXM/components_grids_usage3.png\"\n *    style=\"width: 300px; height: auto;\" alt=\"Grid concepts legend\">\n *\n * Cells are arrayed vertically and horizontally within the grid.\n *\n * Tiles hold content and can span one or more cells vertically or horizontally.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-list` directive supports \"responsive\" attributes, which allow\n * different `md-cols`, `md-gutter` and `md-row-height` values depending on the\n * currently matching media query (as defined in `$mdConstant.MEDIA`).\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-cols-lg=\"8\"`)\n *\n * @param {number} md-cols Number of columns in the grid.\n * @param {string} md-row-height One of\n * <ul>\n *   <li>CSS length - Fixed height rows (eg. `8px` or `1rem`)</li>\n *   <li>`{width}:{height}` - Ratio of width to height (eg.\n *   `md-row-height=\"16:9\"`)</li>\n *   <li>`\"fit\"` - Height will be determined by subdividing the available\n *   height by the number of rows</li>\n * </ul>\n * @param {string=} md-gutter The amount of space between tiles in CSS units\n *     (default 1px)\n * @param {expression=} md-on-layout Expression to evaluate after layout. Event\n *     object is available as `$event`, and contains performance information.\n *\n * @usage\n * Basic:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"5\" md-gutter=\"1em\" md-row-height=\"4:3\">\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fixed-height rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"200px\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Fit rows:\n * <hljs lang=\"html\">\n * <md-grid-list md-cols=\"4\" md-row-height=\"fit\" style=\"height: 400px;\" ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n *\n * Using responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-list\n *     md-cols-sm=\"2\"\n *     md-cols-md=\"4\"\n *     md-cols-lg=\"8\"\n *     md-cols-gt-lg=\"12\"\n *     ...>\n *   <md-grid-tile></md-grid-tile>\n * </md-grid-list>\n * </hljs>\n */\nfunction GridListDirective($interpolate, $mdConstant, $mdGridLayout, $mdMedia, $mdUtil) {\n  return {\n    restrict: 'E',\n    controller: GridListController,\n    scope: {\n      mdOnLayout: '&'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, ctrl) {\n    // Apply semantics\n    element.attr('role', 'list');\n\n    // Provide the controller with a way to trigger layouts.\n    ctrl.layoutDelegate = layoutDelegate\n\n    var invalidateLayout = angular.bind(ctrl, ctrl.invalidateLayout),\n        unwatchAttrs = watchMedia();\n    scope.$on('$destroy', unwatchMedia);\n\n    /**\n     * Watches for changes in media, invalidating layout as necessary.\n     */\n    function watchMedia() {\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia(mediaName); // initialize\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .addListener(invalidateLayout);\n      }\n      return $mdMedia.watchResponsiveAttributes(\n          ['md-cols', 'md-row-height'], attrs, layoutIfMediaMatch);;\n    }\n\n    function unwatchMedia() {\n      unwatchAttrs();\n      for (var mediaName in $mdConstant.MEDIA) {\n        $mdMedia.getQuery($mdConstant.MEDIA[mediaName])\n            .removeListener(invalidateLayout);\n      }\n    }\n\n    /**\n     * Performs grid layout if the provided mediaName matches the currently\n     * active media type.\n     */\n    function layoutIfMediaMatch(mediaName) {\n      if (mediaName == null) {\n        // TODO(shyndman): It would be nice to only layout if we have\n        // instances of attributes using this media type\n        ctrl.invalidateLayout();\n      } else if ($mdMedia(mediaName)) {\n        ctrl.invalidateLayout();\n      }\n    }\n\n    /**\n     * Invokes the layout engine, and uses its results to lay out our\n     * tile elements.\n     */\n    function layoutDelegate() {\n      var tiles = getTileElements(),\n          colCount = getColumnCount(),\n          rowMode = getRowMode(),\n          rowHeight = getRowHeight(),\n          gutter = getGutter(),\n          performance =\n              $mdGridLayout(colCount, getTileSpans(), getTileElements())\n                  .map(function(tilePositions, rowCount) {\n                    return {\n                      grid: {\n                        element: element,\n                        style: getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight)\n                      },\n                      tiles: tilePositions.map(function(ps, i) {\n                        return {\n                          element: angular.element(tiles[i]),\n                          style: getTileStyle(ps.position, ps.spans,\n                              colCount, rowCount,\n                              gutter, rowMode, rowHeight)\n                        }\n                      })\n                    }\n                  })\n                  .reflow()\n                  .performance();\n\n      // Report layout\n      scope.mdOnLayout({\n        $event: {\n          performance: performance\n        }\n      });\n    }\n\n    var UNIT      = $interpolate( \"{{ share }}% - ({{ gutter }} * {{ gutterShare }})\" );\n    var POSITION  = $interpolate( \"calc(({{ unit }}) * {{ offset }} + {{ offset }} * {{ gutter }})\" );\n    var DIMENSION = $interpolate( \"calc(({{ unit }}) * {{ span }} + ({{ span }} - 1) * {{ gutter }})\" );\n\n    // TODO(shyndman): Replace args with a ctx object.\n    function getTileStyle(position, spans, colCount, rowCount, gutter, rowMode, rowHeight) {\n      // TODO(shyndman): There are style caching opportunities here.\n      var hShare = (1 / colCount) * 100,\n          hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n          hUnit = UNIT({ share: hShare, gutterShare: hGutterShare, gutter: gutter });\n\n      var style = {\n        left: POSITION({ unit: hUnit, offset: position.col, gutter: gutter }),\n        width: DIMENSION({ unit: hUnit, span: spans.col, gutter: gutter }),\n        // resets\n        paddingTop: '',\n        marginTop: '',\n        top: '',\n        height: ''\n      };\n\n      switch (rowMode) {\n        case 'fixed':\n          style.top = POSITION({ unit: rowHeight, offset: position.row, gutter: gutter });\n          style.height = DIMENSION({ unit: rowHeight, span: spans.row, gutter: gutter });\n          break;\n\n        case 'ratio':\n          // rowHeight is width / height\n          var vShare = hShare * (1 / rowHeight),\n              vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          style.paddingTop = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter});\n          style.marginTop = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n          break;\n\n        case 'fit':\n          var vGutterShare = rowCount === 1 ? 0 : (rowCount - 1) / rowCount,\n              vShare = (1 / rowCount) * 100,\n              vUnit = UNIT({ share: vShare, gutterShare: vGutterShare, gutter: gutter });\n\n          style.top = POSITION({ unit: vUnit, offset: position.row, gutter: gutter });\n          style.height = DIMENSION({ unit: vUnit, span: spans.row, gutter: gutter });\n          break;\n      }\n\n      return style;\n    }\n\n    function getGridStyle(colCount, rowCount, gutter, rowMode, rowHeight) {\n      var style = {\n        height: '',\n        paddingBottom: ''\n      };\n\n      switch(rowMode) {\n        case 'fixed':\n          style.height = DIMENSION({ unit: rowHeight, span: rowCount, gutter: gutter });\n          break;\n\n        case 'ratio':\n          // rowHeight is width / height\n          var hGutterShare = colCount === 1 ? 0 : (colCount - 1) / colCount,\n              hShare = (1 / colCount) * 100,\n              vShare = hShare * (1 / rowHeight),\n              vUnit = UNIT({ share: vShare, gutterShare: hGutterShare, gutter: gutter });\n\n          style.paddingBottom = DIMENSION({ unit: vUnit, span: rowCount, gutter: gutter});\n          break;\n\n        case 'fit':\n          // noop, as the height is user set\n          break;\n      }\n\n      return style;\n    }\n\n    function getTileElements() {\n      return ctrl.tiles.map(function(tile) { return tile.element });\n    }\n\n    function getTileSpans() {\n      return ctrl.tiles.map(function(tile) {\n        return {\n          row: parseInt(\n              $mdMedia.getResponsiveAttribute(tile.attrs, 'md-rowspan'), 10) || 1,\n          col: parseInt(\n              $mdMedia.getResponsiveAttribute(tile.attrs, 'md-colspan'), 10) || 1\n        };\n      });\n    }\n\n    function getColumnCount() {\n      var colCount = parseInt($mdMedia.getResponsiveAttribute(attrs, 'md-cols'), 10);\n      if (isNaN(colCount)) {\n        throw 'md-grid-list: md-cols attribute was not found, or contained a non-numeric value';\n      }\n      return colCount;\n    }\n\n    function getGutter() {\n      return applyDefaultUnit($mdMedia.getResponsiveAttribute(attrs, 'md-gutter') || 1);\n    }\n\n    function getRowHeight() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      switch (getRowMode()) {\n        case 'fixed':\n          return applyDefaultUnit(rowHeight);\n        case 'ratio':\n          var whRatio = rowHeight.split(':');\n          return parseFloat(whRatio[0]) / parseFloat(whRatio[1]);\n        case 'fit':\n          return 0; // N/A\n      }\n    }\n\n    function getRowMode() {\n      var rowHeight = $mdMedia.getResponsiveAttribute(attrs, 'md-row-height');\n      if (rowHeight == 'fit') {\n        return 'fit';\n      } else if (rowHeight.indexOf(':') !== -1) {\n        return 'ratio';\n      } else {\n        return 'fixed';\n      }\n    }\n\n    function applyDefaultUnit(val) {\n      return /\\D$/.test(val) ? val : val + 'px';\n    }\n  }\n}\nGridListDirective.$inject = [\"$interpolate\", \"$mdConstant\", \"$mdGridLayout\", \"$mdMedia\", \"$mdUtil\"];\n\n  /* @ngInject */\nfunction GridListController($timeout) {\n  this.invalidated = false;\n  this.$timeout_ = $timeout;\n  this.tiles = [];\n  this.layoutDelegate = angular.noop;\n}\nGridListController.$inject = [\"$timeout\"];\n\nGridListController.prototype = {\n  addTile: function(tileElement, tileAttrs, idx) {\n    var tile = { element: tileElement, attrs: tileAttrs };\n    if (angular.isUndefined(idx)) {\n      this.tiles.push(tile);\n    } else {\n      this.tiles.splice(idx, 0, tile);\n    }\n    this.invalidateLayout();\n  },\n\n  removeTile: function(tileElement, tileAttrs) {\n    var idx = this._findTileIndex(tileAttrs);\n    if (idx === -1) {\n      return;\n    }\n    this.tiles.splice(idx, 1);\n    this.invalidateLayout();\n  },\n\n  invalidateLayout: function() {\n    if (this.invalidated) {\n      return;\n    }\n    this.invalidated = true;\n    this.$timeout_(angular.bind(this, this.layout));\n  },\n\n  layout: function() {\n    try {\n      this.layoutDelegate();\n    } finally {\n      this.invalidated = false;\n    }\n  },\n\n  _findTileIndex: function(tileAttrs) {\n    for (var i = 0; i < this.tiles.length; i++) {\n      if (this.tiles[i].attrs == tileAttrs) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\n\n/* @ngInject */\nfunction GridLayoutFactory($mdUtil) {\n  var defaultAnimator = GridTileAnimator;\n\n  /**\n   * Set the reflow animator callback\n   */\n  GridLayout.animateWith =function(customAnimator) {\n    defaultAnimator = !angular.isFunction(customAnimator) ? GridTileAnimator : customAnimator;\n  };\n\n  return GridLayout;\n\n  /**\n   * Publish layout function\n   */\n  function GridLayout(colCount, tileSpans) {\n      var self, layoutInfo, gridStyles, layoutTime, mapTime, reflowTime, layoutInfo;\n\n      layoutTime = $mdUtil.time(function() {\n        layoutInfo = calculateGridFor(colCount, tileSpans);\n      });\n\n      return self = {\n\n        /**\n         * An array of objects describing each tile's position in the grid.\n         */\n        layoutInfo: function() {\n          return layoutInfo;\n        },\n\n        /**\n         * Maps grid positioning to an element and a set of styles using the\n         * provided updateFn.\n         */\n        map: function(updateFn) {\n          mapTime = $mdUtil.time(function() {\n            var info = self.layoutInfo();\n            gridStyles = updateFn(info.positioning, info.rowCount);\n          });\n          return self;\n        },\n\n        /**\n         * Default animator simply sets the element.css( <styles> ). An alternate\n         * animator can be provided as an argument. The function has the following\n         * signature:\n         *\n         *    function({grid: {element: JQLite, style: Object}, tiles: Array<{element: JQLite, style: Object}>)\n         */\n        reflow: function(animatorFn) {\n          reflowTime = $mdUtil.time(function() {\n            var animator = animatorFn || defaultAnimator;\n            animator(gridStyles.grid, gridStyles.tiles);\n          });\n          return self;\n        },\n\n        /**\n         * Timing for the most recent layout run.\n         */\n        performance: function() {\n          return {\n            tileCount: tileSpans.length,\n            layoutTime: layoutTime,\n            mapTime: mapTime,\n            reflowTime: reflowTime,\n            totalTime: layoutTime + mapTime + reflowTime\n          };\n        }\n      };\n    }\n\n  /**\n   * Default Gridlist animator simple sets the css for each element;\n   * NOTE: any transitions effects must be manually set in the CSS.\n   * e.g.\n   *\n   *  md-grid-tile {\n   *    transition: all 700ms ease-out 50ms;\n   *  }\n   *\n   */\n  function GridTileAnimator(grid, tiles) {\n    grid.element.css(grid.style);\n    tiles.forEach(function(t) {\n      t.element.css(t.style);\n    })\n  }\n\n  /**\n   * Calculates the positions of tiles.\n   *\n   * The algorithm works as follows:\n   *    An Array<Number> with length colCount (spaceTracker) keeps track of\n   *    available tiling positions, where elements of value 0 represents an\n   *    empty position. Space for a tile is reserved by finding a sequence of\n   *    0s with length <= than the tile's colspan. When such a space has been\n   *    found, the occupied tile positions are incremented by the tile's\n   *    rowspan value, as these positions have become unavailable for that\n   *    many rows.\n   *\n   *    If the end of a row has been reached without finding space for the\n   *    tile, spaceTracker's elements are each decremented by 1 to a minimum\n   *    of 0. Rows are searched in this fashion until space is found.\n   */\n  function calculateGridFor(colCount, tileSpans) {\n    var curCol = 0,\n        curRow = 0,\n        spaceTracker = newSpaceTracker();\n\n    return {\n      positioning: tileSpans.map(function(spans, i) {\n        return {\n          spans: spans,\n          position: reserveSpace(spans, i)\n        };\n      }),\n      rowCount: curRow + Math.max.apply(Math, spaceTracker)\n    }\n\n    function reserveSpace(spans, i) {\n      if (spans.col > colCount) {\n        throw 'md-grid-list: Tile at position ' + i + ' has a colspan ' +\n            '(' + spans.col + ') that exceeds the column count ' +\n            '(' + colCount + ')';\n      }\n\n      var start = 0,\n          end = 0;\n\n      // TODO(shyndman): This loop isn't strictly necessary if you can\n      // determine the minimum number of rows before a space opens up. To do\n      // this, recognize that you've iterated across an entire row looking for\n      // space, and if so fast-forward by the minimum rowSpan count. Repeat\n      // until the required space opens up.\n      while (end - start < spans.col) {\n        if (curCol >= colCount) {\n          nextRow();\n          continue;\n        }\n\n        start = spaceTracker.indexOf(0, curCol);\n        if (start === -1 || (end = findEnd(start + 1)) === -1) {\n          start = end = 0;\n          nextRow();\n          continue;\n        }\n\n        curCol = end + 1;\n      }\n\n      adjustRow(start, spans.col, spans.row);\n      curCol = start + spans.col;\n\n      return {\n        col: start,\n        row: curRow\n      };\n    }\n\n    function nextRow() {\n      curCol = 0;\n      curRow++;\n      adjustRow(0, colCount, -1); // Decrement row spans by one\n    }\n\n    function adjustRow(from, cols, by) {\n      for (var i = from; i < from + cols; i++) {\n        spaceTracker[i] = Math.max(spaceTracker[i] + by, 0);\n      }\n    }\n\n    function findEnd(start) {\n      var i;\n      for (i = start; i < spaceTracker.length; i++) {\n        if (spaceTracker[i] !== 0) {\n          return i;\n        }\n      }\n\n      if (i === spaceTracker.length) {\n        return i;\n      }\n    }\n\n    function newSpaceTracker() {\n      var tracker = [];\n      for (var i = 0; i < colCount; i++) {\n        tracker.push(0);\n      }\n      return tracker;\n    }\n  }\n}\nGridLayoutFactory.$inject = [\"$mdUtil\"];\n\n/**\n * @ngdoc directive\n * @name mdGridTile\n * @module material.components.gridList\n * @restrict E\n * @description\n * Tiles contain the content of an `md-grid-list`. They span one or more grid\n * cells vertically or horizontally, and use `md-grid-tile-{footer,header}` to\n * display secondary content.\n *\n * ### Responsive Attributes\n *\n * The `md-grid-tile` directive supports \"responsive\" attributes, which allow\n * different `md-rowspan` and `md-colspan` values depending on the currently\n * matching media query (as defined in `$mdConstant.MEDIA`).\n *\n * In order to set a responsive attribute, first define the fallback value with\n * the standard attribute name, then add additional attributes with the\n * following convention: `{base-attribute-name}-{media-query-name}=\"{value}\"`\n * (ie. `md-colspan-sm=\"4\"`)\n *\n * @param {number=} md-colspan The number of columns to span (default 1). Cannot\n *    exceed the number of columns in the grid. Supports interpolation.\n * @param {number=} md-rowspan The number of rows to span (default 1). Supports\n *     interpolation.\n *\n * @usage\n * With header:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-header>\n *     <h3>This is a header</h3>\n *   </md-grid-tile-header>\n * </md-grid-tile>\n * </hljs>\n *\n * With footer:\n * <hljs lang=\"html\">\n * <md-grid-tile>\n *   <md-grid-tile-footer>\n *     <h3>This is a footer</h3>\n *   </md-grid-tile-footer>\n * </md-grid-tile>\n * </hljs>\n *\n * Spanning multiple rows/columns:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"2\" md-rowspan=\"3\">\n * </md-grid-tile>\n * </hljs>\n *\n * Responsive attributes:\n * <hljs lang=\"html\">\n * <md-grid-tile md-colspan=\"1\" md-colspan-sm=\"3\" md-colspan-md=\"5\">\n * </md-grid-tile>\n * </hljs>\n */\nfunction GridTileDirective($mdMedia) {\n  return {\n    restrict: 'E',\n    require: '^mdGridList',\n    template: '<figure ng-transclude></figure>',\n    transclude: true,\n    scope: {},\n    link: postLink\n  };\n\n  function postLink(scope, element, attrs, gridCtrl) {\n    // Apply semantics\n    element.attr('role', 'listitem');\n\n    // If our colspan or rowspan changes, trigger a layout\n    var unwatchAttrs = $mdMedia.watchResponsiveAttributes(['md-colspan', 'md-rowspan'],\n        attrs, angular.bind(gridCtrl, gridCtrl.invalidateLayout));\n\n    // Tile registration/deregistration\n    // TODO(shyndman): Kind of gross to access parent scope like this.\n    //    Consider other options.\n    gridCtrl.addTile(element, attrs, scope.$parent.$index);\n    scope.$on('$destroy', function() {\n      unwatchAttrs();\n      gridCtrl.removeTile(element, attrs);\n    });\n  }\n}\nGridTileDirective.$inject = [\"$mdMedia\"];\n\nfunction GridTileCaptionDirective() {\n  return {\n    template: '<figcaption ng-transclude></figcaption>',\n    transclude: true\n  };\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/icon/icon-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-icon.md-THEME_NAME-theme.md-primary {\n  color: '{{primary-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-accent {\n  color: '{{accent-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-warn {\n  color: '{{warn-color}}'; }\nmd-icon.md-THEME_NAME-theme.md-danger {\n  color: '{{danger-color}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/icon/icon.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-icon {\n  margin: auto;\n  background-repeat: no-repeat no-repeat;\n  display: inline-block;\n  vertical-align: middle;\n  fill: currentcolor;\n  height: 24px;\n  width: 24px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/icon/icon.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.icon');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.icon\n * @description\n * Icon\n */\nangular.module('material.components.icon', [\n    'material.core'\n  ])\n  .directive('mdIcon', mdIconDirective);\n\n/**\n * @ngdoc directive\n * @name mdIcon\n * @module material.components.icon\n *\n * @restrict E\n *\n * @description\n * The `md-icon` directive is an markup element useful for showing an icon based on a font-face\n * or a SVG. Both external SVGs (via URLs) or cached SVG from icon sets can be\n * easily loaded and used.\n *\n * @param {string} md-svg-src String URL [or expression ] used to load, cache, and display an external SVG.\n * @param {string} md-svg-icon String name used for lookup of the icon from the internal cache; interpolated strings or\n * expressions may also be used. Specific set names can be used with the syntax `<set name>:<icon name>`.<br/><br/>\n * To use icon sets, developers are required to pre-register the sets using the `$mdIconProvider` service.\n * @param {string} md-font-icon String name of CSS icon associated with the font-face will be used\n * to render the icon. Requires the fonts and the named CSS styles to be preloaded.\n * @param {string=} alt Labels icon for accessibility. If an empty string is provided, icon\n * will be hidden from accessibility layer with `aria-hidden=\"true\"`. If there's no alt on the icon\n * nor a label on the parent element, a warning will be logged to the console.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-icon md-font-icon=\"android\"          alt=\"android \" ></md-icon>\n *  <md-icon md-svg-icon=\"action:android\"    alt=\"android \" ></md-icon>\n *  <md-icon md-svg-src=\"/android.svg\"       alt=\"android \" ></md-icon>\n *  <md-icon md-svg-src=\"{{ getAndroid() }}\" alt=\"android \" ></md-icon>\n * </hljs>\n */\nfunction mdIconDirective($mdIcon, $mdTheming, $mdAria ) {\n  return {\n    scope: {\n      fontIcon: '@mdFontIcon',\n      svgIcon: '@mdSvgIcon',\n      svgSrc: '@mdSvgSrc'\n    },\n    restrict: 'E',\n    template: getTemplate,\n    link: postLink\n  };\n\n  function getTemplate(element, attr) {\n    return attr.mdFontIcon ? '<span class=\"md-font\" ng-class=\"fontIcon\"></span>' : '';\n  }\n\n  /**\n   * Directive postLink\n   * Supports embedded SVGs, font-icons, & external SVGs\n   */\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n\n    var ariaLabel = attr.alt || scope.fontIcon || scope.svgIcon;\n    var attrName = attr.$normalize(attr.$attr.mdSvgIcon || attr.$attr.mdSvgSrc || '');\n\n    if (attr.alt != '' && !parentsHaveText()) {\n      $mdAria.expect(element, 'aria-label', ariaLabel);\n      $mdAria.expect(element, 'role', 'img');\n    } else {\n      // Hide from the accessibility layer.\n      $mdAria.expect(element, 'aria-hidden', 'true');\n    }\n\n    if (attrName) {\n      // Use either pre-configured SVG or URL source, respectively.\n      attr.$observe(attrName, function(attrVal) {\n\n        element.empty();\n        if (attrVal) {\n          $mdIcon(attrVal).then(function(svg) {\n            element.append(svg);\n          });\n        }\n\n      });\n    }\n    function parentsHaveText() {\n      var parent = element.parent();\n      if (parent.attr('aria-label') || parent.text()) {\n        return true;\n      }\n      else if(parent.parent().attr('aria-label') || parent.parent().text()) {\n        return true;\n      }\n      return false;\n    }\n  }\n}\nmdIconDirective.$inject = [\"$mdIcon\", \"$mdTheming\", \"$mdAria\"];\n\n})();\n\n(function() {\n  'use strict';\n\n  angular\n    .module('material.components.icon' )\n    .provider('$mdIcon', MdIconProvider);\n\n  /**\n    * @ngdoc service\n    * @name $mdIconProvider\n    * @module material.components.icon\n    *\n    * @description\n    * `$mdIconProvider` is used only to register icon IDs with URLs. These configuration features allow\n    * icons and icon sets to be pre-registered and associated with source URLs **before** the `<md-icon />`\n    * directives are compiled.\n    *\n    * Loading of the actual svg files are deferred to on-demand requests and are loaded\n    * internally by the `$mdIcon` service using the `$http` service. When an SVG is requested by name/ID,\n    * the `$mdIcon` service searches its registry for the associated source URL;\n    * that URL is used to on-demand load and parse the SVG dynamically.\n    *\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSet('my/app/icons.svg')       // Register a default set of SVG icons\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set of SVGs\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n    * </hljs>\n    *\n    * SVG icons and icon sets can be easily pre-loaded and cached using either (a) a build process or (b) a runtime\n    * **startup** process (shown below):\n    *\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Register a default set of SVG icon definitions\n    *     $mdIconProvider.defaultIconSet('my/app/icons.svg')\n    *\n    *   })\n    *   .run(function($http, $templateCache){\n    *\n    *     // Pre-fetch icons sources by URL and cache in the $templateCache...\n    *     // subsequent $http calls will look there first.\n    *\n    *     var urls = [ 'imy/app/icons.svg', 'img/icons/android.svg'];\n    *\n    *     angular.forEach(urls, function(url) {\n    *       $http.get(url, {cache: $templateCache});\n    *     });\n    *\n    *   });\n    *\n    * </hljs>\n    *\n    * NOTE: the loaded SVG data is subsequently cached internally for future requests.\n    *\n    */\n\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#icon\n    *\n    * @description\n    * Register a source URL for a specific icon name; the name may include optional 'icon set' name prefix.\n    * These icons  will later be retrieved from the cache using `$mdIcon( <icon name> )`\n    *\n    * @param {string} id Icon name/id used to register the icon\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .icon('android', 'my/app/android.svg')    // Register a specific icon (by name)\n    *          .icon('work:chair', 'my/app/chair.svg');  // Register icon in a specific set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#iconSet\n    *\n    * @description\n    * Register a source URL for a 'named' set of icons; group of SVG definitions where each definition\n    * has an icon id. Individual icons can be subsequently retrieved from this cached set using\n    * `$mdIcon( <icon set name>:<icon name> )`\n    *\n    * @param {string} id Icon name/id used to register the iconset\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .iconSet('social', 'my/app/social.svg')   // Register a named icon set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#defaultIconSet\n    *\n    * @description\n    * Register a source URL for the default 'named' set of icons. Unless explicitly registered,\n    * subsequent lookups of icons will failover to search this 'default' icon set.\n    * Icon can be retrieved from this cached, default set using `$mdIcon( <icon name> )`\n    *\n    * @param {string} url specifies the external location for the data file. Used internally by `$http` to load the\n    * data or as part of the lookup in `$templateCache` if pre-loading was configured.\n    * @param {string=} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSet( 'my/app/social.svg' )   // Register a default icon set\n    *   });\n    * </hljs>\n    *\n    */\n   /**\n    * @ngdoc method\n    * @name $mdIconProvider#defaultIconSize\n    *\n    * @description\n    * While `<md-icon />` markup can also be style with sizing CSS, this method configures\n    * the default width **and** height used for all icons; unless overridden by specific CSS.\n    * The default sizing is (24px, 24px).\n    *\n    * @param {string} iconSize Number indicating the width and height of the icons in the set. All icons\n    * in the icon set must be the same size. Default size is 24.\n    *\n    * @returns {obj} an `$mdIconProvider` reference; used to support method call chains for the API\n    *\n    * @usage\n    * <hljs lang=\"js\">\n    *   app.config(function($mdIconProvider) {\n    *\n    *     // Configure URLs for icons specified by [set:]id.\n    *\n    *     $mdIconProvider\n    *          .defaultIconSize(36)   // Register a default icon size (width == height)\n    *   });\n    * </hljs>\n    *\n    */\n\n var config = {\n   defaultIconSize: 24\n };\n\n function MdIconProvider() { }\n\n MdIconProvider.prototype = {\n   icon : function icon(id, url, iconSize) {\n     if ( id.indexOf(':') == -1 ) id = '$default:' + id;\n\n     config[id] = new ConfigurationItem(url, iconSize );\n     return this;\n   },\n\n   iconSet : function iconSet(id, url, iconSize) {\n     config[id] = new ConfigurationItem(url, iconSize );\n     return this;\n   },\n\n   defaultIconSet : function defaultIconSet(url, iconSize) {\n     var setName = '$default';\n\n     if ( !config[setName] ) {\n       config[setName] = new ConfigurationItem(url, iconSize );\n     }\n\n     config[setName].iconSize = iconSize || config.defaultIconSize;\n\n     return this;\n   },\n\n   defaultIconSize : function defaultIconSize(iconSize) {\n     config.defaultIconSize = iconSize;\n     return this;\n   },\n\n   preloadIcons: function ($templateCache) {\n     var iconProvider = this;\n     var svgRegistry = [\n       {\n         id : 'tabs-arrow',\n         url: 'tabs-arrow.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"tabs-arrow\"><polygon points=\"15.4,7.4 14,6 8,12 14,18 15.4,16.6 10.8,12 \"/></g></svg>'\n       },\n       {\n         id : 'close',\n         url: 'close.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g></svg>'\n       },\n       {\n         id:  'cancel',\n         url: 'cancel.svg',\n         svg: '<svg version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 24 24\"><g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g></svg>'\n       }\n     ];\n\n     svgRegistry.forEach(function(asset){\n       iconProvider.icon(asset.id,  asset.url);\n       $templateCache.put(asset.url, asset.svg);\n     });\n\n   },\n\n   $get : ['$http', '$q', '$log', '$templateCache', function($http, $q, $log, $templateCache) {\n     this.preloadIcons($templateCache);\n     return new MdIconService(config, $http, $q, $log, $templateCache);\n   }]\n };\n\n   /**\n    *  Configuration item stored in the Icon registry; used for lookups\n    *  to load if not already cached in the `loaded` cache\n    */\n   function ConfigurationItem(url, iconSize) {\n     this.url = url;\n     this.iconSize = iconSize || config.defaultIconSize;\n   }\n\n /**\n  * @ngdoc service\n  * @name $mdIcon\n  * @module material.components.icon\n  *\n  * @description\n  * The `$mdIcon` service is a function used to lookup SVG icons.\n  *\n  * @param {string} id Query value for a unique Id or URL. If the argument is a URL, then the service will retrieve the icon element\n  * from its internal cache or load the icon and cache it first. If the value is not a URL-type string, then an ID lookup is\n  * performed. The Id may be a unique icon ID or may include an iconSet ID prefix.\n  *\n  * For the **id** query to work properly, this means that all id-to-URL mappings must have been previously configured\n  * using the `$mdIconProvider`.\n  *\n  * @returns {obj} Clone of the initial SVG DOM element; which was created from the SVG markup in the SVG data file.\n  *\n  * @usage\n  * <hljs lang=\"js\">\n  * function SomeDirective($mdIcon) {\n  *\n  *   // See if the icon has already been loaded, if not\n  *   // then lookup the icon from the registry cache, load and cache\n  *   // it for future requests.\n  *   // NOTE: ID queries require configuration with $mdIconProvider\n  *\n  *   $mdIcon('android').then(function(iconEl)    { element.append(iconEl); });\n  *   $mdIcon('work:chair').then(function(iconEl) { element.append(iconEl); });\n  *\n  *   // Load and cache the external SVG using a URL\n  *\n  *   $mdIcon('img/icons/android.svg').then(function(iconEl) {\n  *     element.append(iconEl);\n  *   });\n  * };\n  * </hljs>\n  *\n  * NOTE: The `md-icon` directive internally uses the `$mdIcon` service to query, loaded, and instantiate\n  * SVG DOM elements.\n  */\n function MdIconService(config, $http, $q, $log, $templateCache) {\n   var iconCache = {};\n   var urlRegex = /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/i;\n\n   Icon.prototype = { clone : cloneSVG, prepare: prepareAndStyle };\n\n   return function getIcon(id) {\n     id = id || '';\n\n     // If already loaded and cached, use a clone of the cached icon.\n     // Otherwise either load by URL, or lookup in the registry and then load by URL, and cache.\n\n     if ( iconCache[id]         ) return $q.when( iconCache[id].clone() );\n     if ( urlRegex.test(id)     ) return loadByURL(id).then( cacheIcon(id) );\n     if ( id.indexOf(':') == -1 ) id = '$default:' + id;\n\n     return loadByID(id)\n         .catch(loadFromIconSet)\n         .catch(announceIdNotFound)\n         .catch(announceNotFound)\n         .then( cacheIcon(id) );\n   };\n\n   /**\n    * Prepare and cache the loaded icon for the specified `id`\n    */\n   function cacheIcon( id ) {\n\n     return function updateCache( icon ) {\n       iconCache[id] = isIcon(icon) ? icon : new Icon(icon, config[id]);\n\n       return iconCache[id].clone();\n     };\n   }\n\n   /**\n    * Lookup the configuration in the registry, if !registered throw an error\n    * otherwise load the icon [on-demand] using the registered URL.\n    *\n    */\n   function loadByID(id) {\n     var iconConfig = config[id];\n\n     return !iconConfig ? $q.reject(id) : loadByURL(iconConfig.url).then(function(icon) {\n       return new Icon(icon, iconConfig);\n     });\n   }\n\n   /**\n    *    Loads the file as XML and uses querySelector( <id> ) to find\n    *    the desired node...\n    */\n   function loadFromIconSet(id) {\n     var setName = id.substring(0, id.lastIndexOf(':')) || '$default';\n     var iconSetConfig = config[setName];\n\n     return !iconSetConfig ? $q.reject(id) : loadByURL(iconSetConfig.url).then(extractFromSet);\n\n     function extractFromSet(set) {\n       var iconName = id.slice(id.lastIndexOf(':') + 1);\n       var icon = set.querySelector('#' + iconName);\n       return !icon ? $q.reject(id) : new Icon(icon, iconSetConfig);\n     }\n   }\n\n   /**\n    * Load the icon by URL (may use the $templateCache).\n    * Extract the data for later conversion to Icon\n    */\n   function loadByURL(url) {\n     return $http\n       .get(url, { cache: $templateCache })\n       .then(function(response) {\n         var els = angular.element(response.data);\n         // Iterate to find first svg node, allowing for comments in loaded SVG (common with auto-generated SVGs)\n         for (var i = 0; i < els.length; ++i) {\n           if (els[i].nodeName == 'svg') {\n             return els[i];\n           }\n         }\n       });\n   }\n\n   /**\n    * User did not specify a URL and the ID has not been registered with the $mdIcon\n    * registry\n    */\n   function announceIdNotFound(id) {\n     var msg;\n\n     if (angular.isString(id)) {\n       msg = 'icon ' + id + ' not found';\n       $log.warn(msg);\n     }\n\n     return $q.reject(msg || id);\n   }\n\n   /**\n    * Catch HTTP or generic errors not related to incorrect icon IDs.\n    */\n   function announceNotFound(err) {\n     var msg = angular.isString(err) ? err : (err.message || err.data || err.statusText);\n     $log.warn(msg);\n\n     return $q.reject(msg);\n   }\n\n   /**\n    * Check target signature to see if it is an Icon instance.\n    */\n   function isIcon(target) {\n     return angular.isDefined(target.element) && angular.isDefined(target.config);\n   }\n\n   /**\n    *  Define the Icon class\n    */\n   function Icon(el, config) {\n     if (el.tagName != 'svg') {\n       el = angular.element('<svg xmlns=\"http://www.w3.org/2000/svg\">').append(el)[0];\n     }\n     el = angular.element(el);\n\n     // Inject the namespace if not available...\n     if ( !el.attr('xmlns') ) {\n       el.attr('xmlns', \"http://www.w3.org/2000/svg\");\n     }\n\n     this.element = el;\n     this.config = config;\n     this.prepare();\n   }\n\n   /**\n    *  Prepare the DOM element that will be cached in the\n    *  loaded iconCache store.\n    */\n   function prepareAndStyle() {\n     var iconSize = this.config ? this.config.iconSize : config.defaultIconSize;\n     var svg = angular.element( this.element );\n         svg.attr({\n           'fit'   : '',\n           'height': '100%',\n           'width' : '100%',\n           'preserveAspectRatio': 'xMidYMid meet',\n           'viewBox' : svg.attr('viewBox') || ('0 0 ' + iconSize + ' ' + iconSize)\n         })\n         .css( {\n           'pointer-events' : 'none',\n           'display' : 'block'\n         });\n\n     this.element = svg;\n   }\n\n   /**\n    * Clone the Icon DOM element; which is stored as an angular.element()\n    */\n   function cloneSVG(){\n     return angular.element( this.element[0].cloneNode(true) );\n   }\n\n }\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/input/input-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-input-container.md-THEME_NAME-theme .md-input {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}';\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {\n  color: '{{foreground-2}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {\n  border-color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {\n  border-color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {\n  border-bottom-color: transparent;\n  color: '{{foreground-3}}';\n  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/input/input.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-input-container {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: relative;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  overflow-x: hidden;\n  padding: 2px;\n  padding-bottom: 26px;\n  /*\n   * The .md-input class is added to the input/textarea\n   */ }\n  md-input-container textarea, md-input-container input[type=\"text\"], md-input-container input[type=\"password\"], md-input-container input[type=\"datetime\"], md-input-container input[type=\"datetime-local\"], md-input-container input[type=\"date\"], md-input-container input[type=\"month\"], md-input-container input[type=\"time\"], md-input-container input[type=\"week\"], md-input-container input[type=\"number\"], md-input-container input[type=\"email\"], md-input-container input[type=\"url\"], md-input-container input[type=\"search\"], md-input-container input[type=\"tel\"], md-input-container input[type=\"color\"] {\n    /* remove default appearance from all input/textarea */\n    -moz-appearance: none;\n    -webkit-appearance: none; }\n  md-input-container textarea {\n    resize: none;\n    overflow: hidden; }\n  md-input-container label:not(.md-no-float), md-input-container .md-placeholder {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased;\n    padding-left: 2px;\n    z-index: 1;\n    -webkit-transform: translate3d(0, 24px, 0) scale(1);\n            transform: translate3d(0, 24px, 0) scale(1);\n    -webkit-transform-origin: left top;\n            transform-origin: left top;\n    transition: -webkit-transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s;\n    transition: transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s; }\n  md-input-container .md-placeholder {\n    position: absolute;\n    top: 0;\n    opacity: 0;\n    transition-property: opacity, -webkit-transform;\n    transition-property: opacity, transform;\n    -webkit-transform: translate3d(0, 30px, 0);\n            transform: translate3d(0, 30px, 0); }\n  md-input-container.md-input-focused .md-placeholder {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 24px, 0);\n            transform: translate3d(0, 24px, 0); }\n  md-input-container.md-input-has-value .md-placeholder {\n    transition: none;\n    opacity: 0; }\n  md-input-container:not(.md-input-has-value) input:not(:focus) {\n    color: transparent; }\n  md-input-container .md-input {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    display: block;\n    background: none;\n    padding-top: 2px;\n    padding-bottom: 1px;\n    padding-left: 2px;\n    padding-right: 2px;\n    border-width: 0 0 1px 0;\n    line-height: 26px;\n    -ms-flex-preferred-size: 26px;\n    border-radius: 0; }\n    md-input-container .md-input:focus {\n      outline: none; }\n    md-input-container .md-input:invalid {\n      outline: none;\n      box-shadow: none; }\n  md-input-container ng-messages, md-input-container data-ng-messages, md-input-container x-ng-messages, md-input-container [ng-messages], md-input-container [data-ng-messages], md-input-container [x-ng-messages] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3;\n    position: relative; }\n  md-input-container ng-message, md-input-container data-ng-message, md-input-container x-ng-message, md-input-container [ng-message], md-input-container [data-ng-message], md-input-container [x-ng-message], md-input-container .md-char-counter {\n    -webkit-font-smoothing: antialiased;\n    position: absolute;\n    font-size: 12px;\n    line-height: 24px; }\n    md-input-container ng-message.ng-enter, md-input-container data-ng-message.ng-enter, md-input-container x-ng-message.ng-enter, md-input-container [ng-message].ng-enter, md-input-container [data-ng-message].ng-enter, md-input-container [x-ng-message].ng-enter, md-input-container .md-char-counter.ng-enter {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition-delay: 0.2s; }\n    md-input-container ng-message.ng-leave, md-input-container data-ng-message.ng-leave, md-input-container x-ng-message.ng-leave, md-input-container [ng-message].ng-leave, md-input-container [data-ng-message].ng-leave, md-input-container [x-ng-message].ng-leave, md-input-container .md-char-counter.ng-leave {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n    md-input-container ng-message.ng-enter, md-input-container ng-message.ng-leave.ng-leave-active, md-input-container data-ng-message.ng-enter, md-input-container data-ng-message.ng-leave.ng-leave-active, md-input-container x-ng-message.ng-enter, md-input-container x-ng-message.ng-leave.ng-leave-active, md-input-container [ng-message].ng-enter, md-input-container [ng-message].ng-leave.ng-leave-active, md-input-container [data-ng-message].ng-enter, md-input-container [data-ng-message].ng-leave.ng-leave-active, md-input-container [x-ng-message].ng-enter, md-input-container [x-ng-message].ng-leave.ng-leave-active, md-input-container .md-char-counter.ng-enter, md-input-container .md-char-counter.ng-leave.ng-leave-active {\n      opacity: 0;\n      -webkit-transform: translate3d(0, -20%, 0);\n              transform: translate3d(0, -20%, 0); }\n    md-input-container ng-message.ng-leave, md-input-container ng-message.ng-enter.ng-enter-active, md-input-container data-ng-message.ng-leave, md-input-container data-ng-message.ng-enter.ng-enter-active, md-input-container x-ng-message.ng-leave, md-input-container x-ng-message.ng-enter.ng-enter-active, md-input-container [ng-message].ng-leave, md-input-container [ng-message].ng-enter.ng-enter-active, md-input-container [data-ng-message].ng-leave, md-input-container [data-ng-message].ng-enter.ng-enter-active, md-input-container [x-ng-message].ng-leave, md-input-container [x-ng-message].ng-enter.ng-enter-active, md-input-container .md-char-counter.ng-leave, md-input-container .md-char-counter.ng-enter.ng-enter-active {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0); }\n  md-input-container .md-char-counter {\n    bottom: 2px;\n    right: 2px; }\n  md-input-container.md-input-focused label:not(.md-no-float), md-input-container.md-input-has-value label:not(.md-no-float) {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-container.md-input-focused .md-input, md-input-container .md-input.ng-invalid.ng-dirty {\n    padding-bottom: 0px;\n    border-width: 0 0 2px 0; }\n  md-input-container .md-input[disabled], [disabled] md-input-container .md-input {\n    background-position: 0 bottom;\n    background-size: 3px 1px;\n    background-repeat: repeat-x; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/input/input.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.input');\ngoog.require('ng.material.core');\n(function() {\n\n/**\n * @ngdoc module\n * @name material.components.input\n */\n\nangular.module('material.components.input', [\n  'material.core'\n])\n  .directive('mdInputContainer', mdInputContainerDirective)\n  .directive('label', labelDirective)\n  .directive('input', inputTextareaDirective)\n  .directive('textarea', inputTextareaDirective)\n  .directive('mdMaxlength', mdMaxlengthDirective)\n  .directive('placeholder', placeholderDirective);\n\n/**\n * @ngdoc directive\n * @name mdInputContainer\n * @module material.components.input\n *\n * @restrict E\n *\n * @description\n * `<md-input-container>` is the parent of any input or textarea element.\n *\n * Input and textarea elements will not behave properly unless the md-input-container\n * parent is provided.\n *\n * @param md-is-error {expression=} When the given expression evaluates to true, the input container will go into error state. Defaults to erroring if the input has been touched and is invalid.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Username</label>\n *   <input type=\"text\" ng-model=\"user.name\">\n * </md-input-container>\n *\n * <md-input-container>\n *   <label>Description</label>\n *   <textarea ng-model=\"user.description\"></textarea>\n * </md-input-container>\n *\n * </hljs>\n */\nfunction mdInputContainerDirective($mdTheming, $parse) {\n  ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$attrs\"];\n  return {\n    restrict: 'E',\n    link: postLink,\n    controller: ContainerCtrl\n  };\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n  }\n  function ContainerCtrl($scope, $element, $attrs) {\n    var self = this;\n\n    self.isErrorGetter = $attrs.mdIsError && $parse($attrs.mdIsError);\n\n    self.element = $element;\n    self.setFocused = function(isFocused) {\n      $element.toggleClass('md-input-focused', !!isFocused);\n    };\n    self.setHasValue = function(hasValue) {\n      $element.toggleClass('md-input-has-value', !!hasValue);\n    };\n    self.setInvalid = function(isInvalid) {\n      $element.toggleClass('md-input-invalid', !!isInvalid);\n    };\n    $scope.$watch(function() {\n      return self.label && self.input;\n    }, function(hasLabelAndInput) {\n      if (hasLabelAndInput && !self.label.attr('for')) {\n        self.label.attr('for', self.input.attr('id'));\n      }\n    });\n  }\n}\nmdInputContainerDirective.$inject = [\"$mdTheming\", \"$parse\"];\n\nfunction labelDirective() {\n  return {\n    restrict: 'E',\n    require: '^?mdInputContainer',\n    link: function(scope, element, attr, containerCtrl) {\n      if (!containerCtrl || attr.mdNoFloat) return;\n\n      containerCtrl.label = element;\n      scope.$on('$destroy', function() {\n        containerCtrl.label = null;\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdInput\n * @restrict E\n * @module material.components.input\n *\n * @description\n * Use the `<input>` or the  `<textarea>` as a child of an `<md-input-container>`.\n *\n * @param {number=} md-maxlength The maximum number of characters allowed in this input. If this is specified, a character counter will be shown underneath the input.<br/><br/>\n * The purpose of **`md-maxength`** is exactly to show the max length counter text. If you don't want the counter text and only need \"plain\" validation, you can use the \"simple\" `ng-maxlength` or maxlength attributes.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-input-container>\n *   <label>Color</label>\n *   <input type=\"text\" ng-model=\"color\" required md-maxlength=\"10\">\n * </md-input-container>\n * </hljs>\n * <h3>With Errors (uses [ngMessages](https://docs.angularjs.org/api/ngMessages))</h3>\n * <hljs lang=\"html\">\n * <form name=\"userForm\">\n *   <md-input-container>\n *     <label>Last Name</label>\n *     <input name=\"lastName\" ng-model=\"lastName\" required md-maxlength=\"10\" minlength=\"4\">\n *     <div ng-messages=\"userForm.lastName.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *       <div ng-message=\"minlength\">That's too short!</div>\n *     </div>\n *   </md-input-container>\n *   <md-input-container>\n *     <label>Biography</label>\n *     <textarea name=\"bio\" ng-model=\"biography\" required md-maxlength=\"150\"></textarea>\n *     <div ng-messages=\"userForm.bio.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *     </div>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n *\n */\n\nfunction inputTextareaDirective($mdUtil, $window) {\n  return {\n    restrict: 'E',\n    require: ['^?mdInputContainer', '?ngModel'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n\n    var containerCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n    var isReadonly = angular.isDefined(attr.readonly);\n\n    if ( !containerCtrl ) return;\n    if (containerCtrl.input) {\n      throw new Error(\"<md-input-container> can only have *one* <input> or <textarea> child element!\");\n    }\n    containerCtrl.input = element;\n\n    element.addClass('md-input');\n    if (!element.attr('id')) {\n      element.attr('id', 'input_' + $mdUtil.nextUid());\n    }\n\n    if (element[0].tagName.toLowerCase() === 'textarea') {\n      setupTextarea();\n    }\n\n    var isErrorGetter = containerCtrl.isErrorGetter || function() {\n      return ngModelCtrl.$invalid && ngModelCtrl.$touched;\n    };\n    scope.$watch(isErrorGetter, containerCtrl.setInvalid);\n\n    ngModelCtrl.$parsers.push(ngModelPipelineCheckValue);\n    ngModelCtrl.$formatters.push(ngModelPipelineCheckValue);\n\n    element.on('input', inputCheckValue);\n\n    if (!isReadonly) {\n      element\n        .on('focus', function(ev) {\n          containerCtrl.setFocused(true);\n\n          // Error text should not appear before user interaction with the field.\n          // So we need to check on focus also\n          ngModelCtrl.$setTouched();\n          if ( isErrorGetter() ) containerCtrl.setInvalid(true);\n\n        })\n        .on('blur', function(ev) {\n          containerCtrl.setFocused(false);\n          inputCheckValue();\n        });\n\n    }\n\n    scope.$on('$destroy', function() {\n      containerCtrl.setFocused(false);\n      containerCtrl.setHasValue(false);\n      containerCtrl.input = null;\n    });\n\n    /**\n     *\n     */\n    function ngModelPipelineCheckValue(arg) {\n      containerCtrl.setHasValue(!ngModelCtrl.$isEmpty(arg));\n      return arg;\n    }\n    function inputCheckValue() {\n      // An input's value counts if its length > 0,\n      // or if the input's validity state says it has bad input (eg string in a number input)\n      containerCtrl.setHasValue(element.val().length > 0 || (element[0].validity||{}).badInput);\n    }\n\n    function setupTextarea() {\n      var node = element[0];\n      var onChangeTextarea = $mdUtil.debounce(growTextarea, 1);\n\n      function pipelineListener(value) {\n        onChangeTextarea();\n        return value;\n      }\n\n      if (ngModelCtrl) {\n        ngModelCtrl.$formatters.push(pipelineListener);\n        ngModelCtrl.$viewChangeListeners.push(pipelineListener);\n      } else {\n        onChangeTextarea();\n      }\n      element.on('keydown input', onChangeTextarea);\n      element.on('scroll', onScroll);\n      angular.element($window).on('resize', onChangeTextarea);\n\n      scope.$on('$destroy', function() {\n        angular.element($window).off('resize', onChangeTextarea);\n      });\n\n      function growTextarea() {\n        node.style.height = \"auto\";\n        node.scrollTop = 0;\n        var height = getHeight();\n        if (height) node.style.height = height + 'px';\n      }\n\n      function getHeight () {\n        var line = node.scrollHeight - node.offsetHeight;\n        return node.offsetHeight + (line > 0 ? line : 0);\n      }\n\n      function onScroll(e) {\n        node.scrollTop = 0;\n        // for smooth new line adding\n        var line = node.scrollHeight - node.offsetHeight;\n        var height = node.offsetHeight + line;\n        node.style.height = height + 'px';\n      }\n    }\n  }\n}\ninputTextareaDirective.$inject = [\"$mdUtil\", \"$window\"];\n\nfunction mdMaxlengthDirective($animate) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^mdInputContainer'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var maxlength;\n    var ngModelCtrl = ctrls[0];\n    var containerCtrl = ctrls[1];\n    var charCountEl = angular.element('<div class=\"md-char-counter\">');\n\n    // Stop model from trimming. This makes it so whitespace\n    // over the maxlength still counts as invalid.\n    attr.$set('ngTrim', 'false');\n    containerCtrl.element.append(charCountEl);\n\n    ngModelCtrl.$formatters.push(renderCharCount);\n    ngModelCtrl.$viewChangeListeners.push(renderCharCount);\n    element.on('input keydown', function() {\n      renderCharCount(); //make sure it's called with no args\n    });\n\n    scope.$watch(attr.mdMaxlength, function(value) {\n      maxlength = value;\n      if (angular.isNumber(value) && value > 0) {\n        if (!charCountEl.parent().length) {\n          $animate.enter(charCountEl, containerCtrl.element,\n                         angular.element(containerCtrl.element[0].lastElementChild));\n        }\n        renderCharCount();\n      } else {\n        $animate.leave(charCountEl);\n      }\n    });\n\n    ngModelCtrl.$validators['md-maxlength'] = function(modelValue, viewValue) {\n      if (!angular.isNumber(maxlength) || maxlength < 0) {\n        return true;\n      }\n      return ( modelValue || element.val() || viewValue || '' ).length <= maxlength;\n    };\n\n    function renderCharCount(value) {\n      charCountEl.text( ( element.val() || value || '' ).length + '/' + maxlength );\n      return value;\n    }\n  }\n}\nmdMaxlengthDirective.$inject = [\"$animate\"];\n\nfunction placeholderDirective() {\n  return {\n    restrict: 'A',\n    require: '^^?mdInputContainer',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, inputContainer) {\n    if (!inputContainer) return;\n\n    var placeholderText = attr.placeholder;\n    element.removeAttr('placeholder');\n\n    inputContainer.element.append('<div class=\"md-placeholder\">' + placeholderText + '</div>');\n  }\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/list/list.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-list {\n  padding: 8px 0px 8px 0px; }\n\nmd-item-content {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  box-sizing: border-box;\n  position: relative;\n  padding: 0px 0px 0px 0px; }\n\n/**\n * The left tile for a list item.\n */\n.md-tile-left {\n  min-width: 56px;\n  margin-right: -16px; }\n\n/**\n * The center content tile for a list item.\n */\n.md-tile-content {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  padding: 16px;\n  text-overflow: ellipsis; }\n  .md-tile-content h3 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 1.1em; }\n  .md-tile-content h4 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 0.9em; }\n  .md-tile-content p {\n    margin: 0 0 3px 0;\n    font-size: 0.75em; }\n\n/**\n * The right tile for a list item.\n */\n.md-tile-right {\n  padding-right: 0px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/list/list.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.list');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.list\n * @description\n * List module\n */\nangular.module('material.components.list', [\n  'material.core'\n])\n  .directive('mdList', mdListDirective)\n  .directive('mdItem', mdItemDirective);\n\n/**\n * @ngdoc directive\n * @name mdList\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-list>` directive is a list container for 1..n `<md-item>` tags.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-list>\n *   <md-item ng-repeat=\"item in todos\">\n *     <md-item-content>\n *       <div class=\"md-tile-left\">\n *         <img ng-src=\"{{item.face}}\" class=\"face\" alt=\"{{item.who}}\">\n *       </div>\n *       <div class=\"md-tile-content\">\n *         <h3>{{item.what}}</h3>\n *         <h4>{{item.who}}</h4>\n *         <p>\n *           {{item.notes}}\n *         </p>\n *       </div>\n *     </md-item-content>\n *   </md-item>\n * </md-list>\n * </hljs>\n *\n */\nfunction mdListDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'list'\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdItem\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-item>` directive is a container intended for row items in a `<md-list>` container.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-list>\n *    <md-item>\n *            Item content in list\n *    </md-item>\n *  </md-list>\n * </hljs>\n *\n */\nfunction mdItemDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'listitem'\n      });\n    }\n  };\n}\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/menu/menu.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.6.0\n */\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/menu/menu.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.6.0\n */\ngoog.provide('ng.material.components.menu');\n\n\nangular.module('material.components.menu', [\n])\n\n.factory('$mdMenu', MenuProvider);\n\nfunction MenuProvider($$interimElementProvider) {\n  return $$interimElementProvider('$mdMenu')\n    .setDefaults({\n      methods: ['placement'],\n      options: menuDefaultOptions\n    });\n\n  /* @ngInject */\n  function menuDefaultOptions() {\n\n  }\n}\nMenuProvider.$inject = [\"$$interimElementProvider\"];\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressCircular/progressCircular-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-progress-circular.md-THEME_NAME-theme {\n  background-color: transparent; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {\n    border-top-color: '{{primary-color}}';\n    border-bottom-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-top-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-right-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {\n    border-left-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {\n    border-top-color: '{{warn-color}}';\n    border-bottom-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-top-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-right-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {\n    border-left-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {\n    border-top-color: '{{accent-color}}';\n    border-bottom-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-top-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-right-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {\n    border-left-color: '{{accent-color}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressCircular/progressCircular.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n@-webkit-keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@-webkit-keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@-webkit-keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@-webkit-keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\n@keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\nmd-progress-circular {\n  width: 50px;\n  height: 50px;\n  display: block;\n  position: relative;\n  padding-top: 0 !important;\n  margin-bottom: 0 !important;\n  overflow: hidden; }\n  md-progress-circular .md-inner {\n    width: 50px;\n    height: 50px;\n    position: relative; }\n    md-progress-circular .md-inner .md-gap {\n      position: absolute;\n      left: 24px;\n      right: 24px;\n      top: 0;\n      bottom: 0;\n      border-top: 5px solid black;\n      box-sizing: border-box; }\n    md-progress-circular .md-inner .md-left, md-progress-circular .md-inner .md-right {\n      position: absolute;\n      top: 0;\n      height: 50px;\n      width: 25px;\n      overflow: hidden; }\n      md-progress-circular .md-inner .md-left .md-half-circle, md-progress-circular .md-inner .md-right .md-half-circle {\n        position: absolute;\n        top: 0;\n        width: 50px;\n        height: 50px;\n        box-sizing: border-box;\n        border-width: 5px;\n        border-style: solid;\n        border-color: black black transparent;\n        border-radius: 50%; }\n    md-progress-circular .md-inner .md-left {\n      left: 0; }\n      md-progress-circular .md-inner .md-left .md-half-circle {\n        left: 0;\n        border-right-color: transparent; }\n    md-progress-circular .md-inner .md-right {\n      right: 0; }\n      md-progress-circular .md-inner .md-right .md-half-circle {\n        right: 0;\n        border-left-color: transparent; }\n  md-progress-circular[value=\"0\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-135deg);\n            transform: rotate(-135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"1\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-131.4deg);\n            transform: rotate(-131.4deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"2\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-127.8deg);\n            transform: rotate(-127.8deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"3\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-124.2deg);\n            transform: rotate(-124.2deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"4\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-120.6deg);\n            transform: rotate(-120.6deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"5\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-117deg);\n            transform: rotate(-117deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"6\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-113.4deg);\n            transform: rotate(-113.4deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"7\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-109.8deg);\n            transform: rotate(-109.8deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"8\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-106.2deg);\n            transform: rotate(-106.2deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"9\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-102.6deg);\n            transform: rotate(-102.6deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"10\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-99deg);\n            transform: rotate(-99deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"11\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-95.4deg);\n            transform: rotate(-95.4deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"12\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-91.8deg);\n            transform: rotate(-91.8deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"13\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-88.2deg);\n            transform: rotate(-88.2deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"14\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-84.6deg);\n            transform: rotate(-84.6deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"15\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-81deg);\n            transform: rotate(-81deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"16\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-77.4deg);\n            transform: rotate(-77.4deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"17\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-73.8deg);\n            transform: rotate(-73.8deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"18\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-70.2deg);\n            transform: rotate(-70.2deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"19\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-66.6deg);\n            transform: rotate(-66.6deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"20\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-63deg);\n            transform: rotate(-63deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"21\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-59.4deg);\n            transform: rotate(-59.4deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"22\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-55.8deg);\n            transform: rotate(-55.8deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"23\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-52.2deg);\n            transform: rotate(-52.2deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"24\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-48.6deg);\n            transform: rotate(-48.6deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"25\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-45deg);\n            transform: rotate(-45deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"26\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-41.4deg);\n            transform: rotate(-41.4deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"27\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-37.8deg);\n            transform: rotate(-37.8deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"28\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-34.2deg);\n            transform: rotate(-34.2deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"29\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-30.6deg);\n            transform: rotate(-30.6deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"30\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-27deg);\n            transform: rotate(-27deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"31\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-23.4deg);\n            transform: rotate(-23.4deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"32\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-19.8deg);\n            transform: rotate(-19.8deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"33\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-16.2deg);\n            transform: rotate(-16.2deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"34\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-12.6deg);\n            transform: rotate(-12.6deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"35\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-9deg);\n            transform: rotate(-9deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"36\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-5.4deg);\n            transform: rotate(-5.4deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"37\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(-1.8deg);\n            transform: rotate(-1.8deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"38\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(1.8deg);\n            transform: rotate(1.8deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"39\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(5.4deg);\n            transform: rotate(5.4deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"40\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(9deg);\n            transform: rotate(9deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"41\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(12.6deg);\n            transform: rotate(12.6deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"42\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(16.2deg);\n            transform: rotate(16.2deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"43\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(19.8deg);\n            transform: rotate(19.8deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"44\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(23.4deg);\n            transform: rotate(23.4deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"45\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(27deg);\n            transform: rotate(27deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"46\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(30.6deg);\n            transform: rotate(30.6deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"47\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(34.2deg);\n            transform: rotate(34.2deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"48\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(37.8deg);\n            transform: rotate(37.8deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"49\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(41.4deg);\n            transform: rotate(41.4deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"50\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-right .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"51\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(138.6deg);\n            transform: rotate(138.6deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"52\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(142.2deg);\n            transform: rotate(142.2deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"53\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(145.8deg);\n            transform: rotate(145.8deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"54\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(149.4deg);\n            transform: rotate(149.4deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"55\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(153deg);\n            transform: rotate(153deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"56\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(156.6deg);\n            transform: rotate(156.6deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"57\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(160.2deg);\n            transform: rotate(160.2deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"58\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(163.8deg);\n            transform: rotate(163.8deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"59\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(167.4deg);\n            transform: rotate(167.4deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"60\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(171deg);\n            transform: rotate(171deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"61\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(174.6deg);\n            transform: rotate(174.6deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"62\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(178.2deg);\n            transform: rotate(178.2deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"63\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(181.8deg);\n            transform: rotate(181.8deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"64\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(185.4deg);\n            transform: rotate(185.4deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"65\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(189deg);\n            transform: rotate(189deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"66\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(192.6deg);\n            transform: rotate(192.6deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"67\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(196.2deg);\n            transform: rotate(196.2deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"68\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(199.8deg);\n            transform: rotate(199.8deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"69\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(203.4deg);\n            transform: rotate(203.4deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"70\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(207deg);\n            transform: rotate(207deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"71\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(210.6deg);\n            transform: rotate(210.6deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"72\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(214.2deg);\n            transform: rotate(214.2deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"73\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(217.8deg);\n            transform: rotate(217.8deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"74\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(221.4deg);\n            transform: rotate(221.4deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"75\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(225deg);\n            transform: rotate(225deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"76\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(228.6deg);\n            transform: rotate(228.6deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"77\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(232.2deg);\n            transform: rotate(232.2deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"78\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(235.8deg);\n            transform: rotate(235.8deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"79\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(239.4deg);\n            transform: rotate(239.4deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"80\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(243deg);\n            transform: rotate(243deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"81\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(246.6deg);\n            transform: rotate(246.6deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"82\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(250.2deg);\n            transform: rotate(250.2deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"83\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(253.8deg);\n            transform: rotate(253.8deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"84\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(257.4deg);\n            transform: rotate(257.4deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"85\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(261deg);\n            transform: rotate(261deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"86\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(264.6deg);\n            transform: rotate(264.6deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"87\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(268.2deg);\n            transform: rotate(268.2deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"88\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(271.8deg);\n            transform: rotate(271.8deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"89\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(275.4deg);\n            transform: rotate(275.4deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"90\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(279deg);\n            transform: rotate(279deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"91\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(282.6deg);\n            transform: rotate(282.6deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"92\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(286.2deg);\n            transform: rotate(286.2deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"93\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(289.8deg);\n            transform: rotate(289.8deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"94\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(293.4deg);\n            transform: rotate(293.4deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"95\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(297deg);\n            transform: rotate(297deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"96\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(300.6deg);\n            transform: rotate(300.6deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"97\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(304.2deg);\n            transform: rotate(304.2deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"98\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(307.8deg);\n            transform: rotate(307.8deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"99\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(311.4deg);\n            transform: rotate(311.4deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"100\"] .md-inner .md-left .md-half-circle {\n    transition: -webkit-transform 0.1s linear;\n    transition: transform 0.1s linear;\n    -webkit-transform: rotate(315deg);\n            transform: rotate(315deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper {\n    -webkit-animation: outer-rotate 2.91667s linear infinite;\n            animation: outer-rotate 2.91667s linear infinite; }\n    md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner {\n      -webkit-animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite;\n              animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle, md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-iteration-count: infinite;\n                animation-iteration-count: infinite;\n        -webkit-animation-duration: 1.3125s;\n                animation-duration: 1.3125s;\n        -webkit-animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1);\n                animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1); }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle {\n        -webkit-animation-name: left-wobble;\n                animation-name: left-wobble; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-name: right-wobble;\n                animation-name: right-wobble; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressCircular/progressCircular.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.progressCircular');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.progressCircular\n * @description Circular Progress module!\n */\nangular.module('material.components.progressCircular', [\n  'material.core'\n])\n  .directive('mdProgressCircular', MdProgressCircularDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressCircular\n * @module material.components.progressCircular\n * @restrict E\n *\n* @description\n * The circular progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of two modes: determinate and indeterminate.\n * @param {number=} value In determinate mode, this number represents the percentage of the circular progress. Default: 0\n * @param {number=} md-diameter This specifies the diamter of the circular progress. Default: 48\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-circular md-mode=\"determinate\" value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" ng-value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" value=\"...\" md-diameter=\"100\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"indeterminate\"></md-progress-circular>\n * </hljs>\n */\nfunction MdProgressCircularDirective($$rAF, $mdConstant, $mdTheming) {\n  var fillRotations = new Array(101),\n    fixRotations = new Array(101);\n\n  for (var i = 0; i < 101; i++) {\n    var percent = i / 100;\n    var rotation = Math.floor(percent * 180);\n\n    fillRotations[i] = 'rotate(' + rotation.toString() + 'deg)';\n    fixRotations[i] = 'rotate(' + (rotation * 2).toString() + 'deg)';\n  }\n\n  return {\n    restrict: 'E',\n    template:\n        '<div class=\"md-spinner-wrapper\">' +\n          '<div class=\"md-inner\">' +\n            '<div class=\"md-gap\"></div>' +\n            '<div class=\"md-left\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n            '<div class=\"md-right\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n          '</div>' +\n        '</div>',\n    compile: compile\n  };\n\n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var circle = element[0],\n      fill = circle.querySelectorAll('.md-fill, .md-mask.md-full'),\n      fix = circle.querySelectorAll('.md-fill.md-fix'),\n      i, clamped, fillRotation, fixRotation;\n\n    var diameter = attr.mdDiameter || 48;\n    var scale = diameter/48;\n\n    circle.style[$mdConstant.CSS.TRANSFORM] = 'scale(' + scale.toString() + ')';\n\n    attr.$observe('value', function(value) {\n      clamped = clamp(value);\n      fillRotation = fillRotations[clamped];\n      fixRotation = fixRotations[clamped];\n\n      element.attr('aria-valuenow', clamped);\n\n      for (i = 0; i < fill.length; i++) {\n        fill[i].style[$mdConstant.CSS.TRANSFORM] = fillRotation;\n      }\n\n      for (i = 0; i < fix.length; i++) {\n        fix[i].style[$mdConstant.CSS.TRANSFORM] = fixRotation;\n      }\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressCircularDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressLinear/progressLinear-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-progress-linear.md-THEME_NAME-theme .md-container {\n  background-color: '{{primary-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme .md-bar {\n  background-color: '{{primary-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-container {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {\n  background-color: '{{warn-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-container {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {\n  background-color: '{{accent-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {\n  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {\n  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressLinear/progressLinear.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-progress-linear {\n  display: block;\n  width: 100%;\n  height: 5px; }\n  md-progress-linear .md-container {\n    overflow: hidden;\n    position: relative;\n    height: 5px;\n    top: 5px;\n    -webkit-transform: translate(0, 5px) scale(1, 0);\n            transform: translate(0, 5px) scale(1, 0);\n    transition: all 0.3s linear; }\n  md-progress-linear .md-container.md-ready {\n    -webkit-transform: translate(0, 0) scale(1, 1);\n            transform: translate(0, 0) scale(1, 1); }\n  md-progress-linear .md-bar {\n    height: 5px;\n    position: absolute;\n    width: 100%; }\n  md-progress-linear .md-bar1, md-progress-linear .md-bar2 {\n    transition: all 0.2s linear; }\n  md-progress-linear[md-mode=determinate] .md-bar1 {\n    display: none; }\n  md-progress-linear[md-mode=indeterminate] .md-bar1 {\n    -webkit-animation: indeterminate1 4s infinite linear;\n            animation: indeterminate1 4s infinite linear; }\n  md-progress-linear[md-mode=indeterminate] .md-bar2 {\n    -webkit-animation: indeterminate2 4s infinite linear;\n            animation: indeterminate2 4s infinite linear; }\n  md-progress-linear[md-mode=buffer] .md-container {\n    background-color: transparent !important; }\n  md-progress-linear[md-mode=buffer] .md-dashed:before {\n    content: \"\";\n    display: block;\n    height: 5px;\n    width: 100%;\n    margin-top: 0px;\n    position: absolute;\n    background-color: transparent;\n    background-size: 10px 10px !important;\n    background-position: 0px -23px;\n    -webkit-animation: buffer 3s infinite linear;\n            animation: buffer 3s infinite linear; }\n  md-progress-linear[md-mode=query] .md-bar2 {\n    -webkit-animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1);\n            animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1); }\n\n@-webkit-keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@-webkit-keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@-webkit-keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@-webkit-keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n\n@keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/progressLinear/progressLinear.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.progressLinear');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.progressLinear\n * @description Linear Progress module!\n */\nangular.module('material.components.progressLinear', [\n  'material.core'\n])\n  .directive('mdProgressLinear', MdProgressLinearDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressLinear\n * @module material.components.progressLinear\n * @restrict E\n *\n * @description\n * The linear progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content. Each operation should only be represented by one activity indicator—for example, one refresh operation should not display both a refresh bar and an activity circle.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n * @param {number=} md-buffer-value In the buffer mode, this number represents the precentage of the secondary progress bar. Default: 0\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-linear md-mode=\"determinate\" value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"determinate\" ng-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"indeterminate\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"buffer\" value=\"...\" md-buffer-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"query\"></md-progress-linear>\n * </hljs>\n */\nfunction MdProgressLinearDirective($$rAF, $mdConstant, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    template: '<div class=\"md-container\">' +\n      '<div class=\"md-dashed\"></div>' +\n      '<div class=\"md-bar md-bar1\"></div>' +\n      '<div class=\"md-bar md-bar2\"></div>' +\n      '</div>',\n    compile: compile\n  };\n  \n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var bar1Style = element[0].querySelector('.md-bar1').style,\n      bar2Style = element[0].querySelector('.md-bar2').style,\n      container = angular.element(element[0].querySelector('.md-container'));\n\n    attr.$observe('value', function(value) {\n      if (attr.mdMode == 'query') {\n        return;\n      }\n\n      var clamped = clamp(value);\n      element.attr('aria-valuenow', clamped);\n      bar2Style[$mdConstant.CSS.TRANSFORM] = transforms[clamped];\n    });\n\n    attr.$observe('mdBufferValue', function(value) {\n      bar1Style[$mdConstant.CSS.TRANSFORM] = transforms[clamp(value)];\n    });\n\n    $$rAF(function() {\n      container.addClass('md-ready');\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressLinearDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n\n\n// **********************************************************\n// Private Methods\n// **********************************************************\nvar transforms = (function() {\n  var values = new Array(101);\n  for(var i = 0; i < 101; i++){\n    values[i] = makeTransform(i);\n  }\n\n  return values;\n\n  function makeTransform(value){\n    var scale = value/100;\n    var translateX = (value-100)/2;\n    return 'translateX(' + translateX.toString() + '%) scale(' + scale.toString() + ', 1)';\n  }\n})();\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/radioButton/radioButton-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-radio-button.md-THEME_NAME-theme .md-off {\n  border-color: '{{foreground-2}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-on {\n  background-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-off {\n  border-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {\n  color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-container .md-ripple {\n  color: '{{accent-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {\n  background-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {\n  border-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {\n  color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {\n  color: '{{primary-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {\n  background-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {\n  border-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {\n  color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {\n  color: '{{warn-600}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {\n  border-color: '{{foreground-3}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {\n  border-color: '{{foreground-3}}'; }\n\nmd-radio-group.md-THEME_NAME-theme:focus:not(:empty) {\n  border-color: '{{foreground-1}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/radioButton/radioButton.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-radio-button, .md-switch-thumb {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer; }\n  md-radio-button input, .md-switch-thumb input {\n    display: none; }\n  md-radio-button .md-container, .md-switch-thumb .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    cursor: pointer; }\n    md-radio-button .md-container .md-ripple-container, .md-switch-thumb .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: 48px;\n      height: 48px;\n      left: -16px;\n      top: -16px; }\n  md-radio-button .md-off, .md-switch-thumb .md-off {\n    position: absolute;\n    top: 0px;\n    left: 0px;\n    width: 16px;\n    height: 16px;\n    border: solid 2px;\n    border-radius: 50%;\n    transition: border-color ease 0.28s; }\n  md-radio-button .md-on, .md-switch-thumb .md-on {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 16px;\n    height: 16px;\n    border-radius: 50%;\n    transition: -webkit-transform ease 0.28s;\n    transition: transform ease 0.28s;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n  md-radio-button.md-checked .md-on, .md-switch-thumb.md-checked .md-on {\n    -webkit-transform: scale(0.55);\n            transform: scale(0.55); }\n  md-radio-button .md-label, .md-switch-thumb .md-label {\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    margin-right: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    width: auto; }\n  md-radio-button .circle, .md-switch-thumb .circle {\n    border-radius: 50%; }\n\nmd-radio-group {\n  border: 1px dotted transparent;\n  display: block;\n  outline: none; }\n\n.radioButtondemoBasicUsage md-radio-group {\n  border: none; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/radioButton/radioButton.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.radioButton');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.radioButton\n * @description radioButton module!\n */\nangular.module('material.components.radioButton', [\n  'material.core'\n])\n  .directive('mdRadioGroup', mdRadioGroupDirective)\n  .directive('mdRadioButton', mdRadioButtonDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioGroup\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-group>` directive identifies a grouping\n * container for the 1..n grouped radio buttons; specified using nested\n * `<md-radio-button>` tags.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the radio button is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * Note: `<md-radio-group>` and `<md-radio-button>` handle tabindex differently\n * than the native `<input type='radio'>` controls. Whereas the native controls\n * force the user to tab through all the radio buttons, `<md-radio-group>`\n * is focusable, and by default the `<md-radio-button>`s are not.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-radio-group ng-model=\"selected\">\n *\n *   <md-radio-button\n *        ng-repeat=\"d in colorOptions\"\n *        ng-value=\"d.value\" aria-label=\"{{ d.label }}\">\n *\n *          {{ d.label }}\n *\n *   </md-radio-button>\n *\n * </md-radio-group>\n * </hljs>\n *\n */\nfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming) {\n  RadioGroupController.prototype = createRadioGroupControllerProto();\n\n  return {\n    restrict: 'E',\n    controller: ['$element', RadioGroupController],\n    require: ['mdRadioGroup', '?ngModel'],\n    link: { pre: linkRadioGroup }\n  };\n\n  function linkRadioGroup(scope, element, attr, ctrls) {\n    $mdTheming(element);\n    var rgCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\n    function keydownListener(ev) {\n      switch(ev.keyCode) {\n        case $mdConstant.KEY_CODE.LEFT_ARROW:\n        case $mdConstant.KEY_CODE.UP_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectPrevious();\n          break;\n\n        case $mdConstant.KEY_CODE.RIGHT_ARROW:\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectNext();\n          break;\n\n        case $mdConstant.KEY_CODE.ENTER:\n          var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n          if (form.length > 0) {\n            form.triggerHandler('submit');\n          }\n          break;\n      }\n    }\n\n    rgCtrl.init(ngModelCtrl);\n\n    element.attr({\n              'role': 'radiogroup',\n              'tabIndex': element.attr('tabindex') || '0'\n            })\n            .on('keydown', keydownListener);\n\n  }\n\n  function RadioGroupController($element) {\n    this._radioButtonRenderFns = [];\n    this.$element = $element;\n  }\n\n  function createRadioGroupControllerProto() {\n    return {\n      init: function(ngModelCtrl) {\n        this._ngModelCtrl = ngModelCtrl;\n        this._ngModelCtrl.$render = angular.bind(this, this.render);\n      },\n      add: function(rbRender) {\n        this._radioButtonRenderFns.push(rbRender);\n      },\n      remove: function(rbRender) {\n        var index = this._radioButtonRenderFns.indexOf(rbRender);\n        if (index !== -1) {\n          this._radioButtonRenderFns.splice(index, 1);\n        }\n      },\n      render: function() {\n        this._radioButtonRenderFns.forEach(function(rbRender) {\n          rbRender();\n        });\n      },\n      setViewValue: function(value, eventType) {\n        this._ngModelCtrl.$setViewValue(value, eventType);\n        // update the other radio buttons as well\n        this.render();\n      },\n      getViewValue: function() {\n        return this._ngModelCtrl.$viewValue;\n      },\n      selectNext: function() {\n        return changeSelectedButton(this.$element, 1);\n      },\n      selectPrevious: function() {\n        return changeSelectedButton(this.$element, -1);\n      },\n      setActiveDescendant: function (radioId) {\n        this.$element.attr('aria-activedescendant', radioId);\n      }\n    };\n  }\n  /**\n   * Change the radio group's selected button by a given increment.\n   * If no button is selected, select the first button.\n   */\n  function changeSelectedButton(parent, increment) {\n    // Coerce all child radio buttons into an array, then wrap then in an iterator\n    var buttons = $mdUtil.iterator(parent[0].querySelectorAll('md-radio-button'), true);\n\n    if (buttons.count()) {\n      var validate = function (button) {\n        // If disabled, then NOT valid\n        return !angular.element(button).attr(\"disabled\");\n      };\n      var selected = parent[0].querySelector('md-radio-button.md-checked');\n      var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n      // Activate radioButton's click listener (triggerHandler won't create a real click event)\n      angular.element(target).triggerHandler('click');\n\n\n    }\n  }\n\n}\nmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioButton\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-button>`directive is the child directive required to be used within `<md-radio-group>` elements.\n *\n * While similar to the `<input type=\"radio\" ng-model=\"\" value=\"\">` directive,\n * the `<md-radio-button>` directive provides ink effects, ARIA support, and\n * supports use within named radio groups.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {string} ngValue Angular expression which sets the value to which the expression should\n *    be set when selected.*\n * @param {string} value The value to which the expression should be set when selected.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} ariaLabel Adds label to radio button for accessibility.\n * Defaults to radio button's text. If no text content is available, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-radio-button value=\"1\" aria-label=\"Label 1\">\n *   Label 1\n * </md-radio-button>\n *\n * <md-radio-button ng-model=\"color\" ng-value=\"specialValue\" aria-label=\"Green\">\n *   Green\n * </md-radio-button>\n *\n * </hljs>\n *\n */\nfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    require: '^mdRadioGroup',\n    transclude: true,\n    template: '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n                '<div class=\"md-off\"></div>' +\n                '<div class=\"md-on\"></div>' +\n              '</div>' +\n              '<div ng-transclude class=\"md-label\"></div>',\n    link: link\n  };\n\n  function link(scope, element, attr, rgCtrl) {\n    var lastChecked;\n\n    $mdTheming(element);\n    configureAria(element, scope);\n\n    rgCtrl.add(render);\n    attr.$observe('value', render);\n\n    element\n      .on('click', listener)\n      .on('$destroy', function() {\n        rgCtrl.remove(render);\n      });\n\n    function listener(ev) {\n      if (element[0].hasAttribute('disabled')) return;\n\n      scope.$apply(function() {\n        rgCtrl.setViewValue(attr.value, ev && ev.type);\n      });\n    }\n\n    function render() {\n      var checked = (rgCtrl.getViewValue() == attr.value);\n      if (checked === lastChecked) {\n        return;\n      }\n      lastChecked = checked;\n      element.attr('aria-checked', checked);\n      if (checked) {\n        element.addClass(CHECKED_CSS);\n        rgCtrl.setActiveDescendant(element.attr('id'));\n      } else {\n        element.removeClass(CHECKED_CSS);\n      }\n    }\n    /**\n     * Inject ARIA-specific attributes appropriate for each radio button\n     */\n    function configureAria( element, scope ){\n      scope.ariaId = buildAriaID();\n\n      element.attr({\n        'id' :  scope.ariaId,\n        'role' : 'radio',\n        'aria-checked' : 'false'\n      });\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      /**\n       * Build a unique ID for each radio button that will be used with aria-activedescendant.\n       * Preserve existing ID if already specified.\n       * @returns {*|string}\n       */\n      function buildAriaID() {\n        return attr.id || ( 'radio' + \"_\" + $mdUtil.nextUid() );\n      }\n    }\n  }\n}\nmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/select/select-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label {\n  border-bottom-color: '{{primary-color}}';\n  color: '{{ foreground-1 }}'; }\n  md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label.md-placeholder {\n    color: '{{ foreground-1 }}'; }\nmd-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-label {\n  border-bottom-color: '{{accent-color}}'; }\nmd-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-label {\n  border-bottom-color: '{{warn-color}}'; }\nmd-select.md-THEME_NAME-theme[disabled] .md-select-label {\n  color: '{{foreground-3}}'; }\n  md-select.md-THEME_NAME-theme[disabled] .md-select-label.md-placeholder {\n    color: '{{foreground-3}}'; }\nmd-select.md-THEME_NAME-theme .md-select-label {\n  border-bottom-color: '{{foreground-4}}'; }\n  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {\n    color: '{{foreground-2}}'; }\n\nmd-select-menu.md-THEME_NAME-theme md-optgroup {\n  color: '{{foreground-2}}'; }\n  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {\n    color: '{{foreground-1}}'; }\nmd-select-menu.md-THEME_NAME-theme md-option[selected] {\n  background-color: '{{primary-50}}'; }\n  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {\n    background-color: '{{primary-100}}'; }\n  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {\n    background-color: '{{accent-50}}'; }\n    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {\n      background-color: '{{accent-100}}'; }\nmd-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {\n  background: '{{background-200}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/select/select.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n.md-select-menu-container {\n  position: absolute;\n  left: 0;\n  top: 0;\n  z-index: 99;\n  opacity: 0; }\n  .md-select-menu-container:not(.md-clickable) {\n    pointer-events: none; }\n  .md-select-menu-container md-progress-circular {\n    display: table;\n    margin: 24px auto !important; }\n  .md-select-menu-container.md-active {\n    opacity: 1; }\n    .md-select-menu-container.md-active md-select-menu {\n      transition: -webkit-transform all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition: transform all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      transition-duration: 200ms; }\n      .md-select-menu-container.md-active md-select-menu > * {\n        opacity: 1;\n        transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n        transition-duration: 200ms;\n        transition-delay: 100ms; }\n  .md-select-menu-container.md-leave {\n    opacity: 0;\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    transition-duration: 250ms; }\n\nmd-select {\n  display: inline-block;\n  margin-top: 20px; }\n  md-select[disabled]:hover {\n    cursor: default; }\n  md-select:not([disabled]):hover {\n    cursor: pointer; }\n  md-select:not([disabled]):focus .md-select-label {\n    border-bottom: 2px solid;\n    padding-bottom: 7px; }\n\n.md-select-label {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  padding-top: 9px;\n  padding-right: 32px;\n  padding-bottom: 8px;\n  border-bottom: 1px solid;\n  font-size: 0.875em;\n  line-height: 0.8em;\n  position: relative;\n  box-sizing: border-box;\n  min-width: 64px; }\n  .md-select-label .md-select-icon:after {\n    content: '\\25BC';\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    position: absolute;\n    height: 100%;\n    top: 0px;\n    right: 2px;\n    speak: none;\n    -webkit-transform: scaleY(0.6) scaleX(1);\n            transform: scaleY(0.6) scaleX(1); }\n\nmd-select-menu {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0;\n  -webkit-transform: scale(1);\n          transform: scale(1);\n  max-height: 256px;\n  overflow-y: scroll; }\n  md-select-menu.md-reverse {\n    -webkit-flex-direction: column-reverse;\n        -ms-flex-direction: column-reverse;\n            flex-direction: column-reverse; }\n  md-select-menu:not(.md-overflow) md-content {\n    padding-top: 8px;\n    padding-bottom: 8px; }\n  md-select-menu md-content {\n    min-width: 136px; }\n  md-select-menu > * {\n    opacity: 0; }\n\nmd-option {\n  cursor: pointer;\n  position: relative;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  width: auto;\n  padding: 0 16px 0 16px;\n  height: 48px; }\n  md-option .md-text {\n    width: auto;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    font-size: 0.875em; }\n\nmd-optgroup {\n  display: block; }\n  md-optgroup label {\n    display: block;\n    font-size: 0.75em;\n    text-transform: uppercase;\n    padding: 16px 8px; }\n  md-optgroup md-option {\n    padding-left: 24px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/select/select.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.select');\ngoog.require('ng.material.components.backdrop');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n/**\n * @ngdoc module\n * @name material.components.select\n */\n\n/***************************************************\n\n### TODO ###\n**DOCUMENTATION AND DEMOS**\n\n- [ ] ng-model with child mdOptions (basic)\n- [ ] ng-model=\"foo\" ng-model-options=\"{ trackBy: '$value.id' }\" for objects\n- [ ] mdOption with value\n- [ ] Usage with input inside\n- [ ] Usage with md-multiple\n\n### TODO - POST RC1 ###\n- [ ] Abstract placement logic in $mdSelect service to $mdMenu service\n\n***************************************************/\n\nvar SELECT_EDGE_MARGIN = 8;\nvar selectNextId = 0;\n\nangular.module('material.components.select', [\n  'material.core',\n  'material.components.backdrop'\n])\n.directive('mdSelect', SelectDirective)\n.directive('mdSelectMenu', SelectMenuDirective)\n.directive('mdOption', OptionDirective)\n.directive('mdOptgroup', OptgroupDirective)\n.provider('$mdSelect', SelectProvider);\n\n\n/**\n * @ngdoc directive\n * @name mdSelect\n * @restrict E\n * @module material.components.select\n *\n * @description Displays a select box, bound to an ng-model.\n *\n * @param {expression} ng-model The model!\n * @param {boolean=} multiple Whether it's multiple.\n * @param {string=} placeholder Placeholder hint text.\n *\n * @usage\n * With a placeholder (label is added dynamically)\n * <hljs lang=\"html\">\n *   <md-select\n *     ng-model=\"someModel\"\n *     placeholder=\"Select a state\">\n *     <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *   </md-select>\n * </hljs>\n *\n * With an explicit label\n * <hljs lang=\"html\">\n *   <md-select\n *     ng-model=\"someModel\">\n *     <md-select-label>Select a state</md-select-label>\n *     <md-option ng-value=\"opt\" ng-repeat=\"opt in neighborhoods2\">{{ opt }}</md-option>\n *   </md-select>\n * </hljs>\n */\nfunction SelectDirective($mdSelect, $mdUtil, $mdTheming, $interpolate, $compile, $parse) {\n  var intStart = $interpolate.startSymbol();\n  var intEnd = $interpolate.endSymbol();\n\n  return {\n    restrict: 'E',\n    require: '?ngModel',\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    // The user is allowed to provide a label for the select as md-select-label child\n    var labelEl = element.find('md-select-label').remove();\n\n    // If not provided, we automatically make one\n    if (!labelEl.length) {\n      labelEl = angular.element('<md-select-label><span></span></md-select-label>');\n    }\n    labelEl.append('<span class=\"md-select-icon\" aria-hidden=\"true\"></span>');\n    labelEl.addClass('md-select-label');\n    labelEl.addClass(intStart + attr.ngModel + ' !== undefined ? \\'\\' : \\'md-placeholder\\'' + intEnd);\n    labelEl.attr('id', 'select_label_' + $mdUtil.nextUid());\n\n    // There's got to be an md-content inside. If there's not one, let's add it.\n    if (!element.find('md-content').length) {\n      element.append( angular.element('<md-content>').append(element.contents()) );\n    }\n\n    // Add progress spinner for md-options-loading\n    if (attr.mdOnOpen) {\n      element.find('md-content').prepend(\n        angular.element('<md-progress-circular>')\n               .attr('md-mode', 'indeterminate')\n               .attr('ng-hide', '$$loadingAsyncDone')\n               .wrap('<div>')\n               .parent()\n      );\n    }\n\n    // Use everything that's left inside element.contents() as the contents of the menu\n    var selectTemplate = angular.element(\n      '<div class=\"md-select-menu-container\">' +\n        '<md-select-menu ' +\n        (angular.isDefined(attr.multiple) ? 'multiple' : '') + '>' +\n          element.html() +\n        '</md-select-menu></div>');\n\n    element.empty().append(labelEl);\n\n    $mdTheming(element);\n\n    return function postLink(scope, element, attr, ngModel) {\n      var isOpen;\n      var labelEl = element.find('md-select-label');\n      var customLabel = labelEl.text().length !== 0;\n      if (!customLabel) labelEl = labelEl.children().eq(0);\n      setInitialLabelValue();\n\n      attr.$observe('disabled', function(disabled) {\n        if (disabled !== undefined) {\n          element.attr('tabindex', -1);\n          element.off('click', openSelect);\n          element.off('keydown', openOnKeypress);\n        } else {\n          element.attr('tabindex', 0);\n          element.on('click', openSelect);\n          element.on('keydown', openOnKeypress);\n        }\n      });\n\n      if (attr.disabled === undefined) {\n        element.on('click', openSelect);\n        element.on('keydown', openOnKeypress);\n      }\n\n      element.attr({\n        'role': 'combobox',\n        'id': 'select_' + $mdUtil.nextUid(),\n        'aria-haspopup': true,\n        'aria-expanded': 'false',\n        'aria-labelledby': labelEl.attr('id')\n      });\n\n      scope.$on('$destroy', function() {\n        if (isOpen) {\n          $mdSelect.cancel();\n        }\n      });\n\n      // Create a fake select to find out the label value\n      function setInitialLabelValue() {\n        if ($parse(attr.ngModel)(scope)) {\n          var fakeSelectEl = angular.element(selectTemplate).find('md-select-menu');\n          fakeSelectEl.data('$ngModelController', ngModel);\n          var fakeSelectScope = scope.$new();\n          fakeSelectEl = $compile(fakeSelectEl)(fakeSelectScope);\n          var fakeSelectCtrl = fakeSelectEl.controller('mdSelectMenu');\n          fakeSelectScope.$$postDigest(function() {\n            ngModel.$render();\n            setLabelText(fakeSelectCtrl.selectedLabels());\n            fakeSelectEl.scope().$destroy();\n          });\n        } else {\n          setLabelText();\n        }\n      }\n\n      function setLabelText(text) {\n        if (customLabel) return; // Assume that user is handling it on their own\n        var newText = text || attr.placeholder;\n        labelEl.html(newText);\n      }\n\n      function openOnKeypress(e) {\n        var allowedCodes = [32, 13, 38, 40];\n        if (allowedCodes.indexOf(e.keyCode) != -1 ) {\n          // prevent page scrolling on interaction\n          e.preventDefault();\n          openSelect(e);\n        }\n      }\n\n      function openSelect() {\n        scope.$evalAsync(function() {\n          var selectEl = selectTemplate.clone();\n          selectEl.find('md-select-menu').data('$ngModelController', ngModel);\n          isOpen = true;\n          $mdSelect.show({\n            scope: scope.$new(),\n            element: selectEl,\n            target: element[0],\n            hasBackdrop: true,\n            loadingAsync: attr.mdOnOpen ? scope.$eval(attr.mdOnOpen) : false,\n            setLabelText: setLabelText\n          }).then(function(selectedText) {\n            isOpen = false;\n          });\n        });\n      }\n    };\n\n  }\n}\nSelectDirective.$inject = [\"$mdSelect\", \"$mdUtil\", \"$mdTheming\", \"$interpolate\", \"$compile\", \"$parse\"];\n\nfunction SelectMenuDirective($parse, $mdUtil, $mdTheming) {\n\n  SelectMenuController.$inject = [\"$scope\", \"$attrs\", \"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdSelectMenu', '?ngModel'],\n    controller: SelectMenuController,\n    link: { pre: preLink }\n  };\n\n  // We use preLink instead of postLink to ensure that the select is initialized before\n  // its child options run postLink.\n  function preLink(scope, element, attr, ctrls) {\n    var selectCtrl = ctrls[0];\n    var ngModel = ctrls[1];\n\n    $mdTheming(element);\n    element.on('click', clickListener);\n    element.on('keypress', keyListener);\n    if (ngModel) selectCtrl.init(ngModel);\n    configureAria();\n\n    function configureAria() {\n      element.attr({\n        'id': 'select_menu_' + $mdUtil.nextUid(),\n        'role': 'listbox',\n        'aria-multiselectable': (selectCtrl.isMultiple ? 'true' : 'false')\n      });\n    }\n\n    function keyListener(e) {\n      if (e.keyCode == 13 || e.keyCode == 32) {\n        clickListener(e);\n      }\n    }\n\n    function clickListener(ev) {\n      var option = $mdUtil.getClosest(ev.target, 'md-option');\n      var optionCtrl = option && angular.element(option).data('$mdOptionController');\n      if (!option || !optionCtrl) return;\n\n      var optionHashKey = selectCtrl.hashGetter(optionCtrl.value);\n      var isSelected = angular.isDefined(selectCtrl.selected[optionHashKey]);\n\n      scope.$apply(function() {\n        if (selectCtrl.isMultiple) {\n          if (isSelected) {\n            selectCtrl.deselect(optionHashKey);\n          } else {\n            selectCtrl.select(optionHashKey, optionCtrl.value);\n          }\n        } else {\n          if (!isSelected) {\n            selectCtrl.deselect( Object.keys(selectCtrl.selected)[0] );\n            selectCtrl.select( optionHashKey, optionCtrl.value );\n          }\n        }\n        selectCtrl.refreshViewValue();\n      });\n    }\n  }\n\n\n\n  function SelectMenuController($scope, $attrs, $element) {\n    var self = this;\n    self.isMultiple = angular.isDefined($attrs.multiple);\n    // selected is an object with keys matching all of the selected options' hashed values\n    self.selected = {};\n    // options is an object with keys matching every option's hash value,\n    // and values matching every option's controller.\n    self.options = {};\n\n\n    self.init = function(ngModel) {\n      self.ngModel = ngModel;\n\n      // Allow users to provide `ng-model=\"foo\" ng-model-options=\"{trackBy: 'foo.id'}\"` so\n      // that we can properly compare objects set on the model to the available options\n      if (ngModel.$options && ngModel.$options.trackBy) {\n        var trackByLocals = {};\n        var trackByParsed = $parse(ngModel.$options.trackBy);\n        self.hashGetter = function(value, valueScope) {\n          trackByLocals.$value = value;\n          return trackByParsed(valueScope || $scope, trackByLocals);\n        };\n      // If the user doesn't provide a trackBy, we automatically generate an id for every\n      // value passed in\n      } else {\n        self.hashGetter = function getHashValue(value) {\n          if (angular.isObject(value)) {\n            return '$$object_' + (value.$$mdSelectId || (value.$$mdSelectId = ++selectNextId));\n          }\n          return value;\n        };\n      }\n\n      if (self.isMultiple) {\n        ngModel.$validators['md-multiple'] = validateArray;\n        ngModel.$render = renderMultiple;\n\n        // watchCollection on the model because by default ngModel only watches the model's\n        // reference. This allowed the developer to also push and pop from their array.\n        $scope.$watchCollection($attrs.ngModel, function(value) {\n          if (validateArray(value)) renderMultiple(value);\n        });\n      } else {\n        ngModel.$render = renderSingular;\n      }\n\n      function validateArray(modelValue, viewValue) {\n        // If a value is truthy but not an array, reject it.\n        // If value is undefined/falsy, accept that it's an empty array.\n        return angular.isArray(modelValue || viewValue || []);\n      }\n    };\n\n    self.selectedLabels = function() {\n      var selectedOptionEls = nodesToArray($element[0].querySelectorAll('md-option[selected]'));\n      if (selectedOptionEls.length) {\n        return selectedOptionEls.map(function(el) { return el.textContent; }).join(', ');\n      } else {\n        return '';\n      }\n    };\n\n    self.select = function(hashKey, hashedValue) {\n      var option = self.options[hashKey];\n      option && option.setSelected(true);\n      self.selected[hashKey] = hashedValue;\n    };\n    self.deselect = function(hashKey) {\n      var option = self.options[hashKey];\n      option && option.setSelected(false);\n      delete self.selected[hashKey];\n    };\n\n    self.addOption = function(hashKey, optionCtrl) {\n      if (angular.isDefined(self.options[hashKey])) {\n        throw new Error('Duplicate md-option values are not allowed in a select. ' +\n                        'Duplicate value \"' + optionCtrl.value + '\" found.');\n      }\n      self.options[hashKey] = optionCtrl;\n\n      // If this option's value was already in our ngModel, go ahead and select it.\n      if (angular.isDefined(self.selected[hashKey])) {\n        self.select(hashKey, optionCtrl.value);\n        self.refreshViewValue();\n      }\n    };\n    self.removeOption = function(hashKey) {\n      delete self.options[hashKey];\n      // Don't deselect an option when it's removed - the user's ngModel should be allowed\n      // to have values that do not match a currently available option.\n    };\n\n    self.refreshViewValue = function() {\n      var values = [];\n      var option;\n      for (var hashKey in self.selected) {\n         // If this hashKey has an associated option, push that option's value to the model.\n         if ((option = self.options[hashKey])) {\n           values.push(option.value);\n         } else {\n           // Otherwise, the given hashKey has no associated option, and we got it\n           // from an ngModel value at an earlier time. Push the unhashed value of\n           // this hashKey to the model.\n           // This allows the developer to put a value in the model that doesn't yet have\n           // an associated option.\n           values.push(self.selected[hashKey]);\n         }\n      }\n      self.ngModel.$setViewValue(self.isMultiple ? values : values[0]);\n    };\n\n    function renderMultiple() {\n      var newSelectedValues = self.ngModel.$modelValue || self.ngModel.$viewValue;\n      if (!angular.isArray(newSelectedValues)) return;\n\n      var oldSelected = Object.keys(self.selected);\n\n      var newSelectedHashes = newSelectedValues.map(self.hashGetter);\n      var deselected = oldSelected.filter(function(hash) {\n        return newSelectedHashes.indexOf(hash) === -1;\n      });\n\n      deselected.forEach(self.deselect);\n      newSelectedHashes.forEach(function(hashKey, i) {\n        self.select(hashKey, newSelectedValues[i]);\n      });\n    }\n    function renderSingular() {\n      var value = self.ngModel.$viewValue || self.ngModel.$modelValue;\n      Object.keys(self.selected).forEach(self.deselect);\n      self.select( self.hashGetter(value), value );\n    }\n  }\n\n}\nSelectMenuDirective.$inject = [\"$parse\", \"$mdUtil\", \"$mdTheming\"];\n\nfunction OptionDirective($mdInkRipple, $mdUtil) {\n\n  OptionController.$inject = [\"$element\"];\n  return {\n    restrict: 'E',\n    require: ['mdOption', '^^mdSelectMenu'],\n    controller: OptionController,\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    // Manual transclusion to avoid the extra inner <span> that ng-transclude generates\n    element.append( angular.element('<div class=\"md-text\">').append(element.contents()) );\n    if (attr.tabindex === undefined) element.attr('tabindex', 0);\n    return postLink;\n  }\n\n  function postLink(scope, element, attr, ctrls) {\n    var optionCtrl = ctrls[0];\n    var selectCtrl = ctrls[1];\n\n    if (angular.isDefined(attr.ngValue)) {\n      scope.$watch(attr.ngValue, setOptionValue);\n    } else if (angular.isDefined(attr.value)) {\n      setOptionValue(attr.value);\n    } else {\n      throw new Error(\"Expected either ngValue or value attr\");\n    }\n\n    $mdInkRipple.attachButtonBehavior(scope, element);\n    configureAria();\n\n    function setOptionValue(newValue, oldValue) {\n      var oldHashKey = selectCtrl.hashGetter(oldValue, scope);\n      var newHashKey = selectCtrl.hashGetter(newValue, scope);\n\n      optionCtrl.hashKey = newHashKey;\n      optionCtrl.value = newValue;\n\n      selectCtrl.removeOption(oldHashKey, optionCtrl);\n      selectCtrl.addOption(newHashKey, optionCtrl);\n    }\n\n    scope.$on('$destroy', function() {\n      selectCtrl.removeOption(optionCtrl.hashKey, optionCtrl);\n    });\n\n    function configureAria() {\n      element.attr({\n        'role': 'option',\n        'aria-selected': 'false',\n        'id': 'select_option_'+ $mdUtil.nextUid()\n      });\n    }\n  }\n\n  function OptionController($element) {\n    this.selected = false;\n    this.setSelected = function(isSelected) {\n      if (isSelected && !this.selected) {\n        $element.attr({\n          'selected': 'selected',\n          'aria-selected': 'true'\n        });\n      } else if (!isSelected && this.selected) {\n        $element.removeAttr('selected');\n        $element.attr('aria-selected', 'false');\n      }\n      this.selected = isSelected;\n    };\n  }\n\n}\nOptionDirective.$inject = [\"$mdInkRipple\", \"$mdUtil\"];\n\nfunction OptgroupDirective() {\n  return {\n    restrict: 'E',\n    compile: compile\n  };\n  function compile(el, attrs) {\n    var labelElement = el.find('label');\n    if (!labelElement.length) {\n      labelElement = angular.element('<label>');\n      el.prepend(labelElement);\n    }\n    if (attrs.label) labelElement.text(attrs.label);\n  }\n}\n\nfunction SelectProvider($$interimElementProvider) {\n  selectDefaultOptions.$inject = [\"$mdSelect\", \"$mdConstant\", \"$$rAF\", \"$mdUtil\", \"$mdTheming\", \"$timeout\"];\n  return $$interimElementProvider('$mdSelect')\n    .setDefaults({\n      methods: ['target'],\n      options: selectDefaultOptions\n    });\n\n  /* @ngInject */\n  function selectDefaultOptions($mdSelect, $mdConstant, $$rAF, $mdUtil, $mdTheming, $timeout) {\n    return {\n      parent: 'body',\n      onShow: onShow,\n      onRemove: onRemove,\n      hasBackdrop: true,\n      disableParentScroll: $mdUtil.floatingScrollbars(),\n      themable: true\n    };\n\n    function onShow(scope, element, opts) {\n      if (!opts.target) {\n        throw new Error('$mdSelect.show() expected a target element in options.target but got ' +\n                        '\"' + opts.target + '\"!');\n      }\n\n      angular.extend(opts, {\n        target: angular.element(opts.target), //make sure it's not a naked dom node\n        parent: angular.element(opts.parent),\n        selectEl: element.find('md-select-menu'),\n        contentEl: element.find('md-content'),\n        backdrop: opts.hasBackdrop && angular.element('<md-backdrop class=\"md-select-backdrop\">')\n      });\n\n      var optionNodes = [];\n\n      configureAria();\n\n      if (opts.loadingAsync && opts.loadingAsync.then) {\n        opts.loadingAsync.then(function() {\n          scope.$$loadingAsyncDone = true;\n          // Give ourselves two frames for the progress loader to clear out.\n          $$rAF(function() {\n            $$rAF(function() {\n              // Don't go forward if the select has been removed in this time...\n              if (opts.isRemoved) return;\n              animateSelect(scope, element, opts);\n              optionNodes = nodesToArray(opts.selectEl[0].getElementsByTagName('md-option'));\n            });\n          });\n        });\n      }\n\n      if (opts.disableParentScroll) {\n        opts.disableTarget = opts.parent.find('md-content');\n        if (!opts.disableTarget.length) opts.disableTarget = opts.parent;\n        opts.lastOverflow = opts.disableTarget.css('overflow');\n        opts.disableTarget.css('overflow', 'hidden');\n      }\n\n      // Only activate click listeners after a short time to stop accidental double taps/clicks\n      // from clicking the wrong item\n      $timeout(activateInteraction, 75, false);\n\n      if (opts.backdrop) {\n        $mdTheming.inherit(opts.backdrop, opts.parent);\n        opts.parent.append(opts.backdrop);\n      }\n      opts.parent.append(element);\n\n      // Give the select a frame to 'initialize' in the DOM,\n      // so we can read its height/width/position\n      $$rAF(function() {\n        $$rAF(function() {\n          if (opts.isRemoved) return;\n          animateSelect(scope, element, opts);\n          optionNodes = nodesToArray(element[0].querySelectorAll('md-option'));\n        });\n      });\n\n      return $mdUtil.transitionEndPromise(opts.selectEl);\n\n      function configureAria() {\n        opts.selectEl.attr('aria-labelledby', opts.target.attr('id'));\n        opts.target.attr('aria-owns', opts.selectEl.attr('id'));\n        opts.target.attr('aria-expanded', 'true');\n      }\n\n      function activateInteraction() {\n        if (opts.isRemoved) return;\n        var selectCtrl = opts.selectEl.controller('mdSelectMenu') || {};\n        element.addClass('md-clickable');\n\n        opts.backdrop && opts.backdrop.on('click', function(e) {\n          e.preventDefault();\n          e.stopPropagation();\n          opts.restoreFocus = false;\n          scope.$apply($mdSelect.cancel);\n        });\n\n        // Escape to close\n        opts.selectEl.on('keydown', function(e) {\n          switch (e.keyCode) {\n            case $mdConstant.KEY_CODE.TAB:\n            case $mdConstant.KEY_CODE.ESCAPE:\n              e.preventDefault();\n              opts.restoreFocus = true;\n              scope.$apply($mdSelect.cancel);\n          }\n        });\n\n        // Cycling of options, and closing on enter\n        opts.selectEl.on('keydown', function(e) {\n          switch (e.keyCode) {\n            case $mdConstant.KEY_CODE.UP_ARROW: return focusPrevOption();\n            case $mdConstant.KEY_CODE.DOWN_ARROW: return focusNextOption();\n          }\n        });\n\n        function focusNextOption() {\n          var index;\n          if ((index = optionNodes.indexOf(opts.focusedNode)) == -1) {\n            // We lost the previously focused element, reset to middle\n            index = Math.floor( (optionNodes.length - 1) / 2 );\n          } else {\n            if (index < optionNodes.length - 1) ++index;\n          }\n          opts.focusedNode = optionNodes[index];\n          optionNodes[index].focus();\n        }\n        function focusPrevOption() {\n          var index;\n          if ((index = optionNodes.indexOf(opts.focusedNode)) == -1) {\n            // We lost the previously focused element, reset to middle\n            index = Math.floor( (optionNodes.length - 1) / 2 );\n          } else {\n            if (index > 0) --index;\n          }\n          opts.focusedNode = optionNodes[index];\n          optionNodes[index].focus();\n        }\n\n        if (!selectCtrl.isMultiple) {\n          opts.selectEl.on('click', closeMenu);\n          opts.selectEl.on('keydown', function(e) {\n            if (e.keyCode == 32 || e.keyCode == 13) {\n              closeMenu();\n            }\n          });\n        }\n        function closeMenu() {\n          opts.restoreFocus = true;\n          scope.$evalAsync(function() {\n            $mdSelect.hide(selectCtrl.ngModel.$viewValue);\n          });\n        }\n      }\n\n    }\n\n    function onRemove(scope, element, opts) {\n      opts.isRemoved = true;\n      element.addClass('md-leave').removeClass('md-clickable');\n      opts.target.attr('aria-expanded', 'false');\n\n      if (opts.disableParentScroll && $mdUtil.floatingScrollbars()) {\n        opts.disableTarget.css('overflow', opts.lastOverflow);\n        delete opts.lastOverflow;\n        delete opts.disableTarget;\n      }\n\n      opts.setLabelText && opts.setLabelText(opts.selectEl.controller('mdSelectMenu').selectedLabels());\n\n      return $mdUtil.transitionEndPromise(element).then(function() {\n        element.remove();\n        opts.backdrop && opts.backdrop.remove();\n        if (opts.restoreFocus) opts.target.focus();\n      });\n    }\n\n    function animateSelect(scope, element, opts) {\n      var containerNode = element[0],\n          targetNode = opts.target[0],\n          parentNode = opts.parent[0],\n          selectNode = opts.selectEl[0],\n          contentNode = opts.contentEl[0],\n          parentRect = parentNode.getBoundingClientRect(),\n          targetRect = $mdUtil.clientRect(targetNode, parentNode),\n          shouldOpenAroundTarget = false,\n          bounds = {\n            left: parentNode.scrollLeft + SELECT_EDGE_MARGIN,\n            top: parentNode.scrollTop + SELECT_EDGE_MARGIN,\n            bottom: parentRect.height + parentNode.scrollTop - SELECT_EDGE_MARGIN,\n            right: parentRect.width - parentNode.scrollLeft - SELECT_EDGE_MARGIN\n          },\n          spaceAvailable = {\n            top: targetRect.top - bounds.top,\n            left: targetRect.left - bounds.left,\n            right: bounds.right - (targetRect.left + targetRect.width),\n            bottom: bounds.bottom - (targetRect.top + targetRect.height)\n          },\n          maxWidth = parentRect.width - SELECT_EDGE_MARGIN * 2,\n          isScrollable = contentNode.scrollHeight > contentNode.offsetHeight,\n          selectedNode = selectNode.querySelector('md-option[selected]'),\n          optionNodes = nodesToArray(selectNode.getElementsByTagName('md-option')),\n          optgroupNodes = selectNode.getElementsByTagName('md-optgroup');\n\n      var centeredNode;\n      // If a selected node, center around that\n      if (selectedNode) {\n        centeredNode = selectedNode;\n      // If there are option groups, center around the first option\n      } else if (optgroupNodes.length) {\n        centeredNode = optionNodes[0];\n      // Otherwise, lets center on the middle optionNode\n      } else if (optionNodes.length){\n        centeredNode = optionNodes[Math.floor(optionNodes.length / 2 )];\n      // In case there are no options, center on whatevers in there... (such as a progress indicator)\n      } else {\n        centeredNode = contentNode.firstElementChild || contentNode;\n      }\n\n      if (contentNode.offsetWidth > maxWidth) {\n        contentNode.style['max-width'] = maxWidth + 'px';\n      }\n      if (shouldOpenAroundTarget) {\n        contentNode.style['min-width'] = targetRect.width + 'px';\n      }\n\n      // Remove padding before we compute the position of the menu\n      if (isScrollable) {\n        selectNode.classList.add('md-overflow');\n      }\n\n      // Get the selectMenuRect *after* max-width is possibly set above\n      var selectMenuRect = selectNode.getBoundingClientRect();\n      var centeredRect = getOffsetRect(centeredNode);\n\n      if (centeredNode) {\n        var centeredStyle = window.getComputedStyle(centeredNode);\n        centeredRect.paddingLeft = parseInt(centeredStyle['padding-left'], 10);\n        centeredRect.paddingRight = parseInt(centeredStyle['padding-right'], 10);\n      }\n\n      var focusedNode = centeredNode || optionNodes[0];\n      if (focusedNode) {\n        opts.focusedNode = focusedNode;\n        // This is commented out to fix an issue where the first option remains in focus\n        // even after you mouseover to a different option.\n        // It is fixed in the compiled source and is here for reference.\n        // focusedNode.focus();\n      }\n\n      if (isScrollable) {\n        var scrollBuffer = contentNode.offsetHeight / 2;\n        contentNode.scrollTop = centeredRect.top + centeredRect.height / 2 - scrollBuffer;\n\n        if (spaceAvailable.top < scrollBuffer) {\n          contentNode.scrollTop = Math.min(\n            centeredRect.top,\n            contentNode.scrollTop + scrollBuffer - spaceAvailable.top\n          );\n        } else if (spaceAvailable.bottom < scrollBuffer) {\n          contentNode.scrollTop = Math.max(\n            centeredRect.top + centeredRect.height - selectMenuRect.height,\n            contentNode.scrollTop - scrollBuffer + spaceAvailable.bottom\n          );\n        }\n      }\n\n      var left, top, transformOrigin;\n      if (shouldOpenAroundTarget) {\n        left = targetRect.left;\n        top = targetRect.top + targetRect.height;\n        transformOrigin = '50% 0';\n        if (top + selectMenuRect.height > bounds.bottom) {\n          top = targetRect.top - selectMenuRect.height;\n          transformOrigin = '50% 100%';\n        }\n      } else {\n        left = targetRect.left + centeredRect.left - centeredRect.paddingLeft;\n        top = targetRect.top + targetRect.height / 2 - centeredRect.height / 2 -\n          centeredRect.top + contentNode.scrollTop;\n        transformOrigin = (centeredRect.left + targetRect.width / 2) + 'px ' +\n        (centeredRect.top + centeredRect.height / 2 - contentNode.scrollTop) + 'px 0px';\n        containerNode.style['min-width'] = targetRect.width + centeredRect.paddingLeft + centeredRect.paddingRight + 'px';\n      }\n\n      // Keep left and top within the window\n      containerNode.style.left = clamp(bounds.left, left, bounds.right) + 'px';\n      containerNode.style.top = clamp(bounds.top, top, bounds.bottom) + 'px';\n      selectNode.style[$mdConstant.CSS.TRANSFORM_ORIGIN] = transformOrigin;\n\n      selectNode.style[$mdConstant.CSS.TRANSFORM] = 'scale(' +\n        Math.min(targetRect.width / selectMenuRect.width, 1.0) + ',' +\n        Math.min(targetRect.height / selectMenuRect.height, 1.0) +\n      ')';\n\n      $$rAF(function() {\n        element.addClass('md-active');\n        selectNode.style[$mdConstant.CSS.TRANSFORM] = '';\n      });\n    }\n\n  }\n\n  function clamp(min, n, max) {\n    return Math.min(max, Math.max(n, min));\n  }\n\n  function getOffsetRect(node) {\n    return node ? {\n      left: node.offsetLeft,\n      top: node.offsetTop,\n      width: node.offsetWidth,\n      height: node.offsetHeight\n    } : { left: 0, top: 0, width: 0, height: 0 };\n  }\n}\nSelectProvider.$inject = [\"$$interimElementProvider\"];\n\n// Annoying method to copy nodes to an array, thanks to IE\nfunction nodesToArray(nodes) {\n  var results = [];\n  for (var i = 0; i < nodes.length; ++i) {\n    results.push(nodes.item(i));\n  }\n  return results;\n}\n})();\n\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/sidenav/sidenav-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-sidenav.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/sidenav/sidenav.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-sidenav {\n  position: absolute;\n  width: 304px;\n  min-width: 304px;\n  max-width: 304px;\n  bottom: 0;\n  z-index: 60;\n  background-color: white;\n  overflow: auto;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-sidenav.md-closed {\n    display: none; }\n  md-sidenav.md-closed-add, md-sidenav.md-closed-remove {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    /* this is required as of 1.3x to properly\n       apply all styling in a show/hide animation */\n    transition: 0s all; }\n  md-sidenav.md-closed-add.md-closed-add-active, md-sidenav.md-closed-remove.md-closed-remove-active {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-sidenav.md-locked-open-add, md-sidenav.md-locked-open-remove {\n    position: static;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open {\n    width: 304px;\n    min-width: 304px;\n    max-width: 304px; }\n  md-sidenav.md-locked-open, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-left, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-right, md-sidenav.md-locked-open-remove.md-closed {\n    position: static;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open-remove-active {\n    transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 0;\n    min-width: 0; }\n  md-sidenav.md-closed.md-locked-open-add {\n    width: 0;\n    min-width: 0;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n  md-sidenav.md-closed.md-locked-open-add-active {\n    transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 304px;\n    min-width: 304px;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n\n.md-sidenav-backdrop.md-locked-open {\n  display: none; }\n\n.md-sidenav-left, md-sidenav {\n  left: 0;\n  top: 0;\n  -webkit-transform: translate3d(0%, 0, 0);\n          transform: translate3d(0%, 0, 0); }\n  .md-sidenav-left.md-closed, md-sidenav.md-closed {\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0); }\n\n.md-sidenav-right {\n  left: 100%;\n  top: 0;\n  -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0); }\n  .md-sidenav-right.md-closed {\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n\n@media (max-width: 360px) {\n  md-sidenav {\n    width: 85%; }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/sidenav/sidenav.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.sidenav');\ngoog.require('ng.material.components.backdrop');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.sidenav\n *\n * @description\n * A Sidenav QP component.\n */\nangular.module('material.components.sidenav', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .factory('$mdSidenav', SidenavService )\n  .directive('mdSidenav', SidenavDirective)\n  .controller('$mdSidenavController', SidenavController);\n\n\n/**\n * @private\n * @ngdoc service\n * @name $mdSidenav\n * @module material.components.sidenav\n *\n * @description\n * `$mdSidenav` makes it easy to interact with multiple sidenavs\n * in an app.\n *\n * @usage\n * <hljs lang=\"js\">\n * // Toggle the given sidenav\n * $mdSidenav(componentId).toggle();\n * </hljs>\n * <hljs lang=\"js\">\n * // Open the given sidenav\n * $mdSidenav(componentId).open();\n * </hljs>\n * <hljs lang=\"js\">\n * // Close the given sidenav\n * $mdSidenav(componentId).close();\n * </hljs>\n * <hljs lang=\"js\">\n * // Exposes whether given sidenav is set to be open\n * $mdSidenav(componentId).isOpen();\n * </hljs>\n * <hljs lang=\"js\">\n * // Exposes whether given sidenav is locked open\n * // If this is true, the sidenav will be open regardless of isOpen()\n * $mdSidenav(componentId).isLockedOpen();\n * </hljs>\n */\nfunction SidenavService($mdComponentRegistry, $q) {\n  return function(handle) {\n    var errorMsg = \"SideNav '\" + handle + \"' is not available!\";\n\n    // Lookup the controller instance for the specified sidNav instance\n    var instance = $mdComponentRegistry.get(handle);\n    if(!instance) {\n      $mdComponentRegistry.notFoundError(handle);\n    }\n\n    return {\n      isOpen: function() {\n        return instance && instance.isOpen();\n      },\n      isLockedOpen: function() {\n        return instance && instance.isLockedOpen();\n      },\n      toggle: function() {\n        return instance ? instance.toggle() : $q.reject(errorMsg);\n      },\n      open: function() {\n        return instance ? instance.open() : $q.reject(errorMsg);\n      },\n      close: function() {\n        return instance ? instance.close() : $q.reject(errorMsg);\n      }\n    };\n  };\n}\nSidenavService.$inject = [\"$mdComponentRegistry\", \"$q\"];\n\n/**\n * @ngdoc directive\n * @name mdSidenav\n * @module material.components.sidenav\n * @restrict E\n *\n * @description\n *\n * A Sidenav component that can be opened and closed programatically.\n *\n * By default, upon opening it will slide out on top of the main content area.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"row\" ng-controller=\"MyController\">\n *   <md-sidenav md-component-id=\"left\" class=\"md-sidenav-left\">\n *     Left Nav!\n *   </md-sidenav>\n *\n *   <md-content>\n *     Center Content\n *     <md-button ng-click=\"openLeftMenu()\">\n *       Open Left Menu\n *     </md-button>\n *   </md-content>\n *\n *   <md-sidenav md-component-id=\"right\"\n *     md-is-locked-open=\"$media('min-width: 333px')\"\n *     class=\"md-sidenav-right\">\n *     Right Nav!\n *   </md-sidenav>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('myApp', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdSidenav) {\n *   $scope.openLeftMenu = function() {\n *     $mdSidenav('left').toggle();\n *   };\n * });\n * </hljs>\n *\n * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n * @param {string=} md-component-id componentId to use with $mdSidenav service.\n * @param {expression=} md-is-locked-open When this expression evalutes to true,\n * the sidenav 'locks open': it falls into the content's flow instead\n * of appearing over it. This overrides the `is-open` attribute.\n *\n * A $media() function is exposed to the is-locked-open attribute, which\n * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n * Examples:\n *\n *   - `<md-sidenav md-is-locked-open=\"shouldLockOpen\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('min-width: 1000px')\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('sm')\"></md-sidenav>` (locks open on small screens)\n */\nfunction SidenavDirective($timeout, $animate, $parse, $mdMedia, $mdConstant, $compile, $mdTheming, $q, $document) {\n  return {\n    restrict: 'E',\n    scope: {\n      isOpen: '=?mdIsOpen'\n    },\n    controller: '$mdSidenavController',\n    compile: function(element) {\n      element.addClass('md-closed');\n      element.attr('tabIndex', '-1');\n      return postLink;\n    }\n  };\n\n  /**\n   * Directive Post Link function...\n   */\n  function postLink(scope, element, attr, sidenavCtrl) {\n    var triggeringElement = null;\n    var promise = $q.when(true);\n\n    var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n    var isLocked = function() {\n      return isLockedOpenParsed(scope.$parent, {\n        $media: $mdMedia\n      });\n    };\n    var backdrop = $compile(\n      '<md-backdrop class=\"md-sidenav-backdrop md-opaque ng-enter\">'\n    )(scope);\n\n    element.on('$destroy', sidenavCtrl.destroy);\n    $mdTheming.inherit(backdrop, element);\n\n    scope.$watch(isLocked, updateIsLocked);\n    scope.$watch('isOpen', updateIsOpen);\n\n\n    // Publish special accessor for the Controller instance\n    sidenavCtrl.$toggleOpen = toggleOpen;\n\n    /**\n     * Toggle the DOM classes to indicate `locked`\n     * @param isLocked\n     */\n    function updateIsLocked(isLocked, oldValue) {\n      scope.isLockedOpen = isLocked;\n      if (isLocked === oldValue) {\n        element.toggleClass('md-locked-open', !!isLocked);\n      } else {\n        $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n      }\n      backdrop.toggleClass('md-locked-open', !!isLocked);\n    }\n\n    /**\n     * Toggle the SideNav view and attach/detach listeners\n     * @param isOpen\n     */\n    function updateIsOpen(isOpen) {\n      var parent = element.parent();\n\n      parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n      backdrop[isOpen ? 'on' : 'off']('click', close);\n\n      if ( isOpen ) {\n        // Capture upon opening..\n        triggeringElement = $document[0].activeElement;\n      }\n\n      return promise = $q.all([\n        $animate[isOpen ? 'enter' : 'leave'](backdrop, parent),\n        $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed').then(function() {\n          // If we opened, and haven't closed again before the animation finished\n          if (scope.isOpen) {\n            element.focus();\n          }\n        })\n      ]);\n    }\n\n    /**\n     * Toggle the sideNav view and publish a promise to be resolved when\n     * the view animation finishes.\n     *\n     * @param isOpen\n     * @returns {*}\n     */\n    function toggleOpen( isOpen ) {\n      if (scope.isOpen == isOpen ) {\n\n        return $q.when(true);\n\n      } else {\n        var deferred = $q.defer();\n\n        // Toggle value to force an async `updateIsOpen()` to run\n        scope.isOpen = isOpen;\n\n        $timeout(function() {\n\n          // When the current `updateIsOpen()` animation finishes\n          promise.then(function(result){\n\n            if ( !scope.isOpen ) {\n              // reset focus to originating element (if available) upon close\n              triggeringElement && triggeringElement.focus();\n              triggeringElement = null;\n            }\n\n            deferred.resolve(result);\n          });\n\n        },0,false);\n\n        return deferred.promise;\n      }\n    }\n\n    /**\n     * Auto-close sideNav when the `escape` key is pressed.\n     * @param evt\n     */\n    function onKeyDown(ev) {\n      var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n      return isEscape ? close(ev) : $q.when(true);\n    }\n\n    /**\n     * With backdrop `clicks` or `escape` key-press, immediately\n     * apply the CSS close transition... Then notify the controller\n     * to close() and perform its own actions.\n     */\n    function close(ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      return sidenavCtrl.close();\n    }\n\n  }\n}\nSidenavDirective.$inject = [\"$timeout\", \"$animate\", \"$parse\", \"$mdMedia\", \"$mdConstant\", \"$compile\", \"$mdTheming\", \"$q\", \"$document\"];\n\n/*\n * @private\n * @ngdoc controller\n * @name SidenavController\n * @module material.components.sidenav\n *\n */\nfunction SidenavController($scope, $element, $attrs, $mdComponentRegistry, $q) {\n\n  var self = this;\n\n  // Use Default internal method until overridden by directive postLink\n\n  self.$toggleOpen = function() { return $q.when($scope.isOpen); };\n  self.isOpen = function() { return !!$scope.isOpen; };\n  self.isLockedOpen = function() { return !!$scope.isLockedOpen; };\n  self.open   = function() { return self.$toggleOpen( true );  };\n  self.close  = function() { return self.$toggleOpen( false ); };\n  self.toggle = function() { return self.$toggleOpen( !$scope.isOpen );  };\n\n  self.destroy = $mdComponentRegistry.register(self, $attrs.mdComponentId);\n}\nSidenavController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$mdComponentRegistry\", \"$q\"];\n\n\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/slider/slider-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-slider.md-THEME_NAME-theme .md-track {\n  background-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track-ticks {\n  background-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-thumb {\n  background-color: '{{foreground-2}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-ring {\n  border-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-disabled-thumb {\n  border-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme.md-min .md-thumb:after {\n  background-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track.md-track-fill {\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb:after {\n  border-color: '{{accent-color}}';\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-sign {\n  background-color: '{{accent-color}}'; }\n  md-slider.md-THEME_NAME-theme .md-sign:after {\n    border-top-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb-text {\n  color: '{{accent-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {\n  border-color: '{{warn-color}}';\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-sign {\n  background-color: '{{warn-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {\n    border-top-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {\n  color: '{{warn-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {\n  border-color: '{{primary-color}}';\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-sign {\n  background-color: '{{primary-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {\n    border-top-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {\n  color: '{{primary-contrast}}'; }\nmd-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {\n  border-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {\n  background-color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/slider/slider.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n@-webkit-keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\nmd-slider {\n  height: 48px;\n  position: relative;\n  display: block;\n  margin-left: 4px;\n  margin-right: 4px;\n  padding: 0;\n  /**\n   * Track\n   */\n  /**\n   * Slider thumb\n   */\n  /* The sign that's focused in discrete mode */\n  /**\n   * The border/background that comes in when focused in non-discrete mode\n   */\n  /* Don't animate left/right while panning */ }\n  md-slider .md-slider-wrapper {\n    position: relative; }\n  md-slider .md-track-container {\n    width: 100%;\n    position: absolute;\n    top: 23px;\n    height: 2px; }\n  md-slider .md-track {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-track-fill {\n    transition: width 0.05s linear; }\n  md-slider .md-track-ticks {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-thumb-container {\n    position: absolute;\n    left: 0;\n    top: 50%;\n    -webkit-transform: translate3d(-50%, -50%, 0);\n            transform: translate3d(-50%, -50%, 0);\n    transition: left 0.1s linear; }\n  md-slider .md-thumb {\n    z-index: 1;\n    position: absolute;\n    left: -19px;\n    top: 5px;\n    width: 38px;\n    height: 38px;\n    border-radius: 38px;\n    -webkit-transform: scale(0.5);\n            transform: scale(0.5);\n    transition: all 0.1s linear; }\n    md-slider .md-thumb:after {\n      content: '';\n      position: absolute;\n      left: 3px;\n      top: 3px;\n      width: 32px;\n      height: 32px;\n      border-radius: 32px;\n      border: 3px solid; }\n  md-slider .md-sign {\n    /* Center the children (slider-thumb-text) */\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n    position: absolute;\n    left: -14px;\n    top: -20px;\n    width: 28px;\n    height: 28px;\n    border-radius: 28px;\n    -webkit-transform: scale(0.4) translate3d(0, 70px, 0);\n            transform: scale(0.4) translate3d(0, 70px, 0);\n    transition: all 0.2s ease-in-out;\n    /* The arrow pointing down under the sign */ }\n    md-slider .md-sign:after {\n      position: absolute;\n      content: '';\n      left: 0px;\n      border-radius: 16px;\n      top: 19px;\n      border-left: 14px solid transparent;\n      border-right: 14px solid transparent;\n      border-top: 16px solid;\n      opacity: 0;\n      -webkit-transform: translate3d(0, -8px, 0);\n              transform: translate3d(0, -8px, 0);\n      transition: all 0.2s ease-in-out; }\n    md-slider .md-sign .md-thumb-text {\n      z-index: 1;\n      font-size: 12px;\n      font-weight: bold; }\n  md-slider .md-focus-thumb {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    display: none;\n    opacity: 0;\n    background-color: #C0C0C0;\n    -webkit-animation: sliderFocusThumb 0.4s linear;\n            animation: sliderFocusThumb 0.4s linear; }\n  md-slider .md-focus-ring {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    border: 2px solid #D6D6D6;\n    background-color: transparent;\n    -webkit-transform: scale(0);\n            transform: scale(0);\n    transition: all 0.2s linear; }\n  md-slider .md-disabled-thumb {\n    position: absolute;\n    left: -22px;\n    top: 2px;\n    width: 44px;\n    height: 44px;\n    border-radius: 44px;\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    border: 6px solid;\n    display: none; }\n  md-slider.md-min .md-thumb:after {\n    background-color: white; }\n  md-slider.md-min .md-sign {\n    opacity: 0; }\n  md-slider:focus {\n    outline: none; }\n  md-slider.dragging .md-thumb-container, md-slider.dragging .md-track-fill {\n    transition: none; }\n  md-slider:not([md-discrete]) {\n    /* Hide the sign and ticks in non-discrete mode */ }\n    md-slider:not([md-discrete]) .md-track-ticks, md-slider:not([md-discrete]) .md-sign {\n      display: none; }\n    md-slider:not([md-discrete]):not([disabled]):hover .md-thumb {\n      -webkit-transform: scale(0.6);\n              transform: scale(0.6); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-focus-thumb {\n      display: block; }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-ring, md-slider:not([md-discrete]):not([disabled]).active .md-focus-ring {\n      -webkit-transform: scale(1);\n              transform: scale(1); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-thumb {\n      -webkit-transform: scale(0.85);\n              transform: scale(0.85); }\n  md-slider[md-discrete] {\n    /* Hide the focus thumb in discrete mode */ }\n    md-slider[md-discrete] .md-focus-thumb, md-slider[md-discrete] .md-focus-ring {\n      display: none; }\n    md-slider[md-discrete]:not([disabled]):focus .md-sign, md-slider[md-discrete]:not([disabled]):focus .md-sign:after, md-slider[md-discrete]:not([disabled]).active .md-sign, md-slider[md-discrete]:not([disabled]).active .md-sign:after {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0) scale(1);\n              transform: translate3d(0, 0, 0) scale(1); }\n  md-slider[disabled] .md-track-fill {\n    display: none; }\n  md-slider[disabled] .md-sign {\n    display: none; }\n  md-slider[disabled] .md-thumb {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35); }\n  md-slider[disabled] .md-disabled-thumb {\n    display: block; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/slider/slider.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.slider');\ngoog.require('ng.material.core');\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.components.slider\n   */\n  angular.module('material.components.slider', [\n    'material.core'\n  ])\n  .directive('mdSlider', SliderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSlider\n * @module material.components.slider\n * @restrict E\n * @description\n * The `<md-slider>` component allows the user to choose from a range of\n * values.\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the slider is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * It has two modes: 'normal' mode, where the user slides between a wide range\n * of values, and 'discrete' mode, where the user slides between only a few\n * select values.\n *\n * To enable discrete mode, add the `md-discrete` attribute to a slider,\n * and use the `step` attribute to change the distance between\n * values the user is allowed to pick.\n *\n * @usage\n * <h4>Normal Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider ng-model=\"myValue\" min=\"5\" max=\"500\">\n * </md-slider>\n * </hljs>\n * <h4>Discrete Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider md-discrete ng-model=\"myDiscreteValue\" step=\"10\" min=\"10\" max=\"130\">\n * </md-slider>\n * </hljs>\n *\n * @param {boolean=} md-discrete Whether to enable discrete mode.\n * @param {number=} step The distance between values the user is allowed to pick. Default 1.\n * @param {number=} min The minimum value the user is allowed to pick. Default 0.\n * @param {number=} max The maximum value the user is allowed to pick. Default 100.\n */\nfunction SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdTheming, $mdGesture, $parse) {\n  return {\n    scope: {},\n    require: '?ngModel',\n    template:\n      '<div class=\"md-slider-wrapper\">\\\n        <div class=\"md-track-container\">\\\n          <div class=\"md-track\"></div>\\\n          <div class=\"md-track md-track-fill\"></div>\\\n          <div class=\"md-track-ticks\"></div>\\\n        </div>\\\n        <div class=\"md-thumb-container\">\\\n          <div class=\"md-thumb\"></div>\\\n          <div class=\"md-focus-thumb\"></div>\\\n          <div class=\"md-focus-ring\"></div>\\\n          <div class=\"md-sign\">\\\n            <span class=\"md-thumb-text\"></span>\\\n          </div>\\\n          <div class=\"md-disabled-thumb\"></div>\\\n        </div>\\\n      </div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n    tElement.attr({\n      tabIndex: 0,\n      role: 'slider'\n    });\n\n    $mdAria.expect(tElement, 'aria-label');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr, ngModelCtrl) {\n    $mdTheming(element);\n    ngModelCtrl = ngModelCtrl || {\n      // Mock ngModelController if it doesn't exist to give us\n      // the minimum functionality needed\n      $setViewValue: function(val) {\n        this.$viewValue = val;\n        this.$viewChangeListeners.forEach(function(cb) { cb(); });\n      },\n      $parsers: [],\n      $formatters: [],\n      $viewChangeListeners: []\n    };\n\n    var isDisabledParsed = attr.ngDisabled && $parse(attr.ngDisabled);\n    var isDisabledGetter = isDisabledParsed ?\n      function() { return isDisabledParsed(scope.$parent); } :\n      angular.noop;\n    var thumb = angular.element(element[0].querySelector('.md-thumb'));\n    var thumbText = angular.element(element[0].querySelector('.md-thumb-text'));\n    var thumbContainer = thumb.parent();\n    var trackContainer = angular.element(element[0].querySelector('.md-track-container'));\n    var activeTrack = angular.element(element[0].querySelector('.md-track-fill'));\n    var tickContainer = angular.element(element[0].querySelector('.md-track-ticks'));\n    var throttledRefreshDimensions = $mdUtil.throttle(refreshSliderDimensions, 5000);\n\n    // Default values, overridable by attrs\n    attr.min ? attr.$observe('min', updateMin) : updateMin(0);\n    attr.max ? attr.$observe('max', updateMax) : updateMax(100);\n    attr.step ? attr.$observe('step', updateStep) : updateStep(1);\n\n    // We have to manually stop the $watch on ngDisabled because it exists\n    // on the parent scope, and won't be automatically destroyed when\n    // the component is destroyed.\n    var stopDisabledWatch = angular.noop;\n    if (attr.ngDisabled) {\n      stopDisabledWatch = scope.$parent.$watch(attr.ngDisabled, updateAriaDisabled);\n    }\n\n    $mdGesture.register(element, 'drag');\n\n    element\n      .on('keydown', keydownListener)\n      .on('$md.pressdown', onPressDown)\n      .on('$md.pressup', onPressUp)\n      .on('$md.dragstart', onDragStart)\n      .on('$md.drag', onDrag)\n      .on('$md.dragend', onDragEnd);\n\n    // On resize, recalculate the slider's dimensions and re-render\n    function updateAll() {\n      refreshSliderDimensions();\n      ngModelRender();\n      redrawTicks();\n    }\n    setTimeout(updateAll);\n\n    var debouncedUpdateAll = $$rAF.throttle(updateAll);\n    angular.element($window).on('resize', debouncedUpdateAll);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdateAll);\n      stopDisabledWatch();\n    });\n\n    ngModelCtrl.$render = ngModelRender;\n    ngModelCtrl.$viewChangeListeners.push(ngModelRender);\n    ngModelCtrl.$formatters.push(minMaxValidator);\n    ngModelCtrl.$formatters.push(stepValidator);\n\n    /**\n     * Attributes\n     */\n    var min;\n    var max;\n    var step;\n    function updateMin(value) {\n      min = parseFloat(value);\n      element.attr('aria-valuemin', value);\n      updateAll();\n    }\n    function updateMax(value) {\n      max = parseFloat(value);\n      element.attr('aria-valuemax', value);\n      updateAll();\n    }\n    function updateStep(value) {\n      step = parseFloat(value);\n      redrawTicks();\n    }\n    function updateAriaDisabled(isDisabled) {\n      element.attr('aria-disabled', !!isDisabled);\n    }\n\n    // Draw the ticks with canvas.\n    // The alternative to drawing ticks with canvas is to draw one element for each tick,\n    // which could quickly become a performance bottleneck.\n    var tickCanvas, tickCtx;\n    function redrawTicks() {\n      if (!angular.isDefined(attr.mdDiscrete)) return;\n\n      var numSteps = Math.floor( (max - min) / step );\n      if (!tickCanvas) {\n        var trackTicksStyle = $window.getComputedStyle(tickContainer[0]);\n        tickCanvas = angular.element('<canvas style=\"position:absolute;\">');\n        tickCtx = tickCanvas[0].getContext('2d');\n        tickCtx.fillStyle = trackTicksStyle.backgroundColor || 'black';\n        tickContainer.append(tickCanvas);\n      }\n      var dimensions = getSliderDimensions();\n      tickCanvas[0].width = dimensions.width;\n      tickCanvas[0].height = dimensions.height;\n\n      var distance;\n      for (var i = 0; i <= numSteps; i++) {\n        distance = Math.floor(dimensions.width * (i / numSteps));\n        tickCtx.fillRect(distance - 1, 0, 2, dimensions.height);\n      }\n    }\n\n\n    /**\n     * Refreshing Dimensions\n     */\n    var sliderDimensions = {};\n    refreshSliderDimensions();\n    function refreshSliderDimensions() {\n      sliderDimensions = trackContainer[0].getBoundingClientRect();\n    }\n    function getSliderDimensions() {\n      throttledRefreshDimensions();\n      return sliderDimensions;\n    }\n\n    /**\n     * left/right arrow listener\n     */\n    function keydownListener(ev) {\n      if(element[0].hasAttribute('disabled')) {\n        return;\n      }\n\n      var changeAmount;\n      if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n        changeAmount = -step;\n      } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n        changeAmount = step;\n      }\n      if (changeAmount) {\n        if (ev.metaKey || ev.ctrlKey || ev.altKey) {\n          changeAmount *= 4;\n        }\n        ev.preventDefault();\n        ev.stopPropagation();\n        scope.$evalAsync(function() {\n          setModelValue(ngModelCtrl.$viewValue + changeAmount);\n        });\n      }\n    }\n\n    /**\n     * ngModel setters and validators\n     */\n    function setModelValue(value) {\n      ngModelCtrl.$setViewValue( minMaxValidator(stepValidator(value)) );\n    }\n    function ngModelRender() {\n      if (isNaN(ngModelCtrl.$viewValue)) {\n        ngModelCtrl.$viewValue = ngModelCtrl.$modelValue;\n      }\n\n      var percent = (ngModelCtrl.$viewValue - min) / (max - min);\n      scope.modelValue = ngModelCtrl.$viewValue;\n      element.attr('aria-valuenow', ngModelCtrl.$viewValue);\n      setSliderPercent(percent);\n      thumbText.text( ngModelCtrl.$viewValue );\n    }\n\n    function minMaxValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.max(min, Math.min(max, value));\n      }\n    }\n    function stepValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.round(value / step) * step;\n      }\n    }\n\n    /**\n     * @param percent 0-1\n     */\n    function setSliderPercent(percent) {\n      activeTrack.css('width', (percent * 100) + '%');\n      thumbContainer.css(\n        'left',\n        (percent * 100) + '%'\n      );\n      element.toggleClass('md-min', percent === 0);\n    }\n\n\n    /**\n     * Slide listeners\n     */\n    var isDragging = false;\n    var isDiscrete = angular.isDefined(attr.mdDiscrete);\n\n    function onPressDown(ev) {\n      if (isDisabledGetter()) return;\n\n      element.addClass('active');\n      element[0].focus();\n      refreshSliderDimensions();\n\n      var exactVal = percentToValue( positionToPercent( ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue( closestVal );\n        setSliderPercent( valueToPercent(closestVal));\n      });\n    }\n    function onPressUp(ev) {\n      if (isDisabledGetter()) return;\n\n      element.removeClass('dragging active');\n\n      var exactVal = percentToValue( positionToPercent( ev.pointer.x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      scope.$apply(function() {\n        setModelValue(closestVal);\n        ngModelRender();\n      });\n    }\n    function onDragStart(ev) {\n      if (isDisabledGetter()) return;\n      isDragging = true;\n      ev.stopPropagation();\n\n      element.addClass('dragging');\n      setSliderFromEvent(ev);\n    }\n    function onDrag(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      setSliderFromEvent(ev);\n    }\n    function onDragEnd(ev) {\n      if (!isDragging) return;\n      ev.stopPropagation();\n      isDragging = false;\n    }\n\n    function setSliderFromEvent(ev) {\n      // While panning discrete, update only the\n      // visual positioning but not the model value.\n      if ( isDiscrete ) adjustThumbPosition( ev.pointer.x );\n      else              doSlide( ev.pointer.x );\n    }\n\n    /**\n     * Slide the UI by changing the model value\n     * @param x\n     */\n    function doSlide( x ) {\n      scope.$evalAsync( function() {\n        setModelValue( percentToValue( positionToPercent(x) ));\n      });\n    }\n\n    /**\n     * Slide the UI without changing the model (while dragging/panning)\n     * @param x\n     */\n    function adjustThumbPosition( x ) {\n      var exactVal = percentToValue( positionToPercent( x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      setSliderPercent( positionToPercent(x) );\n      thumbText.text( closestVal );\n    }\n\n    /**\n     * Convert horizontal position on slider to percentage value of offset from beginning...\n     * @param x\n     * @returns {number}\n     */\n    function positionToPercent( x ) {\n      return Math.max(0, Math.min(1, (x - sliderDimensions.left) / (sliderDimensions.width)));\n    }\n\n    /**\n     * Convert percentage offset on slide to equivalent model value\n     * @param percent\n     * @returns {*}\n     */\n    function percentToValue( percent ) {\n      return (min + percent * (max - min));\n    }\n\n    function valueToPercent( val ) {\n      return (val - min)/(max - min);\n    }\n  }\n}\nSliderDirective.$inject = [\"$$rAF\", \"$window\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$mdGesture\", \"$parse\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/sticky/sticky.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n.md-sticky-clone {\n  z-index: 2;\n  top: 0;\n  left: 0;\n  right: 0;\n  position: absolute !important;\n  -webkit-transform: translate3d(-9999px, -9999px, 0);\n          transform: translate3d(-9999px, -9999px, 0); }\n  .md-sticky-clone[sticky-state=\"active\"] {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n    .md-sticky-clone[sticky-state=\"active\"]:not(.md-sticky-no-effect):after {\n      -webkit-animation: subheaderStickyHoverIn 0.3s ease-out both;\n              animation: subheaderStickyHoverIn 0.3s ease-out both; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/sticky/sticky.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.sticky');\ngoog.require('ng.material.components.content');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.sticky\n * @description\n *\n * Sticky effects for md\n */\n\nangular.module('material.components.sticky', [\n  'material.core',\n  'material.components.content'\n])\n  .factory('$mdSticky', MdSticky);\n\n/*\n * @ngdoc service\n * @name $mdSticky\n * @module material.components.sticky\n *\n * @description\n * The `$mdSticky`service provides a mixin to make elements sticky.\n *\n * @returns A `$mdSticky` function that takes three arguments:\n *   - `scope`\n *   - `element`: The element that will be 'sticky'\n *   - `elementClone`: A clone of the element, that will be shown\n *     when the user starts scrolling past the original element.\n *     If not provided, it will use the result of `element.clone()`.\n */\n\nfunction MdSticky($document, $mdConstant, $compile, $$rAF, $mdUtil) {\n\n  var browserStickySupport = checkStickySupport();\n\n  /**\n   * Registers an element as sticky, used internally by directives to register themselves\n   */\n  return function registerStickyElement(scope, element, stickyClone) {\n    var contentCtrl = element.controller('mdContent');\n    if (!contentCtrl) return;\n\n    if (browserStickySupport) {\n      element.css({\n        position: browserStickySupport,\n        top: 0,\n        'z-index': 2\n      });\n    } else {\n      var $$sticky = contentCtrl.$element.data('$$sticky');\n      if (!$$sticky) {\n        $$sticky = setupSticky(contentCtrl);\n        contentCtrl.$element.data('$$sticky', $$sticky);\n      }\n\n      var deregister = $$sticky.add(element, stickyClone || element.clone());\n      scope.$on('$destroy', deregister);\n    }\n  };\n\n  function setupSticky(contentCtrl) {\n    var contentEl = contentCtrl.$element;\n\n    // Refresh elements is very expensive, so we use the debounced\n    // version when possible.\n    var debouncedRefreshElements = $$rAF.throttle(refreshElements);\n\n    // setupAugmentedScrollEvents gives us `$scrollstart` and `$scroll`,\n    // more reliable than `scroll` on android.\n    setupAugmentedScrollEvents(contentEl);\n    contentEl.on('$scrollstart', debouncedRefreshElements);\n    contentEl.on('$scroll', onScroll);\n\n    var self;\n    var stickyBaseoffset = contentEl.prop('offsetTop');\n    return self = {\n      prev: null,\n      current: null, //the currently stickied item\n      next: null,\n      items: [],\n      add: add,\n      refreshElements: refreshElements\n    };\n\n    /***************\n     * Public\n     ***************/\n    // Add an element and its sticky clone to this content's sticky collection\n    function add(element, stickyClone) {\n      stickyClone.addClass('md-sticky-clone');\n      stickyClone.css('top', stickyBaseoffset + 'px');\n\n      var item = {\n        element: element,\n        clone: stickyClone\n      };\n      self.items.push(item);\n\n      contentEl.parent().prepend(item.clone);\n\n      debouncedRefreshElements();\n\n      return function remove() {\n        self.items.forEach(function(item, index) {\n          if (item.element[0] === element[0]) {\n            self.items.splice(index, 1);\n            item.clone.remove();\n          }\n        });\n        debouncedRefreshElements();\n      };\n    }\n\n    function refreshElements() {\n      // Sort our collection of elements by their current position in the DOM.\n      // We need to do this because our elements' order of being added may not\n      // be the same as their order of display.\n      self.items.forEach(refreshPosition);\n      self.items = self.items.sort(function(a, b) {\n        return a.top < b.top ? -1 : 1;\n      });\n\n      // Find which item in the list should be active, \n      // based upon the content's current scroll position\n      var item;\n      var currentScrollTop = contentEl.prop('scrollTop');\n      for (var i = self.items.length - 1; i >= 0; i--) {\n        if (currentScrollTop > self.items[i].top) {\n          item = self.items[i];\n          break;\n        }\n      }\n      setCurrentItem(item);\n    }\n\n\n    /***************\n     * Private\n     ***************/\n\n    // Find the `top` of an item relative to the content element,\n    // and also the height.\n    function refreshPosition(item) {\n      // Find the top of an item by adding to the offsetHeight until we reach the \n      // content element.\n      var current = item.element[0];\n      item.top = 0;\n      item.left = 0;\n      while (current && current !== contentEl[0]) {\n        item.top += current.offsetTop;\n        item.left += current.offsetLeft;\n        current = current.offsetParent;\n      }\n      item.height = item.element.prop('offsetHeight');\n      item.clone.css('margin-left', item.left + 'px');\n    }\n\n\n    // As we scroll, push in and select the correct sticky element.\n    function onScroll() {\n      var scrollTop = contentEl.prop('scrollTop');\n      var isScrollingDown = scrollTop > (onScroll.prevScrollTop || 0);\n      onScroll.prevScrollTop = scrollTop;\n\n      // At the top?\n      if (scrollTop === 0) {\n        setCurrentItem(null);\n\n      // Going to next item?\n      } else if (isScrollingDown && self.next) {\n        if (self.next.top - scrollTop <= 0) {\n          // Sticky the next item if we've scrolled past its position.\n          setCurrentItem(self.next);\n        } else if (self.current) {\n          // Push the current item up when we're almost at the next item.\n          if (self.next.top - scrollTop <= self.next.height) {\n            translate(self.current, self.next.top - self.next.height - scrollTop);\n          } else {\n            translate(self.current, null);\n          }\n        }\n        \n      // Scrolling up with a current sticky item?\n      } else if (!isScrollingDown && self.current) {\n        if (scrollTop < self.current.top) {\n          // Sticky the previous item if we've scrolled up past\n          // the original position of the currently stickied item.\n          setCurrentItem(self.prev);\n        }\n        // Scrolling up, and just bumping into the item above (just set to current)?\n        // If we have a next item bumping into the current item, translate\n        // the current item up from the top as it scrolls into view.\n        if (self.current && self.next) {\n          if (scrollTop >= self.next.top - self.current.height) {\n            translate(self.current, self.next.top - scrollTop - self.current.height);\n          } else {\n            translate(self.current, null);\n          }\n        }\n      }\n    }\n     \n   function setCurrentItem(item) {\n     if (self.current === item) return;\n     // Deactivate currently active item\n     if (self.current) {\n       translate(self.current, null);\n       setStickyState(self.current, null);\n     }\n\n     // Activate new item if given\n     if (item) {\n       setStickyState(item, 'active');\n     }\n\n     self.current = item;\n     var index = self.items.indexOf(item);\n     // If index === -1, index + 1 = 0. It works out.\n     self.next = self.items[index + 1];\n     self.prev = self.items[index - 1];\n     setStickyState(self.next, 'next');\n     setStickyState(self.prev, 'prev');\n   }\n\n   function setStickyState(item, state) {\n     if (!item || item.state === state) return;\n     if (item.state) {\n       item.clone.attr('sticky-prev-state', item.state);\n       item.element.attr('sticky-prev-state', item.state);\n     }\n     item.clone.attr('sticky-state', state);\n     item.element.attr('sticky-state', state);\n     item.state = state;\n   }\n\n   function translate(item, amount) {\n     if (!item) return;\n     if (amount === null || amount === undefined) {\n       if (item.translateY) {\n         item.translateY = null;\n         item.clone.css($mdConstant.CSS.TRANSFORM, '');\n       }\n     } else {\n       item.translateY = amount;\n       item.clone.css(\n         $mdConstant.CSS.TRANSFORM, \n         'translate3d(' + item.left + 'px,' + amount + 'px,0)'\n       );\n     }\n   }\n  }\n\n  // Function to check for browser sticky support\n  function checkStickySupport($el) {\n    var stickyProp;\n    var testEl = angular.element('<div>');\n    $document[0].body.appendChild(testEl[0]);\n\n    var stickyProps = ['sticky', '-webkit-sticky'];\n    for (var i = 0; i < stickyProps.length; ++i) {\n      testEl.css({position: stickyProps[i], top: 0, 'z-index': 2});\n      if (testEl.css('position') == stickyProps[i]) {\n        stickyProp = stickyProps[i];\n        break;\n      }\n    }\n    testEl.remove();\n    return stickyProp;\n  }\n\n  // Android 4.4 don't accurately give scroll events.\n  // To fix this problem, we setup a fake scroll event. We say:\n  // > If a scroll or touchmove event has happened in the last DELAY milliseconds, \n  //   then send a `$scroll` event every animationFrame.\n  // Additionally, we add $scrollstart and $scrollend events.\n  function setupAugmentedScrollEvents(element) {\n    var SCROLL_END_DELAY = 200;\n    var isScrolling;\n    var lastScrollTime;\n    element.on('scroll touchmove', function() {\n      if (!isScrolling) {\n        isScrolling = true;\n        $$rAF(loopScrollEvent);\n        element.triggerHandler('$scrollstart');\n      }\n      element.triggerHandler('$scroll');\n      lastScrollTime = +$mdUtil.now();\n    });\n\n    function loopScrollEvent() {\n      if (+$mdUtil.now() - lastScrollTime > SCROLL_END_DELAY) {\n        isScrolling = false;\n        element.triggerHandler('$scrollend');\n      } else {\n        element.triggerHandler('$scroll');\n        $$rAF(loopScrollEvent);\n      }\n    }\n  }\n\n}\nMdSticky.$inject = [\"$document\", \"$mdConstant\", \"$compile\", \"$$rAF\", \"$mdUtil\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/subheader/subheader-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n.md-subheader.md-THEME_NAME-theme {\n  color: '{{ foreground-2-0.23 }}';\n  background-color: '{{background-hue-3}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/subheader/subheader.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n@-webkit-keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@-webkit-keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n@keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n.md-subheader {\n  display: block;\n  font-size: 0.9em;\n  font-weight: 400;\n  line-height: 1em;\n  padding: 16px 0px 16px 16px;\n  margin: 0 0 0 0;\n  margin-right: 16px;\n  position: relative; }\n  .md-subheader:not(.md-sticky-no-effect) {\n    transition: 0.2s ease-out margin; }\n    .md-subheader:not(.md-sticky-no-effect):after {\n      position: absolute;\n      left: 0;\n      bottom: 0;\n      top: 0;\n      right: -16px;\n      content: ''; }\n    .md-subheader:not(.md-sticky-no-effect).md-sticky-clone {\n      z-index: 2; }\n    .md-subheader:not(.md-sticky-no-effect)[sticky-state=\"active\"] {\n      margin-top: -2px; }\n    .md-subheader:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state=\"active\"]:after {\n      -webkit-animation: subheaderStickyHoverOut 0.3s ease-out both;\n              animation: subheaderStickyHoverOut 0.3s ease-out both; }\n  .md-subheader .md-subheader-content {\n    z-index: 1;\n    position: relative; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/subheader/subheader.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.subheader');\ngoog.require('ng.material.components.sticky');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.subheader\n * @description\n * SubHeader module\n *\n *  Subheaders are special list tiles that delineate distinct sections of a\n *  list or grid list and are typically related to the current filtering or\n *  sorting criteria. Subheader tiles are either displayed inline with tiles or\n *  can be associated with content, for example, in an adjacent column.\n *\n *  Upon scrolling, subheaders remain pinned to the top of the screen and remain\n *  pinned until pushed on or off screen by the next subheader. @see [Material\n *  Design Specifications](https://www.google.com/design/spec/components/subheaders.html)\n *\n *  > To improve the visual grouping of content, use the system color for your subheaders.\n *\n */\nangular.module('material.components.subheader', [\n  'material.core',\n  'material.components.sticky'\n])\n  .directive('mdSubheader', MdSubheaderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSubheader\n * @module material.components.subheader\n *\n * @restrict E\n *\n * @description\n * The `<md-subheader>` directive is a subheader for a section\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-subheader>Online Friends</md-subheader>\n * </hljs>\n */\n\nfunction MdSubheaderDirective($mdSticky, $compile, $mdTheming) {\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: \n      '<h2 class=\"md-subheader\">' +\n        '<span class=\"md-subheader-content\"></span>' +\n      '</h2>',\n    compile: function(element, attr, transclude) {\n      var outerHTML = element[0].outerHTML;\n      return function postLink(scope, element, attr) {\n        $mdTheming(element);\n        function getContent(el) {\n          return angular.element(el[0].querySelector('.md-subheader-content'));\n        }\n\n        // Transclude the user-given contents of the subheader\n        // the conventional way.\n        transclude(scope, function(clone) {\n          getContent(element).append(clone);\n        });\n\n        // Create another clone, that uses the outer and inner contents\n        // of the element, that will be 'stickied' as the user scrolls.\n        transclude(scope, function(clone) {\n          var stickyClone = $compile(angular.element(outerHTML))(scope);\n          $mdTheming(stickyClone);\n          getContent(stickyClone).append(clone);\n          $mdSticky(scope, element, stickyClone);\n        });\n      };\n    }\n  };\n}\nMdSubheaderDirective.$inject = [\"$mdSticky\", \"$compile\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/swipe/swipe.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.swipe');\n\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.swipe\n * @description Swipe module!\n */\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeLeft\n *\n * @restrict A\n *\n * @description\n * The md-swipe-left directives allows you to specify custom behavior when an element is swiped\n * left.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-left=\"onSwipeLeft()\">Swipe me left!</div>\n * </hljs>\n */\n\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeRight\n *\n * @restrict A\n *\n * @description\n * The md-swipe-right directives allows you to specify custom behavior when an element is swiped\n * right.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div md-swipe-right=\"onSwipeRight()\">Swipe me right!</div>\n * </hljs>\n */\n\nvar module = angular.module('material.components.swipe',[]);\n\n['SwipeLeft', 'SwipeRight'].forEach(function(name) {\n  var directiveName = 'md' + name;\n  var eventName = '$md.' + name.toLowerCase();\n\n  module.directive(directiveName, /*@ngInject*/ [\"$parse\", function($parse) {\n    return {\n      restrict: 'A',\n      link: postLink\n    };\n\n    function postLink(scope, element, attr) {\n      var fn = $parse(attr[directiveName]);\n\n      element.on(eventName, function(ev) {\n        scope.$apply(function() {\n          fn(scope, {\n            $event: ev\n          });\n        });\n      });\n\n    }\n  }]);\n});\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/switch/switch-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-switch.md-THEME_NAME-theme .md-thumb {\n  background-color: '{{background-50}}'; }\nmd-switch.md-THEME_NAME-theme .md-bar {\n  background-color: '{{background-500}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-thumb {\n  background-color: '{{accent-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-bar {\n  background-color: '{{accent-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {\n  background-color: '{{primary-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {\n  background-color: '{{primary-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {\n  background-color: '{{warn-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {\n  background-color: '{{warn-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-thumb {\n  background-color: '{{background-400}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-bar {\n  background-color: '{{foreground-4}}'; }\nmd-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {\n  border-color: '{{foreground-1}}';\n  border-style: dotted; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/switch/switch.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-switch {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-switch .md-container {\n    cursor: -webkit-grab;\n    cursor: grab;\n    width: 36px;\n    height: 24px;\n    position: relative;\n    -webkit-user-select: none;\n       -moz-user-select: none;\n        -ms-user-select: none;\n            user-select: none;\n    margin-right: 8px; }\n  md-switch:not([disabled]) .md-dragging, md-switch:not([disabled]).md-dragging .md-container {\n    cursor: -webkit-grabbing;\n    cursor: grabbing; }\n  md-switch .md-label {\n    border-color: transparent;\n    border-width: 0px; }\n  md-switch .md-bar {\n    left: 1px;\n    width: 34px;\n    top: 5px;\n    height: 14px;\n    border-radius: 8px;\n    position: absolute; }\n  md-switch .md-thumb-container {\n    top: 2px;\n    left: 0;\n    width: 16px;\n    position: absolute;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    z-index: 1; }\n  md-switch.md-checked .md-thumb-container {\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0); }\n  md-switch .md-thumb {\n    position: absolute;\n    margin: 0;\n    left: 0;\n    top: 0;\n    outline: none;\n    height: 20px;\n    width: 20px;\n    border-radius: 50%;\n    box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n    md-switch .md-thumb .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -20px;\n      top: -20px;\n      right: -20px;\n      bottom: -20px; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb-container, md-switch:not(.md-dragging) .md-thumb {\n    transition: all 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    transition-property: -webkit-transform, background-color;\n    transition-property: transform, background-color; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb {\n    transition-delay: 0.05s; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/switch/switch.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.switch');\ngoog.require('ng.material.components.checkbox');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @private\n * @ngdoc module\n * @name material.components.switch\n */\n\nangular.module('material.components.switch', [\n  'material.core',\n  'material.components.checkbox'\n])\n  .directive('mdSwitch', MdSwitch);\n\n/**\n * @private\n * @ngdoc directive\n * @module material.components.switch\n * @name mdSwitch\n * @restrict E\n *\n * The switch directive is used very much like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * As per the [material design spec](http://www.google.com/design/spec/style/color.html#color-ui-color-application)\n * the switch is in the accent color by default. The primary color palette may be used with\n * the `md-primary` class.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects.\n * @param {string=} aria-label Publish the button label used by screen-readers for accessibility. Defaults to the switch's text.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-switch ng-model=\"isActive\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-switch>\n *\n * <md-switch md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-switch>\n *\n * <md-switch ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-switch>\n *\n * </hljs>\n */\nfunction MdSwitch(mdCheckboxDirective, $mdTheming, $mdUtil, $document, $mdConstant, $parse, $$rAF, $mdGesture) {\n  var checkboxDirective = mdCheckboxDirective[0];\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-container\">' +\n        '<div class=\"md-bar\"></div>' +\n        '<div class=\"md-thumb-container\">' +\n          '<div class=\"md-thumb\" md-ink-ripple md-ink-ripple-checkbox></div>' +\n        '</div>'+\n      '</div>' +\n      '<div ng-transclude class=\"md-label\">' +\n      '</div>',\n    require: '?ngModel',\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var checkboxLink = checkboxDirective.compile(element, attr);\n    // no transition on initial load\n    element.addClass('md-dragging');\n\n    return function (scope, element, attr, ngModel) {\n      ngModel = ngModel || $mdUtil.fakeNgModel();\n      var disabledGetter = $parse(attr.ngDisabled);\n      var thumbContainer = angular.element(element[0].querySelector('.md-thumb-container'));\n      var switchContainer = angular.element(element[0].querySelector('.md-container'));\n\n      // no transition on initial load\n      $$rAF(function() {\n        element.removeClass('md-dragging');\n      });\n\n      checkboxLink(scope, element, attr, ngModel);\n\n      if (angular.isDefined(attr.ngDisabled)) {\n        scope.$watch(disabledGetter, function(isDisabled) {\n          element.attr('tabindex', isDisabled ? -1 : 0);\n        });\n      }\n\n      // These events are triggered by setup drag\n      $mdGesture.register(switchContainer, 'drag');\n      switchContainer\n        .on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      var drag;\n      function onDragStart(ev) {\n        // Don't go if ng-disabled===true\n        if (disabledGetter(scope)) return;\n        ev.stopPropagation();\n\n        element.addClass('md-dragging');\n        drag = {\n          width: thumbContainer.prop('offsetWidth')\n        };\n        element.removeClass('transition');\n      }\n\n      function onDrag(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n        ev.srcEvent && ev.srcEvent.preventDefault();\n\n        var percent = ev.pointer.distanceX / drag.width;\n\n        //if checked, start from right. else, start from left\n        var translate = ngModel.$viewValue ?  1 + percent : percent;\n        // Make sure the switch stays inside its bounds, 0-1%\n        translate = Math.max(0, Math.min(1, translate));\n\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + (100*translate) + '%,0,0)');\n        drag.translate = translate;\n      }\n\n      function onDragEnd(ev) {\n        if (!drag) return;\n        ev.stopPropagation();\n\n        element.removeClass('md-dragging');\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, '');\n\n        // We changed if there is no distance (this is a click a click),\n        // or if the drag distance is >50% of the total.\n        var isChanged = ngModel.$viewValue ? drag.translate < 0.5 : drag.translate > 0.5;\n        if (isChanged) {\n          applyModelValue(!ngModel.$viewValue);\n        }\n        drag = null;\n      }\n\n      function applyModelValue(newValue) {\n        scope.$apply(function() {\n          ngModel.$setViewValue(newValue);\n          ngModel.$render();\n        });\n      }\n\n    };\n  }\n\n\n}\nMdSwitch.$inject = [\"mdCheckboxDirective\", \"$mdTheming\", \"$mdUtil\", \"$document\", \"$mdConstant\", \"$parse\", \"$$rAF\", \"$mdGesture\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tabs/tabs-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-tabs.md-THEME_NAME-theme .md-header {\n  background-color: transparent; }\nmd-tabs.md-THEME_NAME-theme .md-paginator md-icon {\n  color: '{{primary-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent .md-header {\n  background-color: '{{accent-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {\n  color: '{{accent-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {\n    color: '{{accent-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary .md-header {\n  background-color: '{{primary-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {\n  color: '{{primary-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {\n    color: '{{primary-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-primary md-tab {\n  color: '{{primary-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {\n    color: '{{foreground-3}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {\n    color: '{{primary-contrast}}';\n    background-color: '{{primary-contrast-0.1}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {\n    color: '{{primary-contrast}}'; }\n  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {\n    color: '{{primary-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn .md-header {\n  background-color: '{{warn-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {\n  color: '{{warn-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {\n    color: '{{warn-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme md-tabs-ink-bar {\n  color: '{{accent-color}}';\n  background: '{{accent-color}}'; }\nmd-tabs.md-THEME_NAME-theme md-tab {\n  color: '{{foreground-2}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab[disabled] {\n    color: '{{foreground-3}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab:focus {\n    color: '{{foreground-1}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab.active {\n    color: '{{primary-color}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {\n    color: '{{accent-100}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tabs/tabs.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-tabs {\n  display: block;\n  width: 100%;\n  font-weight: 500;\n  overflow: auto; }\n\n.md-header {\n  width: 100%;\n  height: 48px;\n  box-sizing: border-box;\n  position: relative; }\n\n.md-paginator {\n  z-index: 1;\n  margin-right: -2px;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  width: 32px;\n  min-height: 100%;\n  cursor: pointer;\n  border: none;\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: center center;\n  position: absolute; }\n  .md-paginator.md-prev {\n    left: 0; }\n  .md-paginator.md-next {\n    right: 0; }\n    .md-paginator.md-next md-icon {\n      -webkit-transform: rotate(180deg);\n              transform: rotate(180deg); }\n\n/* If `center` justified, change to left-justify if paginating */\nmd-tabs[center] .md-header:not(.md-paginating) .md-header-items {\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n.md-paginating .md-header-items-container {\n  left: 32px;\n  right: 32px; }\n\n.md-header-items-container {\n  overflow: hidden;\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 100%;\n  white-space: nowrap;\n  font-size: 14px;\n  font-weight: 500;\n  text-transform: uppercase;\n  margin: auto; }\n  .md-header-items-container .md-header-items {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    box-sizing: border-box;\n    transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    height: 100%;\n    width: 99999px; }\n\n.md-tabs-content {\n  overflow: hidden;\n  width: 100%;\n  position: relative; }\n  .md-tabs-content .md-tab-content {\n    height: 100%; }\n    .md-tabs-content .md-tab-content.ng-hide.ng-animate {\n      display: block !important; }\n    .md-tabs-content .md-tab-content.ng-animate {\n      transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n      transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n      -webkit-transform: translateX(0);\n              transform: translateX(0); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-add {\n        -webkit-transform: translateX(-100%);\n                transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-add.md-transition-rtl {\n          -webkit-transform: translateX(100%);\n                  transform: translateX(100%); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove {\n        position: absolute;\n        -webkit-transform: translateX(100%);\n                transform: translateX(100%);\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0; }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.md-transition-rtl {\n          -webkit-transform: translateX(-100%);\n                  transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.ng-hide-remove-active {\n          -webkit-transform: translateX(0);\n                  transform: translateX(0); }\n\nmd-tabs-ink-bar {\n  z-index: 1;\n  display: none;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  box-sizing: border-box;\n  height: 2px;\n  margin-top: -2px;\n  -webkit-transform: scaleX(1);\n          transform: scaleX(1);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0; }\n  md-tabs-ink-bar.md-transition-right {\n    transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1), left 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s; }\n  md-tabs-ink-bar.md-transition-left {\n    transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s, left 0.25s cubic-bezier(0.35, 0, 0.25, 1); }\n\nmd-tab {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  position: relative;\n  z-index: 0;\n  overflow: hidden;\n  height: 100%;\n  text-align: center;\n  cursor: pointer;\n  padding: 20px 24px;\n  box-sizing: border-box;\n  transition: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-tab.md-tab-themed {\n    transition: background 0.35s cubic-bezier(0.35, 0, 0.25, 1), color 0.35s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-tab[disabled] {\n    pointer-events: none;\n    cursor: default; }\n  md-tab:focus {\n    outline: none; }\n  md-tab md-tab-label {\n    -webkit-flex: 1 1 auto;\n        -ms-flex: 1 1 auto;\n            flex: 1 1 auto;\n    z-index: 100;\n    opacity: 1;\n    overflow: hidden; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tabs/tabs.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.tabs');\ngoog.require('ng.material.components.icon');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tabs\n * @description\n *\n *  Tabs, created with the `<md-tabs>` directive provide *tabbed* navigation with different styles.\n *  The Tabs component consists of clickable tabs that are aligned horizontally side-by-side.\n *\n *  Features include support for:\n *\n *  - static or dynamic tabs,\n *  - responsive designs,\n *  - accessibility support (ARIA),\n *  - tab pagination,\n *  - external or internal tab content,\n *  - focus indicators and arrow-key navigations,\n *  - programmatic lookup and access to tab controllers, and\n *  - dynamic transitions through different tab contents.\n *\n */\n/*\n * @see js folder for tabs implementation\n */\nangular.module('material.components.tabs', [\n  'material.core',\n  'material.components.icon'\n]);\n\n})();\n\n(function() {\n'use strict';\n\n/**\n * Conditionally configure ink bar animations when the\n * tab selection changes. If `mdNoBar` then do not show the\n * bar nor animate.\n */\nangular.module('material.components.tabs')\n  .directive('mdTabsInkBar', MdTabInkDirective);\n\nfunction MdTabInkDirective($$rAF) {\n\n  var lastIndex = 0;\n\n  return {\n    restrict: 'E',\n    require: ['^?mdNoBar', '^mdTabs'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var mdNoBar = !!ctrls[0];\n\n    var tabsCtrl = ctrls[1],\n        debouncedUpdateBar = $$rAF.throttle(updateBar);\n\n    tabsCtrl.inkBarElement = element;\n\n    scope.$on('$mdTabsPaginationChanged', debouncedUpdateBar);\n\n    function updateBar() {\n      var selected = tabsCtrl.getSelectedItem();\n      var hideInkBar = !selected || tabsCtrl.count() < 2 || mdNoBar;\n\n      element.css('display', hideInkBar ? 'none' : 'block');\n\n      if (hideInkBar) return;\n\n      if (scope.pagination && scope.pagination.tabData) {\n        var index = tabsCtrl.getSelectedIndex();\n        var data = scope.pagination.tabData.tabs[index] || { left: 0, right: 0, width: 0 };\n        var right = element.parent().prop('offsetWidth') - data.right;\n        var classNames = ['md-transition-left', 'md-transition-right', 'md-no-transition'];\n        var classIndex = lastIndex > index ? 0 : lastIndex < index ? 1 : 2;\n\n        element\n            .removeClass(classNames.join(' '))\n            .addClass(classNames[classIndex])\n            .css({ left: data.left + 'px', right: right + 'px' });\n\n        lastIndex = index;\n      }\n    }\n  }\n}\nMdTabInkDirective.$inject = [\"$$rAF\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n    .directive('mdTabsPagination', TabPaginationDirective);\n\nfunction TabPaginationDirective($mdConstant, $window, $$rAF, $$q, $timeout, $mdMedia) {\n\n  // Must match (2 * width of paginators) in scss\n  var PAGINATORS_WIDTH = (8 * 4) * 2;\n\n  return {\n    restrict: 'A',\n    require: '^mdTabs',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl) {\n\n    var tabs = element[0].getElementsByTagName('md-tab');\n    var debouncedUpdatePagination = $$rAF.throttle(updatePagination);\n    var tabsParent = element.children();\n    var locked = false;\n    var state = scope.pagination = {\n      page: -1,\n      active: false,\n      clickNext: function() { locked || userChangePage(+1); },\n      clickPrevious: function() { locked || userChangePage(-1); }\n    };\n\n    scope.$on('$mdTabsChanged', debouncedUpdatePagination);\n    angular.element($window).on('resize', debouncedUpdatePagination);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdatePagination);\n    });\n\n    scope.$watch(function() { return tabsCtrl.tabToFocus; }, onTabFocus);\n\n    // Make sure we don't focus an element on the next page\n    // before it's in view\n    function onTabFocus(tab, oldTab) {\n      if (!tab) return;\n\n      var pageIndex = getPageForTab(tab);\n      if (!state.active || pageIndex === state.page) {\n        tab.element.focus();\n      } else {\n        // Go to the new page, wait for the page transition to end, then focus.\n        oldTab && oldTab.element.blur();\n        setPage(pageIndex).then(function() {\n          locked = false;\n          tab.element.focus();\n        });\n      }\n    }\n\n    // Called when page is changed by a user action (click)\n    function userChangePage(increment) {\n      var sizeData = state.tabData;\n      var newPage = Math.max(0, Math.min(sizeData.pages.length - 1, state.page + increment));\n      var newTabIndex = sizeData.pages[newPage][ increment > 0 ? 'firstTabIndex' : 'lastTabIndex' ];\n      var newTab = tabsCtrl.itemAt(newTabIndex);\n      locked = true;\n      onTabFocus(newTab);\n    }\n\n    function updatePagination() {\n      if (!element.prop('offsetParent')) {\n        var watcher = waitForVisible();\n        return;\n      }\n\n      var tabs = element.find('md-tab');\n\n      disablePagination();\n\n      var sizeData = state.tabData = calculateTabData();\n      var needPagination = state.active = sizeData.pages.length > 1;\n\n      if (needPagination) { enablePagination(); }\n\n      scope.$evalAsync(function () { scope.$broadcast('$mdTabsPaginationChanged'); });\n\n      function enablePagination() {\n        tabsParent.css('width', '9999px');\n\n        //-- apply filler margins\n        angular.forEach(sizeData.tabs, function (tab) {\n          angular.element(tab.element).css('margin-left', tab.filler + 'px');\n        });\n\n        setPage(getPageForTab(tabsCtrl.getSelectedItem()));\n      }\n\n      function disablePagination() {\n        slideTabButtons(0);\n        tabsParent.css('width', '');\n        tabs.css('width', '');\n        tabs.css('margin-left', '');\n        state.page = null;\n        state.active = false;\n      }\n\n      function waitForVisible() {\n        return watcher || scope.$watch(\n            function () {\n              $timeout(function () {\n                if (element[0].offsetParent) {\n                  if (angular.isFunction(watcher)) {\n                    watcher();\n                  }\n                  debouncedUpdatePagination();\n                  watcher = null;\n                }\n              }, 0, false);\n            }\n        );\n      }\n    }\n\n    function slideTabButtons(x) {\n      if (tabsCtrl.pagingOffset === x) {\n        // Resolve instantly if no change\n        return $$q.when();\n      }\n\n      var deferred = $$q.defer();\n\n      tabsCtrl.$$pagingOffset = x;\n      tabsParent.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + x + 'px,0,0)');\n      tabsParent.on($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n\n      return deferred.promise;\n\n      function onTabsParentTransitionEnd(ev) {\n        // Make sure this event didn't bubble up from an animation in a child element.\n        if (ev.target === tabsParent[0]) {\n          tabsParent.off($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n          deferred.resolve();\n        }\n      }\n    }\n\n    function shouldStretchTabs() {\n      switch (scope.stretchTabs) {\n        case 'never':  return false;\n        case 'always': return true;\n        default:       return $mdMedia('sm');\n      }\n    }\n\n    function calculateTabData(noAdjust) {\n      var clientWidth = element.parent().prop('offsetWidth');\n      var tabsWidth = clientWidth - PAGINATORS_WIDTH - 1;\n      var $tabs = angular.element(tabs);\n      var totalWidth = 0;\n      var max = 0;\n      var tabData = [];\n      var pages = [];\n      var currentPage;\n\n      $tabs.css('max-width', '');\n      angular.forEach(tabs, function (tab, index) {\n        var tabWidth = Math.min(tabsWidth, tab.offsetWidth);\n        var data = {\n          element: tab,\n          left: totalWidth,\n          width: tabWidth,\n          right: totalWidth + tabWidth,\n          filler: 0\n        };\n\n        //-- This calculates the page for each tab.  The first page will use the clientWidth, which\n        //   does not factor in the pagination items.  After the first page, tabsWidth is used\n        //   because at this point, we know that the pagination buttons will be shown.\n        data.page = Math.ceil(data.right / ( pages.length === 1 && index === tabs.length - 1 ? clientWidth : tabsWidth )) - 1;\n\n        if (data.page >= pages.length) {\n          data.filler = (tabsWidth * data.page) - data.left;\n          data.right += data.filler;\n          data.left += data.filler;\n          currentPage = {\n            left: data.left,\n            firstTabIndex: index,\n            lastTabIndex: index,\n            tabs: [ data ]\n          };\n          pages.push(currentPage);\n        } else {\n          currentPage.lastTabIndex = index;\n          currentPage.tabs.push(data);\n        }\n        totalWidth = data.right;\n        max = Math.max(max, tabWidth);\n        tabData.push(data);\n      });\n      $tabs.css('max-width', tabsWidth + 'px');\n\n      if (!noAdjust && shouldStretchTabs()) {\n        return adjustForStretchedTabs();\n      } else {\n        return {\n          width: totalWidth,\n          max: max,\n          tabs: tabData,\n          pages: pages,\n          tabElements: tabs\n        };\n      }\n\n\n      function adjustForStretchedTabs() {\n        var canvasWidth = pages.length === 1 ? clientWidth : tabsWidth;\n        var tabsPerPage = Math.min(Math.floor(canvasWidth / max), tabs.length);\n        var tabWidth    = Math.floor(canvasWidth / tabsPerPage);\n        $tabs.css('width', tabWidth + 'px');\n        return calculateTabData(true);\n      }\n    }\n\n    function getPageForTab(tab) {\n      var tabIndex = tabsCtrl.indexOf(tab);\n      if (tabIndex === -1) return 0;\n\n      var sizeData = state.tabData;\n\n      return sizeData ? sizeData.tabs[tabIndex].page : 0;\n    }\n\n    function setPage(page) {\n      if (page === state.page) return;\n\n      var lastPage = state.tabData.pages.length - 1;\n\n      if (page < 0) page = 0;\n      if (page > lastPage) page = lastPage;\n\n      state.hasPrev = page > 0;\n      state.hasNext = page < lastPage;\n\n      state.page = page;\n\n      scope.$broadcast('$mdTabsPaginationChanged');\n\n      return slideTabButtons(-state.tabData.pages[page].left);\n    }\n  }\n\n}\nTabPaginationDirective.$inject = [\"$mdConstant\", \"$window\", \"$$rAF\", \"$$q\", \"$timeout\", \"$mdMedia\"];\n})();\n\n(function() {\n'use strict';\n\n\nangular.module('material.components.tabs')\n  .controller('$mdTab', TabItemController);\n\nfunction TabItemController($scope, $element, $attrs, $compile, $animate, $mdUtil, $parse, $timeout) {\n  var self = this;\n  var tabsCtrl = $element.controller('mdTabs');\n\n  // Properties\n  self.contentContainer = angular.element('<div class=\"md-tab-content ng-hide\">');\n  self.element = $element;\n\n  // Methods\n  self.isDisabled = isDisabled;\n  self.onAdd = onAdd;\n  self.onRemove = onRemove;\n  self.onSelect = onSelect;\n  self.onDeselect = onDeselect;\n\n  var disabledParsed = $parse($attrs.ngDisabled);\n  function isDisabled() {\n    return disabledParsed($scope.$parent);\n  }\n  \n  /**\n   * Add the tab's content to the DOM container area in the tabs,\n   * @param contentArea the contentArea to add the content of the tab to\n   */\n  function onAdd(contentArea, shouldDisconnectScope) {\n    if (self.content.length) {\n      self.contentContainer.append(self.content);\n      self.contentScope = $scope.$parent.$new();\n      contentArea.append(self.contentContainer);\n\n      $compile(self.contentContainer)(self.contentScope);\n      if (shouldDisconnectScope === true) {\n        $timeout(function () {\n          $mdUtil.disconnectScope(self.contentScope);\n        }, 0, false);\n      }\n    }\n  }\n\n  function onRemove() {\n    $animate.leave(self.contentContainer).then(function() {\n      self.contentScope && self.contentScope.$destroy();\n      self.contentScope = null;\n    });\n  }\n\n  function toggleAnimationClass(rightToLeft) {\n    self.contentContainer[rightToLeft ? 'addClass' : 'removeClass']('md-transition-rtl');\n  }\n\n  function onSelect(rightToLeft) {\n    // Resume watchers and events firing when tab is selected\n    $mdUtil.reconnectScope(self.contentScope);\n\n    $element\n      .addClass('active')\n      .attr({\n        'aria-selected': true,\n        'tabIndex': 0\n      })\n      .on('$md.swipeleft $md.swiperight', onSwipe);\n\n    toggleAnimationClass(rightToLeft);\n    $animate.removeClass(self.contentContainer, 'ng-hide');\n\n    $scope.onSelect();\n  }\n\n  function onDeselect(rightToLeft) {\n    // Stop watchers & events from firing while tab is deselected\n    $mdUtil.disconnectScope(self.contentScope);\n\n    $element\n      .removeClass('active')\n      .attr({\n        'aria-selected': false,\n        'tabIndex': -1\n      })\n      .off('$md.swipeleft $md.swiperight', onSwipe);\n\n    toggleAnimationClass(rightToLeft);\n    $animate.addClass(self.contentContainer, 'ng-hide');\n\n    $scope.onDeselect();\n  }\n\n  ///// Private functions\n\n  function onSwipe(ev) {\n    $scope.$apply(function() {\n      if (/left/.test(ev.type)) {\n        tabsCtrl.select(tabsCtrl.next());\n      } else {\n        tabsCtrl.select(tabsCtrl.previous());\n      }\n    });\n  }\n \n\n}\nTabItemController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$compile\", \"$animate\", \"$mdUtil\", \"$parse\", \"$timeout\"];\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTab', MdTabDirective);\n\n/**\n * @ngdoc directive\n * @name mdTab\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * Use the `<md-tab>` a nested directive used within `<md-tabs>` to specify a tab with a **label** and optional *view content*.\n *\n * If the `label` attribute is not specified, then an optional `<md-tab-label>` tag can be used to specify more\n * complex tab header markup. If neither the **label** nor the **md-tab-label** are specified, then the nested\n * markup of the `<md-tab>` is used as the tab header markup.\n *\n * If a tab **label** has been identified, then any **non-**`<md-tab-label>` markup\n * will be considered tab content and will be transcluded to the internal `<div class=\"md-tabs-content\">` container.\n *\n * This container is used by the TabsController to show/hide the active tab's content view. This synchronization is\n * automatically managed by the internal TabsController whenever the tab selection changes. Selection changes can\n * be initiated via data binding changes, programmatic invocation, or user gestures.\n *\n * @param {string=} label Optional attribute to specify a simple string as the tab label\n * @param {boolean=} md-active When evaluteing to true, selects the tab.\n * @param {boolean=} disabled If present, disabled tab selection.\n * @param {expression=} md-on-deselect Expression to be evaluated after the tab has been de-selected.\n * @param {expression=} md-on-select Expression to be evaluated after the tab has been selected.\n *\n *\n * @usage\n *\n * <hljs lang=\"html\">\n * <md-tab label=\"\" disabled=\"\" md-on-select=\"\" md-on-deselect=\"\" >\n *   <h3>My Tab content</h3>\n * </md-tab>\n *\n * <md-tab >\n *   <md-tab-label>\n *     <h3>My Tab content</h3>\n *   </md-tab-label>\n *   <p>\n *     Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,\n *     totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae\n *     dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,\n *     sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n *   </p>\n * </md-tab>\n * </hljs>\n *\n */\nfunction MdTabDirective($mdInkRipple, $compile, $mdUtil, $mdConstant, $timeout) {\n  return {\n    restrict: 'E',\n    require: ['mdTab', '^mdTabs'],\n    controller: '$mdTab',\n    scope: {\n      onSelect: '&mdOnSelect',\n      onDeselect: '&mdOnDeselect',\n      label: '@'\n    },\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var tabLabel = element.find('md-tab-label');\n\n    if (tabLabel.length) {\n      // If a tab label element is found, remove it for later re-use.\n      tabLabel.remove();\n\n    } else if (angular.isDefined(attr.label)) {\n      // Otherwise, try to use attr.label as the label\n      tabLabel = angular.element('<md-tab-label>').html(attr.label);\n\n    } else {\n      // If nothing is found, use the tab's content as the label\n      tabLabel = angular.element('<md-tab-label>')\n                        .append(element.contents().remove());\n    }\n\n    // Everything that's left as a child is the tab's content.\n    var tabContent = element.contents().remove();\n\n    return function postLink(scope, element, attr, ctrls) {\n\n      var tabItemCtrl = ctrls[0]; // Controller for THIS tabItemCtrl\n      var tabsCtrl = ctrls[1]; // Controller for ALL tabs\n\n      $timeout(element.addClass.bind(element, 'md-tab-themed'), 0, false);\n\n      scope.$watch(\n          function () { return attr.label; },\n          function () { $timeout(function () { tabsCtrl.scope.$broadcast('$mdTabsChanged'); }, 0, false); }\n      );\n\n      transcludeTabContent();\n      configureAria();\n\n      $mdInkRipple.attachTabBehavior(scope, element, {\n        colorElement: tabsCtrl.inkBarElement\n      });\n      tabsCtrl.add(tabItemCtrl);\n      scope.$on('$destroy', function() {\n        tabsCtrl.remove(tabItemCtrl);\n      });\n      element.on('$destroy', function () {\n        //-- wait for item to be removed from the dom\n        $timeout(function () {\n          tabsCtrl.scope.$broadcast('$mdTabsChanged');\n        }, 0, false);\n      });\n\n      if (!angular.isDefined(attr.ngClick)) {\n        element.on('click', defaultClickListener);\n      }\n      element.on('keydown', keydownListener);\n\n      if (angular.isNumber(scope.$parent.$index)) {\n        watchNgRepeatIndex();\n      }\n      if (angular.isDefined(attr.mdActive)) {\n        watchActiveAttribute();\n      }\n      watchDisabled();\n\n      function transcludeTabContent() {\n        // Clone the label we found earlier, and $compile and append it\n        var label = tabLabel.clone();\n        element.append(label);\n        $compile(label)(scope.$parent);\n\n        // Clone the content we found earlier, and mark it for later placement into\n        // the proper content area.\n        tabItemCtrl.content = tabContent.clone();\n      }\n\n      //defaultClickListener isn't applied if the user provides an ngClick expression.\n      function defaultClickListener() {\n        scope.$apply(function() {\n          tabsCtrl.select(tabItemCtrl);\n          tabsCtrl.focus(tabItemCtrl);\n        });\n      }\n      function keydownListener(ev) {\n        if (ev.keyCode == $mdConstant.KEY_CODE.SPACE || ev.keyCode == $mdConstant.KEY_CODE.ENTER ) {\n          // Fire the click handler to do normal selection if space is pressed\n          element.triggerHandler('click');\n          ev.preventDefault();\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.previous(tabItemCtrl));\n          });\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.next(tabItemCtrl));\n          });\n        }\n      }\n\n      // If tabItemCtrl is part of an ngRepeat, move the tabItemCtrl in our internal array\n      // when its $index changes\n      function watchNgRepeatIndex() {\n        // The tabItemCtrl has an isolate scope, so we watch the $index on the parent.\n        scope.$watch('$parent.$index', function $indexWatchAction(newIndex) {\n          tabsCtrl.move(tabItemCtrl, newIndex);\n        });\n      }\n\n      function watchActiveAttribute() {\n        var unwatch = scope.$parent.$watch('!!(' + attr.mdActive + ')', activeWatchAction);\n        scope.$on('$destroy', unwatch);\n\n        function activeWatchAction(isActive) {\n          var isSelected = tabsCtrl.getSelectedItem() === tabItemCtrl;\n\n          if (isActive && !isSelected) {\n            tabsCtrl.select(tabItemCtrl);\n          } else if (!isActive && isSelected) {\n            tabsCtrl.deselect(tabItemCtrl);\n          }\n        }\n      }\n\n      function watchDisabled() {\n        scope.$watch(tabItemCtrl.isDisabled, disabledWatchAction);\n\n        function disabledWatchAction(isDisabled) {\n          element.attr('aria-disabled', isDisabled);\n\n          // Auto select `next` tab when disabled\n          var isSelected = (tabsCtrl.getSelectedItem() === tabItemCtrl);\n          if (isSelected && isDisabled) {\n            tabsCtrl.select(tabsCtrl.next() || tabsCtrl.previous());\n          }\n\n        }\n      }\n\n      function configureAria() {\n        // Link together the content area and tabItemCtrl with an id\n        var tabId = attr.id || ('tab_' + $mdUtil.nextUid());\n\n        element.attr({\n          id: tabId,\n          role: 'tab',\n          tabIndex: -1 //this is also set on select/deselect in tabItemCtrl\n        });\n\n        // Only setup the contentContainer's aria attributes if tab content is provided\n        if (tabContent.length) {\n          var tabContentId = 'content_' + tabId;\n          if (!element.attr('aria-controls')) {\n            element.attr('aria-controls', tabContentId);\n          }\n          tabItemCtrl.contentContainer.attr({\n            id: tabContentId,\n            role: 'tabpanel',\n            'aria-labelledby': tabId\n          });\n        }\n      }\n\n    };\n\n  }\n\n}\nMdTabDirective.$inject = [\"$mdInkRipple\", \"$compile\", \"$mdUtil\", \"$mdConstant\", \"$timeout\"];\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .controller('$mdTabs', MdTabsController);\n\nfunction MdTabsController($scope, $element, $mdUtil, $timeout) {\n\n  var tabsList = $mdUtil.iterator([], false);\n  var self = this;\n\n  // Properties\n  self.$element = $element;\n  self.scope = $scope;\n  // The section containing the tab content $elements\n  var contentArea = self.contentArea = angular.element($element[0].querySelector('.md-tabs-content'));\n\n  // Methods from iterator\n  var inRange = self.inRange = tabsList.inRange;\n  var indexOf = self.indexOf = tabsList.indexOf;\n  var itemAt = self.itemAt = tabsList.itemAt;\n  self.count = tabsList.count;\n\n  self.getSelectedItem = getSelectedItem;\n  self.getSelectedIndex = getSelectedIndex;\n  self.add = add;\n  self.remove = remove;\n  self.move = move;\n  self.select = select;\n  self.focus = focus;\n  self.deselect = deselect;\n\n  self.next = next;\n  self.previous = previous;\n\n  $scope.$on('$destroy', function() {\n    deselect(getSelectedItem());\n    for (var i = tabsList.count() - 1; i >= 0; i--) {\n      remove(tabsList[i], true);\n    }\n  });\n\n  // Get the selected tab\n  function getSelectedItem() {\n    return itemAt($scope.selectedIndex);\n  }\n\n  function getSelectedIndex() {\n    return $scope.selectedIndex;\n  }\n\n  // Add a new tab.\n  // Returns a method to remove the tab from the list.\n  function add(tab, index) {\n    tabsList.add(tab, index);\n\n    // Select the new tab if we don't have a selectedIndex, or if the\n    // selectedIndex we've been waiting for is this tab\n    if (!angular.isDefined(tab.element.attr('md-active')) && ($scope.selectedIndex === -1 || !angular.isNumber($scope.selectedIndex) ||\n        $scope.selectedIndex === self.indexOf(tab))) {\n      tab.onAdd(self.contentArea, false);\n      self.select(tab);\n    } else {\n      tab.onAdd(self.contentArea, true);\n    }\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function remove(tab, noReselect) {\n    if (!tabsList.contains(tab)) return;\n    if (noReselect) return;\n    var isSelectedItem = getSelectedItem() === tab,\n        newTab = previous() || next();\n\n    deselect(tab);\n    tabsList.remove(tab);\n    tab.onRemove();\n\n    $scope.$broadcast('$mdTabsChanged');\n\n    if (isSelectedItem) { select(newTab); }\n  }\n\n  // Move a tab (used when ng-repeat order changes)\n  function move(tab, toIndex) {\n    var isSelected = getSelectedItem() === tab;\n\n    tabsList.remove(tab);\n    tabsList.add(tab, toIndex);\n    if (isSelected) select(tab);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function select(tab, rightToLeft) {\n    if (!tab || tab.isSelected || tab.isDisabled()) return;\n    if (!tabsList.contains(tab)) return;\n\n    if (!angular.isDefined(rightToLeft)) {\n      rightToLeft = indexOf(tab) < $scope.selectedIndex;\n    }\n    deselect(getSelectedItem(), rightToLeft);\n\n    $scope.selectedIndex = indexOf(tab);\n    tab.isSelected = true;\n    tab.onSelect(rightToLeft);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function focus(tab) {\n    // this variable is watched by pagination\n    self.tabToFocus = tab;\n  }\n\n  function deselect(tab, rightToLeft) {\n    if (!tab || !tab.isSelected) return;\n    if (!tabsList.contains(tab)) return;\n\n    $scope.selectedIndex = -1;\n    tab.isSelected = false;\n    tab.onDeselect(rightToLeft);\n  }\n\n  function next(tab, filterFn) {\n    return tabsList.next(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n  function previous(tab, filterFn) {\n    return tabsList.previous(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n\n  function isTabEnabled(tab) {\n    return tab && !tab.isDisabled();\n  }\n\n}\nMdTabsController.$inject = [\"$scope\", \"$element\", \"$mdUtil\", \"$timeout\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTabs', TabsDirective);\n\n/**\n * @ngdoc directive\n * @name mdTabs\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * The `<md-tabs>` directive serves as the container for 1..n `<md-tab>` child directives to produces a Tabs components.\n * In turn, the nested `<md-tab>` directive is used to specify a tab label for the **header button** and a [optional] tab view\n * content that will be associated with each tab button.\n *\n * Below is the markup for its simplest usage:\n *\n *  <hljs lang=\"html\">\n *  <md-tabs>\n *    <md-tab label=\"Tab #1\"></md-tab>\n *    <md-tab label=\"Tab #2\"></md-tab>\n *    <md-tab label=\"Tab #3\"></md-tab>\n *  </md-tabs>\n *  </hljs>\n *\n * Tabs supports three (3) usage scenarios:\n *\n *  1. Tabs (buttons only)\n *  2. Tabs with internal view content\n *  3. Tabs with external view content\n *\n * **Tab-only** support is useful when tab buttons are used for custom navigation regardless of any other components, content, or views.\n * **Tabs with internal views** are the traditional usages where each tab has associated view content and the view switching is managed internally by the Tabs component.\n * **Tabs with external view content** is often useful when content associated with each tab is independently managed and data-binding notifications announce tab selection changes.\n *\n * > As a performance bonus, if the tab content is managed internally then the non-active (non-visible) tab contents are temporarily disconnected from the `$scope.$digest()` processes; which restricts and optimizes DOM updates to only the currently active tab.\n *\n * Additional features also include:\n *\n * *  Content can include any markup.\n * *  If a tab is disabled while active/selected, then the next tab will be auto-selected.\n * *  If the currently active tab is the last tab, then next() action will select the first tab.\n * *  Any markup (other than **`<md-tab>`** tags) will be transcluded into the tab header area BEFORE the tab buttons.\n *\n * ### Explanation of tab stretching\n *\n * Initially, tabs will have an inherent size.  This size will either be defined by how much space is needed to accommodate their text or set by the user through CSS.  Calculations will be based on this size.\n *\n * On mobile devices, tabs will be expanded to fill the available horizontal space.  When this happens, all tabs will become the same size.\n *\n * On desktops, by default, stretching will never occur.\n *\n * This default behavior can be overridden through the `md-stretch-tabs` attribute.  Here is a table showing when stretching will occur:\n *\n * `md-stretch-tabs` | mobile    | desktop\n * ------------------|-----------|--------\n * `auto`            | stretched | ---\n * `always`          | stretched | stretched\n * `never`           | ---       | ---\n *\n * @param {integer=} md-selected Index of the active/selected tab\n * @param {boolean=} md-no-ink If present, disables ink ripple effects.\n * @param {boolean=} md-no-bar If present, disables the selection ink bar.\n * @param {string=}  md-align-tabs Attribute to indicate position of tab buttons: `bottom` or `top`; default is `top`\n * @param {string=} md-stretch-tabs Attribute to indicate whether or not to stretch tabs: `auto`, `always`, or `never`; default is `auto`\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-tabs md-selected=\"selectedIndex\" >\n *   <img ng-src=\"img/angular.png\" class=\"centered\">\n *\n *   <md-tab\n *      ng-repeat=\"tab in tabs | orderBy:predicate:reversed\"\n *      md-on-select=\"onTabSelected(tab)\"\n *      md-on-deselect=\"announceDeselected(tab)\"\n *      disabled=\"tab.disabled\" >\n *\n *       <md-tab-label>\n *           {{tab.title}}\n *           <img src=\"img/removeTab.png\"\n *                ng-click=\"removeTab(tab)\"\n *                class=\"delete\" >\n *       </md-tab-label>\n *\n *       {{tab.content}}\n *\n *   </md-tab>\n *\n * </md-tabs>\n * </hljs>\n *\n */\nfunction TabsDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: '$mdTabs',\n    require: 'mdTabs',\n    transclude: true,\n    scope: {\n      selectedIndex: '=?mdSelected'\n    },\n    template:\n      '<section class=\"md-header\" ' +\n        'ng-class=\"{\\'md-paginating\\': pagination.active}\">' +\n\n        '<button class=\"md-paginator md-prev\" ' +\n          'ng-if=\"pagination.active && pagination.hasPrev\" ' +\n          'ng-click=\"pagination.clickPrevious()\" ' +\n          'aria-hidden=\"true\">' +\n          '<md-icon md-svg-icon=\"tabs-arrow\"></md-icon>' +\n        '</button>' +\n\n        // overflow: hidden container when paginating\n        '<div class=\"md-header-items-container\" md-tabs-pagination>' +\n          // flex container for <md-tab> elements\n          '<div class=\"md-header-items\">' +\n            '<md-tabs-ink-bar></md-tabs-ink-bar>' +\n          '</div>' +\n        '</div>' +\n\n        '<button class=\"md-paginator md-next\" ' +\n          'ng-if=\"pagination.active && pagination.hasNext\" ' +\n          'ng-click=\"pagination.clickNext()\" ' +\n          'aria-hidden=\"true\">' +\n          '<md-icon md-svg-icon=\"tabs-arrow\"></md-icon>' +\n        '</button>' +\n\n      '</section>' +\n      '<section class=\"md-tabs-content\"></section>',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl, transclude) {\n\n    scope.stretchTabs = attr.hasOwnProperty('mdStretchTabs') ? attr.mdStretchTabs || 'always' : 'auto';\n\n    $mdTheming(element);\n    configureAria();\n    watchSelected();\n\n    transclude(scope.$parent, function(clone) {\n      angular.element(element[0].querySelector('.md-header-items')).append(clone);\n    });\n\n    function configureAria() {\n      element.attr('role', 'tablist');\n    }\n\n    function watchSelected() {\n      scope.$watch('selectedIndex', function watchSelectedIndex(newIndex, oldIndex) {\n        if (oldIndex == newIndex) return;\n        var rightToLeft = oldIndex > newIndex;\n        tabsCtrl.deselect(tabsCtrl.itemAt(oldIndex), rightToLeft);\n\n        if (tabsCtrl.inRange(newIndex)) {\n          var newTab = tabsCtrl.itemAt(newIndex);\n          while (newTab && newTab.isDisabled()) {\n            newTab = newIndex > oldIndex \n                ? tabsCtrl.next(newTab)\n                : tabsCtrl.previous(newTab);\n          }\n          tabsCtrl.select(newTab, rightToLeft);\n        }\n      });\n    }\n  }\n}\nTabsDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/textField/textField-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme label {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {\n  border-color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {\n  border-color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {\n  color: '{{foreground-2}}'; }\nmd-input-group.md-THEME_NAME-theme .md-input[disabled] {\n  border-bottom-color: '{{foreground-4}}';\n  color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/textField/textField.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-input-group label, .md-input-group label {\n  display: block;\n  font-size: 0.75em; }\nmd-input-group textarea, md-input-group input[type=\"text\"], md-input-group input[type=\"password\"], md-input-group input[type=\"datetime\"], md-input-group input[type=\"datetime-local\"], md-input-group input[type=\"date\"], md-input-group input[type=\"month\"], md-input-group input[type=\"time\"], md-input-group input[type=\"week\"], md-input-group input[type=\"number\"], md-input-group input[type=\"email\"], md-input-group input[type=\"url\"], md-input-group input[type=\"search\"], md-input-group input[type=\"tel\"], md-input-group input[type=\"color\"], .md-input-group textarea, .md-input-group input[type=\"text\"], .md-input-group input[type=\"password\"], .md-input-group input[type=\"datetime\"], .md-input-group input[type=\"datetime-local\"], .md-input-group input[type=\"date\"], .md-input-group input[type=\"month\"], .md-input-group input[type=\"time\"], .md-input-group input[type=\"week\"], .md-input-group input[type=\"number\"], .md-input-group input[type=\"email\"], .md-input-group input[type=\"url\"], .md-input-group input[type=\"search\"], .md-input-group input[type=\"tel\"], .md-input-group input[type=\"color\"] {\n  display: block;\n  border-width: 0 0 1px 0;\n  padding-top: 2px;\n  line-height: 26px;\n  padding-bottom: 1px; }\n  md-input-group textarea:focus, md-input-group input[type=\"text\"]:focus, md-input-group input[type=\"password\"]:focus, md-input-group input[type=\"datetime\"]:focus, md-input-group input[type=\"datetime-local\"]:focus, md-input-group input[type=\"date\"]:focus, md-input-group input[type=\"month\"]:focus, md-input-group input[type=\"time\"]:focus, md-input-group input[type=\"week\"]:focus, md-input-group input[type=\"number\"]:focus, md-input-group input[type=\"email\"]:focus, md-input-group input[type=\"url\"]:focus, md-input-group input[type=\"search\"]:focus, md-input-group input[type=\"tel\"]:focus, md-input-group input[type=\"color\"]:focus, .md-input-group textarea:focus, .md-input-group input[type=\"text\"]:focus, .md-input-group input[type=\"password\"]:focus, .md-input-group input[type=\"datetime\"]:focus, .md-input-group input[type=\"datetime-local\"]:focus, .md-input-group input[type=\"date\"]:focus, .md-input-group input[type=\"month\"]:focus, .md-input-group input[type=\"time\"]:focus, .md-input-group input[type=\"week\"]:focus, .md-input-group input[type=\"number\"]:focus, .md-input-group input[type=\"email\"]:focus, .md-input-group input[type=\"url\"]:focus, .md-input-group input[type=\"search\"]:focus, .md-input-group input[type=\"tel\"]:focus, .md-input-group input[type=\"color\"]:focus {\n    outline: 0; }\nmd-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n  background: none; }\n\nmd-input-group, .md-input-group {\n  padding-bottom: 2px;\n  margin: 10px 0 8px 0;\n  position: relative;\n  display: block; }\n  md-input-group label, .md-input-group label {\n    font-size: 1em;\n    z-index: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased; }\n    md-input-group label:hover, .md-input-group label:hover {\n      cursor: text; }\n  md-input-group label, .md-input-group label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n    border-bottom-width: 1px;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group.md-input-focused label, .md-input-group.md-input-focused label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-focused input, md-input-group.md-input-focused textarea, .md-input-group.md-input-focused input, .md-input-group.md-input-focused textarea {\n    border-bottom-width: 2px; }\n  md-input-group.md-input-focused input, .md-input-group.md-input-focused input {\n    padding-bottom: 0px; }\n  md-input-group.md-input-has-value label, .md-input-group.md-input-has-value label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-has-value:not(.md-input-focused) label, .md-input-group.md-input-has-value:not(.md-input-focused) label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    border-bottom-width: 0px; }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    background-size: 3px 1px;\n    background-position: 0 bottom;\n    background-size: 2px 1px;\n    background-repeat: repeat-x;\n    pointer-events: none; }\n  md-input-group[disabled] label, .md-input-group[disabled] label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] *:not(.md-input-has-value) label, .md-input-group[disabled] *:not(.md-input-has-value) label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/textField/textField.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.textField');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.textField\n * @description\n * Form\n */\nangular.module('material.components.textField', [\n  'material.core'\n])\n  .directive('mdInputGroup', mdInputGroupDirective)\n  .directive('mdInput', mdInputDirective)\n  .directive('mdTextFloat', mdTextFloatDirective);\n\n\nfunction mdTextFloatDirective($mdTheming, $mdUtil, $parse, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    scope : {\n      fid : '@?mdFid',\n      label : '@?',\n      value : '=ngModel'\n    },\n    compile : function(element, attr) {\n\n      $log.warn('<md-text-float> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      if ( angular.isUndefined(attr.mdFid) ) {\n        attr.mdFid = $mdUtil.nextUid();\n      }\n\n      return {\n        pre : function(scope, element, attrs) {\n          var disabledParsed = $parse(attrs.ngDisabled);\n          scope.isDisabled = function() {\n            return disabledParsed(scope.$parent);\n          };\n\n          scope.inputType = attrs.type || \"text\";\n        },\n        post: $mdTheming\n      };\n    },\n    template:\n    '<md-input-group tabindex=\"-1\">' +\n    ' <label for=\"{{fid}}\" >{{label}}</label>' +\n    ' <md-input id=\"{{fid}}\" ng-disabled=\"isDisabled()\" ng-model=\"value\" type=\"{{inputType}}\"></md-input>' +\n    '</md-input-group>'\n  };\n}\nmdTextFloatDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$parse\", \"$log\"];\n\nfunction mdInputGroupDirective($log) {\n  return {\n    restrict: 'CE',\n    controller: ['$element', function($element) {\n\n      $log.warn('<md-input-group> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n      this.setFocused = function(isFocused) {\n        $element.toggleClass('md-input-focused', !!isFocused);\n      };\n      this.setHasValue = function(hasValue) {\n        $element.toggleClass('md-input-has-value', hasValue );\n      };\n    }]\n  };\n\n}\nmdInputGroupDirective.$inject = [\"$log\"];\n\nfunction mdInputDirective($mdUtil, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    template: '<input >',\n    require: ['^?mdInputGroup', '?ngModel'],\n    link: function(scope, element, attr, ctrls) {\n      if ( !ctrls[0] ) return;\n\n      $log.warn('<md-input> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      var inputGroupCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n\n      scope.$watch(scope.isDisabled, function(isDisabled) {\n        element.attr('aria-disabled', !!isDisabled);\n        element.attr('tabindex', !!isDisabled);\n      });\n      element.attr('type', attr.type || element.parent().attr('type') || \"text\");\n\n      // When the input value changes, check if it \"has\" a value, and\n      // set the appropriate class on the input group\n      if (ngModelCtrl) {\n        //Add a $formatter so we don't use up the render function\n        ngModelCtrl.$formatters.push(function(value) {\n          inputGroupCtrl.setHasValue( isNotEmpty(value) );\n          return value;\n        });\n      }\n\n      element\n        .on('input', function() {\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        })\n        .on('focus', function(e) {\n          // When the input focuses, add the focused class to the group\n          inputGroupCtrl.setFocused(true);\n        })\n        .on('blur', function(e) {\n          // When the input blurs, remove the focused class from the group\n          inputGroupCtrl.setFocused(false);\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        });\n\n      scope.$on('$destroy', function() {\n        inputGroupCtrl.setFocused(false);\n        inputGroupCtrl.setHasValue(false);\n      });\n\n\n      function isNotEmpty(value) {\n        value = angular.isUndefined(value) ? element.val() : value;\n        return (angular.isDefined(value) && (value!==null) &&\n               (value.toString().trim() !== \"\"));\n      }\n    }\n  };\n}\nmdInputDirective.$inject = [\"$mdUtil\", \"$log\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toast/toast-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-toast.md-THEME_NAME-theme {\n  background-color: '{{foreground-1}}';\n  color: '{{background-50}}'; }\n  md-toast.md-THEME_NAME-theme .md-button {\n    color: '{{background-50}}'; }\n    md-toast.md-THEME_NAME-theme .md-button.md-highlight {\n      color: '{{primary-A200}}'; }\n      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {\n        color: '{{accent-A200}}'; }\n      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {\n        color: '{{warn-A200}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toast/toast.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-toast {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: absolute;\n  box-sizing: border-box;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  min-height: 48px;\n  padding-left: 24px;\n  padding-right: 24px;\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n  border-radius: 2px;\n  font-size: 14px;\n  cursor: default;\n  max-width: 879px;\n  max-height: 40px;\n  height: 24px;\n  z-index: 90;\n  opacity: 1;\n  -webkit-transform: translate3d(0, 0, 0) rotateZ(0deg);\n          transform: translate3d(0, 0, 0) rotateZ(0deg);\n  transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  /* Transition differently when swiping */ }\n  md-toast.md-capsule {\n    border-radius: 24px; }\n  md-toast.ng-leave-active {\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-toast.md-swipeleft, md-toast.md-swiperight, md-toast.md-swipeup, md-toast.md-swipedown {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-toast.ng-enter {\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n    opacity: 0; }\n    md-toast.ng-enter.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-enter.ng-enter-active {\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0);\n      opacity: 1; }\n  md-toast.ng-leave.ng-leave-active {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0%, 0);\n              transform: translate3d(-100%, 0%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 0%, 0);\n              transform: translate3d(100%, 0%, 0); }\n  md-toast .md-action {\n    line-height: 19px;\n    margin-left: 24px;\n    cursor: pointer;\n    text-transform: uppercase;\n    float: right; }\n\n@media (max-width: 600px) {\n  md-toast {\n    left: 0;\n    right: 0;\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    border-radius: 0;\n    bottom: 0; }\n    md-toast.md-top {\n      bottom: auto;\n      top: 0; }\n }\n\n@media (min-width: 600px) {\n  md-toast {\n    min-width: 288px;\n    /* \n     * When the toast doesn't take up the whole screen,\n     * make it rotate when the user swipes it away\n     */ }\n    md-toast.md-bottom {\n      bottom: 8px; }\n    md-toast.md-left {\n      left: 8px; }\n    md-toast.md-right {\n      right: 8px; }\n    md-toast.md-top {\n      top: 8px; }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 25%, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 25%, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 25%, 0) rotateZ(15deg);\n              transform: translate3d(100%, 25%, 0) rotateZ(15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 0, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swiperight {\n      -webkit-transform: translate3d(100%, 0, 0) rotateZ(15deg);\n              transform: translate3d(100%, 0, 0) rotateZ(15deg); }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toast/toast.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.toast');\ngoog.require('ng.material.components.button');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toast\n * @description\n * Toast\n */\nangular.module('material.components.toast', [\n  'material.core',\n  'material.components.button'\n])\n  .directive('mdToast', MdToastDirective)\n  .provider('$mdToast', MdToastProvider);\n\nfunction MdToastDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdToast\n * @module material.components.toast\n *\n * @description\n * `$mdToast` is a service to build a toast nofication on any position\n * on the screen with an optional duration, and provides a simple promise API.\n *\n *\n * ## Restrictions on custom toasts\n * - The toast's template must have an outer `<md-toast>` element.\n * - For a toast action, use element with class `md-action`.\n * - Add the class `md-capsule` for curved corners.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openToast()\">\n *     Open a Toast!\n *   </md-button>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdToast) {\n *   $scope.openToast = function($event) {\n *     $mdToast.show($mdToast.simple().content('Hello!'));\n *     // Could also do $mdToast.showSimple('Hello');\n *   };\n * });\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#showSimple\n * \n * @description\n * Convenience method which builds and shows a simple toast.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#simple\n *\n * @description\n * Builds a preconfigured toast.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods:\n *\n * - $mdToastPreset#content(string) - sets toast content to string\n * - $mdToastPreset#action(string) - adds an action button, which resolves the promise returned from `show()` if clicked.\n * - $mdToastPreset#highlightAction(boolean) - sets action button to be highlighted\n * - $mdToastPreset#capsule(boolean) - adds 'md-capsule' class to the toast (curved corners)\n * - $mdToastPreset#theme(boolean) - sets the theme on the toast to theme (default is `$mdThemingProvider`'s default theme)\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#updateContent\n * \n * @description\n * Updates the content of an existing toast. Useful for updating things like counts, etc.\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#build\n *\n * @description\n * Creates a custom `$mdToastPreset` that you can configure.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods for shows' options (see below).\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#show\n *\n * @description Shows the toast.\n *\n * @param {object} optionsOrPreset Either provide an `$mdToastPreset` returned from `simple()`\n * and `build()`, or an options object with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *     be used as the content of the toast. Restrictions: the template must\n *     have an outer `md-toast` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *     template string.\n *   - `scope` - `{object=}`: the scope to link the template / controller to. If none is specified, it will create a new child scope.\n *     This scope will be destroyed when the toast is removed unless `preserveScope` is set to true.\n *   - `preserveScope` - `{boolean=}`: whether to preserve the scope when the element is removed. Default is false\n *   - `hideDelay` - `{number=}`: How many milliseconds the toast should stay\n *     active before automatically closing.  Set to 0 or false to have the toast stay open until\n *     closed manually. Default: 3000.\n *   - `position` - `{string=}`: Where to place the toast. Available: any combination\n *     of 'bottom', 'left', 'top', 'right', 'fit'. Default: 'bottom left'.\n *   - `controller` - `{string=}`: The controller to associate with this toast.\n *     The controller will be injected the local `$hideToast`, which is a function\n *     used to hide the toast.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *     be used as names of values to inject into the controller. For example,\n *     `locals: {three: 3}` would inject `three` into the controller with the value\n *     of 3.\n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in. These values will not be available until after initialization.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *     and the toast will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the toast to. Defaults to appending\n *     to the root element of the application.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#hide\n *\n * @description\n * Hide an existing toast and resolve the promise returned from `$mdToast.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n * @returns {promise} a promise that is called when the existing element is removed from the DOM\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#cancel\n *\n * @description\n * Hide the existing toast and reject the promise returned from\n * `$mdToast.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n * @returns {promise} a promise that is called when the existing element is removed from the DOM\n *\n */\n\nfunction MdToastProvider($$interimElementProvider) {\n  var activeToastContent;\n  var $mdToast = $$interimElementProvider('$mdToast')\n    .setDefaults({\n      methods: ['position', 'hideDelay', 'capsule'],\n      options: toastDefaultOptions\n    })\n    .addPreset('simple', {\n      argOption: 'content',\n      methods: ['content', 'action', 'highlightAction', 'theme'],\n      options: /* @ngInject */ [\"$mdToast\", \"$mdTheming\", function($mdToast, $mdTheming) {\n        var opts = {\n          template: [\n            '<md-toast md-theme=\"{{ toast.theme }}\" ng-class=\"{\\'md-capsule\\': toast.capsule}\">',\n              '<span flex>{{ toast.content }}</span>',\n              '<md-button class=\"md-action\" ng-if=\"toast.action\" ng-click=\"toast.resolve()\" ng-class=\"{\\'md-highlight\\': toast.highlightAction}\">',\n                '{{ toast.action }}',\n              '</md-button>',\n            '</md-toast>'\n          ].join(''),\n          controller: /* @ngInject */ [\"$scope\", function mdToastCtrl($scope) {\n            var self = this;\n            $scope.$watch(function() { return activeToastContent; }, function() {\n              self.content = activeToastContent;\n            });\n            this.resolve = function() {\n              $mdToast.hide();\n            };\n          }],\n          theme: $mdTheming.defaultTheme(),\n          controllerAs: 'toast',\n          bindToController: true\n        };\n        return opts;\n      }]\n    })\n    .addMethod('updateContent', function(newContent) {\n      activeToastContent = newContent;\n    });\n\n  toastDefaultOptions.$inject = [\"$timeout\", \"$animate\", \"$mdToast\"];\n    return $mdToast;\n\n  /* @ngInject */\n  function toastDefaultOptions($timeout, $animate, $mdToast) {\n    return {\n      onShow: onShow,\n      onRemove: onRemove,\n      position: 'bottom left',\n      themable: true,\n      hideDelay: 3000\n    };\n\n    function onShow(scope, element, options) {\n      // 'top left' -> 'md-top md-left'\n      activeToastContent = options.content;\n      element.addClass(options.position.split(' ').map(function(pos) {\n        return 'md-' + pos;\n      }).join(' '));\n      options.parent.addClass(toastOpenClass(options.position));\n\n      options.onSwipe = function(ev, gesture) {\n        //Add swipeleft/swiperight class to element so it can animate correctly\n        element.addClass('md-' + ev.type.replace('$md.',''));\n        $timeout($mdToast.cancel);\n      };\n      element.on('$md.swipeleft $md.swiperight', options.onSwipe);\n      return $animate.enter(element, options.parent);\n    }\n\n    function onRemove(scope, element, options) {\n      element.off('$md.swipeleft $md.swiperight', options.onSwipe);\n      options.parent.removeClass(toastOpenClass(options.position));\n      return $animate.leave(element);\n    }\n\n    function toastOpenClass(position) {\n      return 'md-toast-open-' +\n        (position.indexOf('top') > -1 ? 'top' : 'bottom');\n    }\n  }\n\n}\nMdToastProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toolbar/toolbar-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-toolbar.md-THEME_NAME-theme {\n  background-color: '{{primary-color}}';\n  color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme .md-button {\n    color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-accent {\n    background-color: '{{accent-color}}';\n    color: '{{accent-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-warn {\n    background-color: '{{warn-color}}';\n    color: '{{warn-contrast}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toolbar/toolbar.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-toolbar {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  position: relative;\n  z-index: 2;\n  font-size: 1.3em;\n  min-height: 64px;\n  width: 100%;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n  md-toolbar.md-tall {\n    height: 128px;\n    min-height: 128px;\n    max-height: 128px; }\n  md-toolbar.md-medium-tall {\n    height: 88px;\n    min-height: 88px;\n    max-height: 88px; }\n    md-toolbar.md-medium-tall .md-toolbar-tools {\n      height: 48px;\n      min-height: 48px;\n      max-height: 48px; }\n  md-toolbar .md-indent {\n    margin-left: 64px; }\n\n.md-toolbar-tools {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  width: 100%;\n  height: 64px;\n  max-height: 64px;\n  font-size: inherit;\n  font-weight: normal;\n  padding: 0 16px;\n  margin: 0; }\n  .md-toolbar-tools > * {\n    font-size: inherit; }\n  .md-toolbar-tools h2, .md-toolbar-tools h3 {\n    font-weight: normal; }\n  .md-toolbar-tools a {\n    color: inherit;\n    text-decoration: none; }\n  .md-toolbar-tools .fill-height {\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n  .md-toolbar-tools .md-tools {\n    margin-left: auto; }\n  .md-toolbar-tools .md-button {\n    font-size: 14px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/toolbar/toolbar.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.toolbar');\ngoog.require('ng.material.components.content');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toolbar\n */\nangular.module('material.components.toolbar', [\n  'material.core',\n  'material.components.content'\n])\n  .directive('mdToolbar', mdToolbarDirective);\n\n/**\n * @ngdoc directive\n * @name mdToolbar\n * @module material.components.toolbar\n * @restrict E\n * @description\n * `md-toolbar` is used to place a toolbar in your app.\n *\n * Toolbars are usually used above a content area to display the title of the\n * current page, and show relevant action buttons for that page.\n *\n * You can change the height of the toolbar by adding either the\n * `md-medium-tall` or `md-tall` class to the toolbar.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"column\" layout-fill>\n *   <md-toolbar>\n *\n *     <div class=\"md-toolbar-tools\">\n *       <span>My App's Title</span>\n *\n *       <!-- fill up the space between left and right area -->\n *       <span flex></span>\n *\n *       <md-button>\n *         Right Bar Button\n *       </md-button>\n *     </div>\n *\n *   </md-toolbar>\n *   <md-content>\n *     Hello!\n *   </md-content>\n * </div>\n * </hljs>\n *\n * @param {boolean=} md-scroll-shrink Whether the header should shrink away as\n * the user scrolls down, and reveal itself as the user scrolls up.\n * Note: for scrollShrink to work, the toolbar must be a sibling of a\n * `md-content` element, placed before it. See the scroll shrink demo.\n *\n *\n * @param {number=} md-shrink-speed-factor How much to change the speed of the toolbar's\n * shrinking by. For example, if 0.25 is given then the toolbar will shrink\n * at one fourth the rate at which the user scrolls down. Default 0.5.\n */\nfunction mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    controller: angular.noop,\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n\n      if (angular.isDefined(attr.mdScrollShrink)) {\n        setupScrollShrink();\n      }\n\n      function setupScrollShrink() {\n        // Current \"y\" position of scroll\n        var y = 0;\n        // Store the last scroll top position\n        var prevScrollTop = 0;\n\n        var shrinkSpeedFactor = attr.mdShrinkSpeedFactor || 0.5;\n\n        var toolbarHeight;\n        var contentElement;\n\n        var debouncedContentScroll = $$rAF.throttle(onContentScroll);\n        var debouncedUpdateHeight = $mdUtil.debounce(updateToolbarHeight, 5 * 1000);\n\n        // Wait for $mdContentLoaded event from mdContent directive.\n        // If the mdContent element is a sibling of our toolbar, hook it up\n        // to scroll events.\n        scope.$on('$mdContentLoaded', onMdContentLoad);\n\n        function onMdContentLoad($event, newContentEl) {\n          // Toolbar and content must be siblings\n          if (element.parent()[0] === newContentEl.parent()[0]) {\n            // unhook old content event listener if exists\n            if (contentElement) {\n              contentElement.off('scroll', debouncedContentScroll);\n            }\n\n            newContentEl.on('scroll', debouncedContentScroll);\n            newContentEl.attr('scroll-shrink', 'true');\n\n            contentElement = newContentEl;\n            $$rAF(updateToolbarHeight);\n          }\n        }\n\n        function updateToolbarHeight() {\n          toolbarHeight = element.prop('offsetHeight');\n          // Add a negative margin-top the size of the toolbar to the content el.\n          // The content will start transformed down the toolbarHeight amount,\n          // so everything looks normal.\n          //\n          // As the user scrolls down, the content will be transformed up slowly\n          // to put the content underneath where the toolbar was.\n          contentElement.css(\n            'margin-top',\n            (-toolbarHeight * shrinkSpeedFactor) + 'px'\n          );\n          onContentScroll();\n        }\n\n        function onContentScroll(e) {\n          var scrollTop = e ? e.target.scrollTop : prevScrollTop;\n\n          debouncedUpdateHeight();\n\n          y = Math.min(\n            toolbarHeight / shrinkSpeedFactor,\n            Math.max(0, y + scrollTop - prevScrollTop)\n          );\n\n          element.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + (-y * shrinkSpeedFactor) + 'px,0)'\n          );\n          contentElement.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + ((toolbarHeight - y) * shrinkSpeedFactor) + 'px,0)'\n          );\n\n          prevScrollTop = scrollTop;\n        }\n\n      }\n\n    }\n  };\n\n}\nmdToolbarDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tooltip/tooltip-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-tooltip.md-THEME_NAME-theme {\n  color: '{{background-A100}}'; }\n  md-tooltip.md-THEME_NAME-theme .md-background {\n    background-color: '{{foreground-2}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tooltip/tooltip.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-tooltip {\n  position: absolute;\n  font-size: 14px;\n  z-index: 100;\n  overflow: hidden;\n  pointer-events: none;\n  border-radius: 4px; }\n  md-tooltip .md-background {\n    position: absolute;\n    border-radius: 50%;\n    -webkit-transform: translate(-50%, -50%) scale(0);\n            transform: translate(-50%, -50%) scale(0);\n    opacity: 1; }\n    md-tooltip .md-background.md-show-add {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      -webkit-transform: translate(-50%, -50%) scale(0);\n              transform: translate(-50%, -50%) scale(0);\n      opacity: 0; }\n    md-tooltip .md-background.md-show, md-tooltip .md-background.md-show-add-active {\n      -webkit-transform: translate(-50%, -50%) scale(1);\n              transform: translate(-50%, -50%) scale(1);\n      opacity: 1; }\n    md-tooltip .md-background.md-show-remove {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n      md-tooltip .md-background.md-show-remove.md-show-remove-active {\n        -webkit-transform: translate(-50%, -50%) scale(0);\n                transform: translate(-50%, -50%) scale(0);\n        opacity: 0; }\n  md-tooltip .md-content {\n    position: relative;\n    max-width: 240px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    padding: 8px;\n    background: transparent;\n    opacity: 0; }\n    md-tooltip .md-content.md-show-add {\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      opacity: 0; }\n    md-tooltip .md-content.md-show, md-tooltip .md-content.md-show-add-active {\n      opacity: 1; }\n    md-tooltip .md-content.md-show-remove {\n      transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n      md-tooltip .md-content.md-show-remove.md-show-remove-active {\n        opacity: 0; }\n  md-tooltip.md-hide {\n    transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-tooltip.md-show {\n    transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    pointer-events: auto;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/tooltip/tooltip.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.tooltip');\ngoog.require('ng.material.core');\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tooltip\n */\nangular.module('material.components.tooltip', [\n  'material.core'\n])\n  .directive('mdTooltip', MdTooltipDirective);\n\n/**\n * @ngdoc directive\n * @name mdTooltip\n * @module material.components.tooltip\n * @description\n * Tooltips are used to describe elements that are interactive and primarily graphical (not textual).\n *\n * Place a `<md-tooltip>` as a child of the element it describes.\n *\n * A tooltip will activate when the user focuses, hovers over, or touches the parent.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-icon icon=\"/img/icons/ic_play_arrow_24px.svg\">\n *   <md-tooltip>\n *     Play Music\n *   </md-tooltip>\n * </md-icon>\n * </hljs>\n *\n * @param {expression=} md-visible Boolean bound to whether the tooltip is\n * currently visible.\n * @param {number=} md-delay How many milliseconds to wait to show the tooltip after the user focuses, hovers, or touches the parent. Defaults to 400ms.\n * @param {string=} md-direction Which direction would you like the tooltip to go?  Supports left, right, top, and bottom.  Defaults to bottom.\n */\nfunction MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil, $mdTheming, $rootElement, $animate, $q) {\n\n  var TOOLTIP_SHOW_DELAY = 0;\n  var TOOLTIP_WINDOW_EDGE_SPACE = 8;\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-background\"></div>' +\n      '<div class=\"md-content\" ng-transclude></div>',\n    scope: {\n      visible: '=?mdVisible',\n      delay: '=?mdDelay'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, contentCtrl) {\n    $mdTheming(element);\n    var parent = element.parent();\n    var background = angular.element(element[0].getElementsByClassName('md-background')[0]);\n    var content = angular.element(element[0].getElementsByClassName('md-content')[0]);\n    var direction = attr.mdDirection;\n\n    // Keep looking for a higher parent if our current one has no pointer events\n    while ($window.getComputedStyle(parent[0])['pointer-events'] == 'none') {\n      parent = parent.parent();\n    }\n\n    // Look for the nearest parent md-content, stopping at the rootElement.\n    var current = element.parent()[0];\n    while (current && current !== $rootElement[0] && current !== document.body) {\n      if (current.tagName && current.tagName.toLowerCase() == 'md-content') break;\n      current = current.parentNode;\n    }\n    var tooltipParent = angular.element(current || document.body);\n\n    if (!angular.isDefined(attr.mdDelay)) {\n      scope.delay = TOOLTIP_SHOW_DELAY;\n    }\n\n    // We will re-attach tooltip when visible\n    element.detach();\n    element.attr('role', 'tooltip');\n    element.attr('id', attr.id || ('tooltip_' + $mdUtil.nextUid()));\n\n    parent.on('focus mouseenter touchstart', function() { setVisible(true); });\n    parent.on('blur mouseleave touchend touchcancel', function() { if ($document[0].activeElement !== parent[0]) setVisible(false); });\n\n    scope.$watch('visible', function(isVisible) {\n      if (isVisible) showTooltip();\n      else hideTooltip();\n    });\n\n    var debouncedOnResize = $$rAF.throttle(function () { if (scope.visible) positionTooltip(); });\n    angular.element($window).on('resize', debouncedOnResize);\n\n    // Be sure to completely cleanup the element on destroy\n    scope.$on('$destroy', function() {\n      scope.visible = false;\n      element.remove();\n      angular.element($window).off('resize', debouncedOnResize);\n    });\n\n    // *******\n    // Methods\n    // *******\n\n    // If setting visible to true, debounce to scope.delay ms\n    // If setting visible to false and no timeout is active, instantly hide the tooltip.\n    function setVisible (value) {\n      setVisible.value = !!value;\n      if (!setVisible.queued) {\n        if (value) {\n          setVisible.queued = true;\n          $timeout(function() {\n            scope.visible = setVisible.value;\n            setVisible.queued = false;\n          }, scope.delay);\n\n        } else {\n          $timeout(function() { scope.visible = false; });\n        }\n      }\n    }\n\n    function showTooltip() {\n      // Insert the element before positioning it, so we can get position\n      parent.attr('aria-describedby', element.attr('id'));\n      tooltipParent.append(element);\n\n      // Wait until the element has been in the dom for two frames before fading it in.\n      // Additionally, we position the tooltip twice to avoid positioning bugs\n      positionTooltip();\n      $animate.addClass(element, 'md-show');\n      $animate.addClass(background, 'md-show');\n      $animate.addClass(content, 'md-show');\n    }\n\n    function hideTooltip() {\n      parent.removeAttr('aria-describedby');\n      $q.all([\n        $animate.removeClass(content, 'md-show'),\n        $animate.removeClass(background, 'md-show'),\n        $animate.removeClass(element, 'md-show')\n      ]).then(function () {\n        if (!scope.visible) element.detach();\n      });\n    }\n\n    function positionTooltip() {\n      var tipRect = $mdUtil.offsetRect(element, tooltipParent);\n      var parentRect = $mdUtil.offsetRect(parent, tooltipParent);\n\n      // Default to bottom position if possible\n      var tipDirection = 'bottom';\n      var newPosition = {\n        left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n        top: parentRect.top + parentRect.height\n      };\n\n      // If element bleeds over left/right of the window, place it on the edge of the window.\n      newPosition.left = Math.min(\n        newPosition.left,\n        tooltipParent.prop('scrollWidth') - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE\n      );\n      newPosition.left = Math.max(newPosition.left, TOOLTIP_WINDOW_EDGE_SPACE);\n\n      // If element bleeds over the bottom of the window, place it above the parent.\n      if (newPosition.top + tipRect.height > tooltipParent.prop('scrollHeight')) {\n        newPosition.top = parentRect.top - tipRect.height;\n        tipDirection = 'top';\n      }\n\n      element.css({top: newPosition.top + 'px', left: newPosition.left + 'px'});\n\n      positionBackground();\n\n      function positionBackground () {\n        var size = direction === 'left' || direction === 'right'\n              ? Math.sqrt(Math.pow(tipRect.width, 2) + Math.pow(tipRect.height / 2, 2)) * 2\n              : Math.sqrt(Math.pow(tipRect.width / 2, 2) + Math.pow(tipRect.height, 2)) * 2,\n            position = direction === 'left' ? { left: 100, top: 50 }\n              : direction === 'right' ? { left: 0, top: 50 }\n              : direction === 'top' ? { left: 50, top: 100 }\n              : { left: 50, top: 0 };\n        background.css({\n          width: size + 'px',\n          height: size + 'px',\n          left: position.left + '%',\n          top: position.top + '%'\n        });\n      }\n\n      function fitOnScreen (pos) {\n        var newPosition = {};\n        newPosition.left = Math.min( pos.left, tooltipParent.prop('scrollWidth') - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.left = Math.max( pos.left, TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.top  = Math.min( pos.top,  tooltipParent.prop('scrollHeight') - tipRect.height - TOOLTIP_WINDOW_EDGE_SPACE );\n        newPosition.top  = Math.max( pos.top,  TOOLTIP_WINDOW_EDGE_SPACE );\n        return newPosition;\n      }\n\n      function getPosition (dir) {\n        return dir === 'left'\n          ? { left: parentRect.left - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE,\n              top: parentRect.top + parentRect.height / 2 - tipRect.height / 2 }\n          : dir === 'right'\n          ? { left: parentRect.left + parentRect.width + TOOLTIP_WINDOW_EDGE_SPACE,\n              top: parentRect.top + parentRect.height / 2 - tipRect.height / 2 }\n          : dir === 'top'\n          ? { left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n              top: parentRect.top - tipRect.height - TOOLTIP_WINDOW_EDGE_SPACE }\n          : { left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n              top: parentRect.top + parentRect.height + TOOLTIP_WINDOW_EDGE_SPACE };\n      }\n    }\n\n  }\n\n}\nMdTooltipDirective.$inject = [\"$timeout\", \"$window\", \"$$rAF\", \"$document\", \"$mdUtil\", \"$mdTheming\", \"$rootElement\", \"$animate\", \"$q\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/whiteframe/whiteframe.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n.md-whiteframe-z1 {\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-whiteframe-z2 {\n  box-shadow: 0px 8px 17px rgba(0, 0, 0, 0.2); }\n\n.md-whiteframe-z3 {\n  box-shadow: 0px 17px 50px rgba(0, 0, 0, 0.19); }\n\n.md-whiteframe-z4 {\n  box-shadow: 0px 16px 28px 0 rgba(0, 0, 0, 0.22); }\n\n.md-whiteframe-z5 {\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/closure/whiteframe/whiteframe.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\ngoog.provide('ng.material.components.whiteframe');\n\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.whiteframe\n */\nangular.module('material.components.whiteframe', []);\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/css/angular-material-layout.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n/* Sizes:\n  0    <= size < 600  Phone\n  600  <= size < 960  Tablet\n  960  <= size < 1200 Tablet-Landscape\n  1200 <= size         PC\n*/\n[layout] {\n  box-sizing: border-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n[layout=column] {\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n\n[layout=row] {\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row; }\n\n[layout-padding], [layout-padding] > [flex] {\n  padding: 8px; }\n\n[layout-margin], [layout-margin] > [flex] {\n  margin: 8px; }\n\n[layout-wrap] {\n  -webkit-flex-wrap: wrap;\n      -ms-flex-wrap: wrap;\n          flex-wrap: wrap; }\n\n[layout-fill] {\n  margin: 0;\n  min-height: 100%;\n  width: 100%; }\n\n@-moz-document url-prefix() {\n  [layout-fill] {\n    margin: 0;\n    width: 100%;\n    min-height: auto;\n    height: inherit; } }\n\n[flex] {\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1; }\n\n[flex=\"0\"] {\n  -webkit-flex: 0 0 0%;\n      -ms-flex: 0 0 0%;\n          flex: 0 0 0%; }\n\n[layout=\"row\"] > [flex=\"0\"] {\n  max-width: 0%; }\n\n[layout=\"column\"] > [flex=\"0\"] {\n  max-height: 0%; }\n\n[flex=\"5\"] {\n  -webkit-flex: 0 0 5%;\n      -ms-flex: 0 0 5%;\n          flex: 0 0 5%; }\n\n[layout=\"row\"] > [flex=\"5\"] {\n  max-width: 5%; }\n\n[layout=\"column\"] > [flex=\"5\"] {\n  max-height: 5%; }\n\n[flex=\"10\"] {\n  -webkit-flex: 0 0 10%;\n      -ms-flex: 0 0 10%;\n          flex: 0 0 10%; }\n\n[layout=\"row\"] > [flex=\"10\"] {\n  max-width: 10%; }\n\n[layout=\"column\"] > [flex=\"10\"] {\n  max-height: 10%; }\n\n[flex=\"15\"] {\n  -webkit-flex: 0 0 15%;\n      -ms-flex: 0 0 15%;\n          flex: 0 0 15%; }\n\n[layout=\"row\"] > [flex=\"15\"] {\n  max-width: 15%; }\n\n[layout=\"column\"] > [flex=\"15\"] {\n  max-height: 15%; }\n\n[flex=\"20\"] {\n  -webkit-flex: 0 0 20%;\n      -ms-flex: 0 0 20%;\n          flex: 0 0 20%; }\n\n[layout=\"row\"] > [flex=\"20\"] {\n  max-width: 20%; }\n\n[layout=\"column\"] > [flex=\"20\"] {\n  max-height: 20%; }\n\n[flex=\"25\"] {\n  -webkit-flex: 0 0 25%;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%; }\n\n[layout=\"row\"] > [flex=\"25\"] {\n  max-width: 25%; }\n\n[layout=\"column\"] > [flex=\"25\"] {\n  max-height: 25%; }\n\n[flex=\"30\"] {\n  -webkit-flex: 0 0 30%;\n      -ms-flex: 0 0 30%;\n          flex: 0 0 30%; }\n\n[layout=\"row\"] > [flex=\"30\"] {\n  max-width: 30%; }\n\n[layout=\"column\"] > [flex=\"30\"] {\n  max-height: 30%; }\n\n[flex=\"35\"] {\n  -webkit-flex: 0 0 35%;\n      -ms-flex: 0 0 35%;\n          flex: 0 0 35%; }\n\n[layout=\"row\"] > [flex=\"35\"] {\n  max-width: 35%; }\n\n[layout=\"column\"] > [flex=\"35\"] {\n  max-height: 35%; }\n\n[flex=\"40\"] {\n  -webkit-flex: 0 0 40%;\n      -ms-flex: 0 0 40%;\n          flex: 0 0 40%; }\n\n[layout=\"row\"] > [flex=\"40\"] {\n  max-width: 40%; }\n\n[layout=\"column\"] > [flex=\"40\"] {\n  max-height: 40%; }\n\n[flex=\"45\"] {\n  -webkit-flex: 0 0 45%;\n      -ms-flex: 0 0 45%;\n          flex: 0 0 45%; }\n\n[layout=\"row\"] > [flex=\"45\"] {\n  max-width: 45%; }\n\n[layout=\"column\"] > [flex=\"45\"] {\n  max-height: 45%; }\n\n[flex=\"50\"] {\n  -webkit-flex: 0 0 50%;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%; }\n\n[layout=\"row\"] > [flex=\"50\"] {\n  max-width: 50%; }\n\n[layout=\"column\"] > [flex=\"50\"] {\n  max-height: 50%; }\n\n[flex=\"55\"] {\n  -webkit-flex: 0 0 55%;\n      -ms-flex: 0 0 55%;\n          flex: 0 0 55%; }\n\n[layout=\"row\"] > [flex=\"55\"] {\n  max-width: 55%; }\n\n[layout=\"column\"] > [flex=\"55\"] {\n  max-height: 55%; }\n\n[flex=\"60\"] {\n  -webkit-flex: 0 0 60%;\n      -ms-flex: 0 0 60%;\n          flex: 0 0 60%; }\n\n[layout=\"row\"] > [flex=\"60\"] {\n  max-width: 60%; }\n\n[layout=\"column\"] > [flex=\"60\"] {\n  max-height: 60%; }\n\n[flex=\"65\"] {\n  -webkit-flex: 0 0 65%;\n      -ms-flex: 0 0 65%;\n          flex: 0 0 65%; }\n\n[layout=\"row\"] > [flex=\"65\"] {\n  max-width: 65%; }\n\n[layout=\"column\"] > [flex=\"65\"] {\n  max-height: 65%; }\n\n[flex=\"70\"] {\n  -webkit-flex: 0 0 70%;\n      -ms-flex: 0 0 70%;\n          flex: 0 0 70%; }\n\n[layout=\"row\"] > [flex=\"70\"] {\n  max-width: 70%; }\n\n[layout=\"column\"] > [flex=\"70\"] {\n  max-height: 70%; }\n\n[flex=\"75\"] {\n  -webkit-flex: 0 0 75%;\n      -ms-flex: 0 0 75%;\n          flex: 0 0 75%; }\n\n[layout=\"row\"] > [flex=\"75\"] {\n  max-width: 75%; }\n\n[layout=\"column\"] > [flex=\"75\"] {\n  max-height: 75%; }\n\n[flex=\"80\"] {\n  -webkit-flex: 0 0 80%;\n      -ms-flex: 0 0 80%;\n          flex: 0 0 80%; }\n\n[layout=\"row\"] > [flex=\"80\"] {\n  max-width: 80%; }\n\n[layout=\"column\"] > [flex=\"80\"] {\n  max-height: 80%; }\n\n[flex=\"85\"] {\n  -webkit-flex: 0 0 85%;\n      -ms-flex: 0 0 85%;\n          flex: 0 0 85%; }\n\n[layout=\"row\"] > [flex=\"85\"] {\n  max-width: 85%; }\n\n[layout=\"column\"] > [flex=\"85\"] {\n  max-height: 85%; }\n\n[flex=\"90\"] {\n  -webkit-flex: 0 0 90%;\n      -ms-flex: 0 0 90%;\n          flex: 0 0 90%; }\n\n[layout=\"row\"] > [flex=\"90\"] {\n  max-width: 90%; }\n\n[layout=\"column\"] > [flex=\"90\"] {\n  max-height: 90%; }\n\n[flex=\"95\"] {\n  -webkit-flex: 0 0 95%;\n      -ms-flex: 0 0 95%;\n          flex: 0 0 95%; }\n\n[layout=\"row\"] > [flex=\"95\"] {\n  max-width: 95%; }\n\n[layout=\"column\"] > [flex=\"95\"] {\n  max-height: 95%; }\n\n[flex=\"100\"] {\n  -webkit-flex: 0 0 100%;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%; }\n\n[layout=\"row\"] > [flex=\"100\"] {\n  max-width: 100%; }\n\n[layout=\"column\"] > [flex=\"100\"] {\n  max-height: 100%; }\n\n[layout=\"row\"] > [flex=\"33\"], [layout=\"row\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-width: 33.33%; }\n[layout=\"row\"] > [flex=\"66\"], [layout=\"row\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-width: 66.66%; }\n\n[layout=\"column\"] > [flex=\"33\"], [layout=\"column\"] > [flex=\"34\"] {\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-height: 33.33%; }\n[layout=\"column\"] > [flex=\"66\"], [layout=\"column\"] > [flex=\"67\"] {\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-height: 66.66%; }\n\n[layout-align=\"center\"], [layout-align=\"center center\"], [layout-align=\"center start\"], [layout-align=\"center end\"] {\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n[layout-align=\"end\"], [layout-align=\"end center\"], [layout-align=\"end start\"], [layout-align=\"end end\"] {\n  -webkit-justify-content: flex-end;\n      -ms-flex-pack: end;\n          justify-content: flex-end; }\n\n[layout-align=\"space-around\"], [layout-align=\"space-around center\"], [layout-align=\"space-around start\"], [layout-align=\"space-around end\"] {\n  -webkit-justify-content: space-around;\n      -ms-flex-pack: distribute;\n          justify-content: space-around; }\n\n[layout-align=\"space-between\"], [layout-align=\"space-between center\"], [layout-align=\"space-between start\"], [layout-align=\"space-between end\"] {\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between; }\n\n[layout-align=\"center center\"], [layout-align=\"start center\"], [layout-align=\"end center\"], [layout-align=\"space-between center\"], [layout-align=\"space-around center\"] {\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center; }\n\n[layout-align=\"center start\"], [layout-align=\"start start\"], [layout-align=\"end start\"], [layout-align=\"space-between start\"], [layout-align=\"space-around start\"] {\n  -webkit-align-items: flex-start;\n      -ms-flex-align: start;\n          align-items: flex-start; }\n\n[layout-align=\"center end\"], [layout-align=\"start end\"], [layout-align=\"end end\"], [layout-align=\"space-between end\"], [layout-align=\"space-around end\"] {\n  -webkit-align-items: flex-end;\n      -ms-flex-align: end;\n          align-items: flex-end; }\n\n[flex-order=\"0\"] {\n  -webkit-order: 0;\n      -ms-flex-order: 0;\n          order: 0; }\n\n[flex-order=\"1\"] {\n  -webkit-order: 1;\n      -ms-flex-order: 1;\n          order: 1; }\n\n[flex-order=\"2\"] {\n  -webkit-order: 2;\n      -ms-flex-order: 2;\n          order: 2; }\n\n[flex-order=\"3\"] {\n  -webkit-order: 3;\n      -ms-flex-order: 3;\n          order: 3; }\n\n[flex-order=\"4\"] {\n  -webkit-order: 4;\n      -ms-flex-order: 4;\n          order: 4; }\n\n[flex-order=\"5\"] {\n  -webkit-order: 5;\n      -ms-flex-order: 5;\n          order: 5; }\n\n[flex-order=\"6\"] {\n  -webkit-order: 6;\n      -ms-flex-order: 6;\n          order: 6; }\n\n[flex-order=\"7\"] {\n  -webkit-order: 7;\n      -ms-flex-order: 7;\n          order: 7; }\n\n[flex-order=\"8\"] {\n  -webkit-order: 8;\n      -ms-flex-order: 8;\n          order: 8; }\n\n[flex-order=\"9\"] {\n  -webkit-order: 9;\n      -ms-flex-order: 9;\n          order: 9; }\n\n/**\n * `hide-gt-sm show-gt-lg` should hide from 600px to 1200px\n * `show-md hide-gt-sm` should show from 0px to 960px and hide at >960px\n * `hide-gt-md show-gt-sm` should show everywhere (show overrides hide)`\n */\n@media (max-width: 599px) {\n  [hide-sm]:not([show-sm]):not([show]), [hide]:not([show-sm]):not([show]) {\n    display: none; }\n\n  [flex-order-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-sm=\"center\"], [layout-align-sm=\"center center\"], [layout-align-sm=\"center start\"], [layout-align-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-sm=\"end\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-sm=\"space-around\"], [layout-align-sm=\"space-around center\"], [layout-align-sm=\"space-around start\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-sm=\"space-between\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-sm=\"center center\"], [layout-align-sm=\"start center\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-sm=\"center start\"], [layout-align-sm=\"start start\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-sm=\"center end\"], [layout-align-sm=\"start end\"], [layout-align-sm=\"end end\"], [layout-align-sm=\"space-between end\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"33\"], [layout=\"row\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-sm=\"66\"], [layout=\"row\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-sm=\"33\"], [layout=\"column\"] > [flex-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-sm=\"66\"], [layout=\"column\"] > [flex-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) {\n  [flex-order-gt-sm=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-sm=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-sm=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-sm=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-sm=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-sm=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-sm=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-sm=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-sm=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-sm=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-sm=\"center\"], [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-sm=\"end\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-sm=\"space-around\"], [layout-align-gt-sm=\"space-around center\"], [layout-align-gt-sm=\"space-around start\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-sm=\"space-between\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"start center\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"start start\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-sm=\"center end\"], [layout-align-gt-sm=\"start end\"], [layout-align-gt-sm=\"end end\"], [layout-align-gt-sm=\"space-between end\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-sm] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-sm=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-sm=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-sm] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-sm=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-sm=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-sm=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-sm=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-sm=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-sm=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-sm=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-sm=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-sm=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-sm=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-sm=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-sm=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-sm=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-sm=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-sm=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-sm=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-sm=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-sm=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-sm=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-sm=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-sm=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"33\"], [layout=\"row\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-sm=\"66\"], [layout=\"row\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"33\"], [layout=\"column\"] > [flex-gt-sm=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-sm=\"66\"], [layout=\"column\"] > [flex-gt-sm=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) and (max-width: 959px) {\n  [hide]:not([show-gt-sm]):not([show-md]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]) {\n    display: none; }\n\n  [hide-md]:not([show-md]):not([show]) {\n    display: none; }\n\n  [flex-order-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-md=\"center\"], [layout-align-md=\"center center\"], [layout-align-md=\"center start\"], [layout-align-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-md=\"end\"], [layout-align-md=\"end center\"], [layout-align-md=\"end start\"], [layout-align-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-md=\"space-around\"], [layout-align-md=\"space-around center\"], [layout-align-md=\"space-around start\"], [layout-align-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-md=\"space-between\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-md=\"center center\"], [layout-align-md=\"start center\"], [layout-align-md=\"end center\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-md=\"center start\"], [layout-align-md=\"start start\"], [layout-align-md=\"end start\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-md=\"center end\"], [layout-align-md=\"start end\"], [layout-align-md=\"end end\"], [layout-align-md=\"space-between end\"], [layout-align-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-md=\"33\"], [layout=\"row\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-md=\"66\"], [layout=\"row\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-md=\"33\"], [layout=\"column\"] > [flex-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-md=\"66\"], [layout=\"column\"] > [flex-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) {\n  [flex-order-gt-md=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-md=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-md=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-md=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-md=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-md=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-md=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-md=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-md=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-md=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-md=\"center\"], [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-md=\"end\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-md=\"space-around\"], [layout-align-gt-md=\"space-around center\"], [layout-align-gt-md=\"space-around start\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-md=\"space-between\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"start center\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"start start\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-md=\"center end\"], [layout-align-gt-md=\"start end\"], [layout-align-gt-md=\"end end\"], [layout-align-gt-md=\"space-between end\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-md] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-md=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-md=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-md] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-md=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-md=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-md=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-md=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-md=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-md=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-md=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-md=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-md=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-md=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-md=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-md=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-md=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-md=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-md=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-md=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-md=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-md=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-md=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-md=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-md=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"33\"], [layout=\"row\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-md=\"66\"], [layout=\"row\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"33\"], [layout=\"column\"] > [flex-gt-md=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-md=\"66\"], [layout=\"column\"] > [flex-gt-md=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) and (max-width: 1199px) {\n  [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]) {\n    display: none; }\n\n  [hide-lg]:not([show-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-lg=\"center\"], [layout-align-lg=\"center center\"], [layout-align-lg=\"center start\"], [layout-align-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-lg=\"end\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-lg=\"space-around\"], [layout-align-lg=\"space-around center\"], [layout-align-lg=\"space-around start\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-lg=\"space-between\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-lg=\"center center\"], [layout-align-lg=\"start center\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-lg=\"center start\"], [layout-align-lg=\"start start\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-lg=\"center end\"], [layout-align-lg=\"start end\"], [layout-align-lg=\"end end\"], [layout-align-lg=\"space-between end\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"33\"], [layout=\"row\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-lg=\"66\"], [layout=\"row\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-lg=\"33\"], [layout=\"column\"] > [flex-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-lg=\"66\"], [layout=\"column\"] > [flex-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 1200px) {\n  [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-gt-lg=\"0\"] {\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-lg=\"1\"] {\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-lg=\"2\"] {\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-lg=\"3\"] {\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-lg=\"4\"] {\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-lg=\"5\"] {\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-lg=\"6\"] {\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-lg=\"7\"] {\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-lg=\"8\"] {\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-lg=\"9\"] {\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-lg=\"center\"], [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"center end\"] {\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-lg=\"end\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"end end\"] {\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-lg=\"space-around\"], [layout-align-gt-lg=\"space-around center\"], [layout-align-gt-lg=\"space-around start\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-lg=\"space-between\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-between end\"] {\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"start center\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-around center\"] {\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"start start\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-around start\"] {\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-lg=\"center end\"], [layout-align-gt-lg=\"start end\"], [layout-align-gt-lg=\"end end\"], [layout-align-gt-lg=\"space-between end\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-lg] {\n    box-sizing: border-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-lg=column] {\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-lg=row] {\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-lg] {\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-lg=\"0\"] {\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-lg=\"5\"] {\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-lg=\"10\"] {\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-lg=\"15\"] {\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-lg=\"20\"] {\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-lg=\"25\"] {\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-lg=\"30\"] {\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-lg=\"35\"] {\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-lg=\"40\"] {\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-lg=\"45\"] {\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-lg=\"50\"] {\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-lg=\"55\"] {\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-lg=\"60\"] {\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-lg=\"65\"] {\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-lg=\"70\"] {\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-lg=\"75\"] {\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-lg=\"80\"] {\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-lg=\"85\"] {\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-lg=\"90\"] {\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-lg=\"95\"] {\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-lg=\"100\"] {\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"33\"], [layout=\"row\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-lg=\"66\"], [layout=\"row\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"33\"], [layout=\"column\"] > [flex-gt-lg=\"34\"] {\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-lg=\"66\"], [layout=\"column\"] > [flex-gt-lg=\"67\"] {\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/autocomplete/autocomplete-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\nmd-autocomplete {\n  background: '{{background-50}}'; }\n  md-autocomplete button md-icon path {\n    fill: '{{background-600}}'; }\n  md-autocomplete button:after {\n    background: '{{background-600-0.3}}'; }\n  md-autocomplete ul {\n    background: '{{background-50}}'; }\n    md-autocomplete ul li {\n      border-top: 1px solid '{{background-400}}';\n      color: '{{background-900}}'; }\n      md-autocomplete ul li .highlight {\n        color: '{{background-600}}'; }\n      md-autocomplete ul li:hover, md-autocomplete ul li.selected {\n        background: '{{background-200}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/autocomplete/autocomplete.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n@-webkit-keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@keyframes md-autocomplete-list-out {\n  0% {\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear; }\n\n  50% {\n    opacity: 0;\n    height: 40px;\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in; }\n\n  100% {\n    height: 0;\n    opacity: 0; } }\n\n@-webkit-keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\n@keyframes md-autocomplete-list-in {\n  0% {\n    opacity: 0;\n    height: 0;\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out; }\n\n  50% {\n    opacity: 0;\n    height: 40px; }\n\n  100% {\n    opacity: 1;\n    height: 40px; } }\n\nmd-content {\n  overflow: visible; }\n\nmd-autocomplete {\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n  border-radius: 2px;\n  display: block;\n  height: 40px;\n  position: relative;\n  overflow: visible; }\n  md-autocomplete md-autocomplete-wrap {\n    display: block;\n    position: relative;\n    overflow: visible;\n    height: 40px; }\n    md-autocomplete md-autocomplete-wrap md-progress-linear {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      width: 100%;\n      height: 3px;\n      transition: none; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear .md-container {\n        transition: none;\n        top: auto;\n        height: 3px; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-enter.ng-enter-active {\n          opacity: 1; }\n      md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave {\n        transition: opacity 0.15s linear; }\n        md-autocomplete md-autocomplete-wrap md-progress-linear.ng-leave.ng-leave-active {\n          opacity: 0; }\n  md-autocomplete input {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    box-sizing: border-box;\n    border: none;\n    box-shadow: none;\n    padding: 0 15px;\n    font-size: 14px;\n    line-height: 40px;\n    height: 40px;\n    outline: none;\n    z-index: 2;\n    background: transparent; }\n    md-autocomplete input::-ms-clear {\n      display: none; }\n  md-autocomplete button {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    line-height: 20px;\n    z-index: 2;\n    text-align: center;\n    width: 20px;\n    height: 20px;\n    cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    padding: 0;\n    font-size: 12px;\n    background: transparent; }\n    md-autocomplete button:after {\n      content: '';\n      position: absolute;\n      top: -6px;\n      right: -6px;\n      bottom: -6px;\n      left: -6px;\n      border-radius: 50%;\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      opacity: 0;\n      transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      z-index: -1; }\n    md-autocomplete button:focus:after {\n      -webkit-transform: scale(1);\n              transform: scale(1);\n      opacity: 1; }\n    md-autocomplete button md-icon {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      -webkit-transform: translate3d(-50%, -50%, 0) scale(0.9);\n              transform: translate3d(-50%, -50%, 0) scale(0.9); }\n      md-autocomplete button md-icon path {\n        stroke-width: 0; }\n    md-autocomplete button.ng-enter {\n      -webkit-transform: scale(0);\n              transform: scale(0);\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-enter.ng-enter-active {\n        -webkit-transform: scale(1);\n                transform: scale(1); }\n    md-autocomplete button.ng-leave {\n      transition: -webkit-transform 0.15s ease-out;\n      transition: transform 0.15s ease-out; }\n      md-autocomplete button.ng-leave.ng-leave-active {\n        -webkit-transform: scale(0);\n                transform: scale(0); }\n  md-autocomplete ul {\n    position: absolute;\n    top: 100%;\n    left: 0;\n    right: 0;\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);\n    margin: 0;\n    list-style: none;\n    padding: 0;\n    overflow: auto;\n    max-height: 225.5px;\n    z-index: 49; }\n    md-autocomplete ul li {\n      border-top: 1px solid #ddd;\n      padding: 0 15px;\n      line-height: 40px;\n      font-size: 14px;\n      overflow: hidden;\n      height: 40px;\n      transition: background 0.15s linear;\n      cursor: pointer;\n      margin: 0; }\n      md-autocomplete ul li.ng-enter, md-autocomplete ul li.ng-hide-remove {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-in 0.2s;\n                animation: md-autocomplete-list-in 0.2s; }\n      md-autocomplete ul li.ng-leave, md-autocomplete ul li.ng-hide-add {\n        transition: none;\n        -webkit-animation: md-autocomplete-list-out 0.2s;\n                animation: md-autocomplete-list-out 0.2s; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/autocomplete/autocomplete.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.8.1\n */\n(function () {\n  'use strict';\n  /**\n   * @ngdoc module\n   * @name material.components.autocomplete\n   */\n  /*\n   * @see js folder for autocomplete implementation\n   */\n  angular.module('material.components.autocomplete', [\n    'material.core',\n    'material.components.icon'\n  ]);\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdAutocompleteCtrl', MdAutocompleteCtrl);\n\n  function MdAutocompleteCtrl ($scope, $element, $timeout, $q, $mdUtil, $mdConstant) {\n\n    //-- private variables\n    var self = this,\n        itemParts = $scope.itemsExpr.split(/ in /i),\n        itemExpr = itemParts[1],\n        elements = {\n          main:  $element[0],\n          ul:    $element[0].getElementsByTagName('ul')[0],\n          input: $element[0].getElementsByTagName('input')[0]\n        },\n        promise = null,\n        cache = {};\n\n    //-- public variables\n    self.scope = $scope;\n    self.parent = $scope.$parent;\n    self.itemName = itemParts[0];\n    self.matches = [];\n    self.loading = false;\n    self.hidden = true;\n    self.index = 0;\n    self.keydown = keydown;\n    self.blur = blur;\n    self.clear = clearValue;\n    self.select = select;\n    self.getCurrentDisplayValue = getCurrentDisplayValue;\n    self.fetch = $mdUtil.debounce(fetchResults);\n\n    return init();\n\n    //-- start method definitions\n    function init () {\n      configureWatchers();\n      configureAria();\n    }\n\n    function configureAria () {\n      var ul = angular.element(elements.ul),\n          input = angular.element(elements.input),\n          id = ul.attr('id') || 'ul_' + $mdUtil.nextUid();\n      ul.attr('id', id);\n      input.attr('aria-owns', id);\n    }\n\n    function getItemScope (item) {\n      if (!item) return;\n      var locals = {};\n      if (self.itemName) locals[self.itemName] = $scope.selectedItem;\n      return locals;\n    }\n\n    function configureWatchers () {\n      $scope.$watch('searchText', function (searchText) {\n        self.index = -1;\n        if (!searchText || searchText.length < Math.max(parseInt($scope.minLength, 10), 1)) {\n          self.loading = false;\n          self.matches = [];\n          self.hidden = shouldHide();\n          return;\n        }\n        var term = searchText.toLowerCase();\n        if (promise && promise.cancel) {\n          promise.cancel();\n          promise = null;\n        }\n        if (!$scope.noCache && cache[term]) {\n          self.matches = cache[term];\n        } else {\n          self.fetch(searchText);\n        }\n        self.hidden = shouldHide();\n        if ($scope.textChange) $scope.textChange(getItemScope($scope.selectedItem));\n      });\n      $scope.$watch('selectedItem', function (selectedItem) {\n        if ($scope.itemChange) $scope.itemChange(getItemScope(selectedItem));\n      });\n    }\n\n    function fetchResults (searchText) {\n      var items = $scope.$parent.$eval(itemExpr),\n          term = searchText.toLowerCase();\n      if (angular.isArray(items)) {\n        handleResults(items);\n      } else {\n        self.loading = true;\n        promise = $q.when(items).then(handleResults);\n      }\n      function handleResults (matches) {\n        cache[term] = matches;\n        if (searchText !== $scope.searchText) return; //-- just cache the results if old request\n        promise = null;\n        self.loading = false;\n        self.matches = matches;\n        self.hidden = shouldHide();\n      }\n    }\n\n    function blur () {\n      self.hidden = true;\n    }\n\n    function keydown (event) {\n      switch (event.keyCode) {\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.min(self.index + 1, self.matches.length - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.UP_ARROW:\n            if (self.loading) return;\n            event.preventDefault();\n            self.index = Math.max(0, self.index - 1);\n            updateScroll();\n            break;\n        case $mdConstant.KEY_CODE.ENTER:\n            if (self.loading || self.index < 0) return;\n            event.preventDefault();\n            select(self.index);\n            break;\n        case $mdConstant.KEY_CODE.ESCAPE:\n            self.matches = [];\n            self.hidden = true;\n            self.index = -1;\n            break;\n        case $mdConstant.KEY_CODE.TAB:\n            break;\n        default:\n      }\n    }\n\n    function clearValue () {\n      $scope.searchText = '';\n      select(-1);\n      elements.input.focus();\n    }\n\n    function shouldHide () {\n      return self.matches.length === 1 && $scope.searchText === getDisplayValue(self.matches[0]);\n    }\n\n    function getCurrentDisplayValue () {\n      return getDisplayValue(self.matches[self.index]);\n    }\n\n    function getDisplayValue (item) {\n      return (item && $scope.itemText) ? $scope.itemText(getItemScope(item)) : item;\n    }\n\n    function select (index) {\n      $scope.selectedItem = self.matches[index];\n      $scope.searchText = getDisplayValue($scope.selectedItem) || $scope.searchText;\n      self.hidden = true;\n      self.index = -1;\n      self.matches = [];\n    }\n\n    function updateScroll () {\n      var top = 41 * self.index,\n          bot = top + 41,\n          hgt = 41 * 5.5;\n      if (top < elements.ul.scrollTop) {\n        elements.ul.scrollTop = top;\n      } else if (bot > elements.ul.scrollTop + hgt) {\n        elements.ul.scrollTop = bot - hgt;\n      }\n    }\n\n  }\n  MdAutocompleteCtrl.$inject = [\"$scope\", \"$element\", \"$timeout\", \"$q\", \"$mdUtil\", \"$mdConstant\"];\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocomplete', MdAutocomplete);\n\n  /**\n   * @ngdoc directive\n   * @name mdAutocomplete\n   * @module material.components.autocomplete\n   *\n   * @description\n   * `<md-autocomplete>` is a special input component with a drop-down of all possible matches to a custom query.\n   * This component allows you to provide real-time suggestions as the user types in the input area.\n   *\n   * @param {string=} md-search-text A model to bind the search query text to\n   * @param {object=} md-selected-item A model to bind the selected item to\n   * @param {expression} md-items An expression in the format of `item in items` to iterate over matches for your search.\n   * @param {string=} md-item-text An expression that will convert your object to a single string.\n   * @param {string=} placeholder Placeholder text that will be forwarded to the input.\n   * @param {boolean=} md-no-cache Disables the internal caching that happens in autocomplete\n   * @param {expression} md-selected-item-change An expression to be run each time a new item is selected\n   * @param {expression} md-search-text-change An expression to be run each time the search text updates\n   * @param {boolean=} ng-disabled Determines whether or not to disable the input field\n   * @param {number=} md-min-length Specifies the minimum length of text before autocomplete will make suggestions\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   *   <md-autocomplete\n   *       md-selected-item=\"selectedItem\"\n   *       md-search-text=\"searchText\"\n   *       md-items=\"item in getMatches(searchText)\"\n   *       md-item-text=\"item.display\">\n   *     <span md-highlight-text=\"searchText\">{{item.display}}</span>\n   *   </md-autocomplete>\n   * </hljs>\n   */\n\n  function MdAutocomplete () {\n    return {\n      template:     '\\\n        <md-autocomplete-wrap role=\"listbox\">\\\n          <input type=\"text\"\\\n              ng-disabled=\"isDisabled\"\\\n              ng-model=\"searchText\"\\\n              ng-keydown=\"$mdAutocompleteCtrl.keydown($event)\"\\\n              ng-blur=\"$mdAutocompleteCtrl.blur()\"\\\n              placeholder=\"{{placeholder}}\"\\\n              aria-label=\"{{placeholder}}\"\\\n              aria-autocomplete=\"list\"\\\n              aria-haspopup=\"true\"\\\n              aria-activedescendant=\"\"\\\n              aria-expanded=\"{{!$mdAutocompleteCtrl.hidden}}\"/>\\\n          <button\\\n              type=\"button\"\\\n              ng-if=\"searchText\"\\\n              ng-click=\"$mdAutocompleteCtrl.clear()\">\\\n              <md-icon md-svg-icon=\"cancel\"></md-icon>\\\n              <span class=\"visually-hidden\">Clear</span>\\\n              </button>\\\n          <md-progress-linear ng-if=\"$mdAutocompleteCtrl.loading\" md-mode=\"indeterminate\"></md-progress-linear>\\\n        </md-autocomplete-wrap>\\\n        <ul role=\"presentation\">\\\n          <li ng-repeat=\"(index, item) in $mdAutocompleteCtrl.matches\"\\\n              ng-class=\"{ selected: index === $mdAutocompleteCtrl.index }\"\\\n              ng-show=\"searchText && !$mdAutocompleteCtrl.hidden\"\\\n              ng-click=\"$mdAutocompleteCtrl.select(index)\"\\\n              ng-transclude\\\n              md-autocomplete-list-item=\"$mdAutocompleteCtrl.itemName\">\\\n          </li>\\\n        </ul>\\\n        <aria-status\\\n            class=\"visually-hidden\"\\\n            role=\"status\"\\\n            aria-live=\"assertive\">\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length === 1\">There is 1 match available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index === -1 && $mdAutocompleteCtrl.matches.length > 1\">There are {{$mdAutocompleteCtrl.matches.length}} matches available.</p>\\\n          <p ng-if=\"$mdAutocompleteCtrl.index >= 0\">{{ $mdAutocompleteCtrl.getCurrentDisplayValue() }}</p>\\\n        </aria-status>',\n      transclude:   true,\n      controller:   'MdAutocompleteCtrl',\n      controllerAs: '$mdAutocompleteCtrl',\n      scope:        {\n        searchText:   '=mdSearchText',\n        selectedItem: '=mdSelectedItem',\n        itemsExpr:    '@mdItems',\n        itemText:     '&mdItemText',\n        placeholder:  '@placeholder',\n        noCache:      '=mdNoCache',\n        itemChange:   '&mdSelectedItemChange',\n        textChange:   '&mdSearchTextChange',\n        isDisabled:   '=ngDisabled',\n        minLength:    '=mdMinLength'\n      }\n    };\n  }\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .controller('MdHighlightCtrl', MdHighlightCtrl);\n\n  function MdHighlightCtrl ($scope, $element, $interpolate) {\n    var term = $element.attr('md-highlight-text'),\n        text = $interpolate($element.text())($scope);\n    $scope.$watch(term, function (term) {\n      var regex = new RegExp('^' + sanitize(term), 'i'),\n          html = text.replace(regex, '<span class=\"highlight\">$&</span>');\n      $element.html(html);\n    });\n\n    function sanitize (term) {\n      if (!term) return term;\n      return term.replace(/[\\*\\[\\]\\(\\)\\{\\}\\\\\\^\\$]/g, '\\\\$&');\n    }\n  }\n  MdHighlightCtrl.$inject = [\"$scope\", \"$element\", \"$interpolate\"];\n\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdHighlightText', MdHighlight);\n\n  /**\n   * @ngdoc directive\n   * @name mdHighlightText\n   * @module material.components.autocomplete\n   *\n   * @description\n   * The `md-highlight-text` directive allows you to specify text that should be highlighted within\n   * an element.  Highlighted text will be wrapped in `<span class=\"highlight\"></span>` which can\n   * be styled through CSS.  Please note that child elements may not be used with this directive.\n   *\n   * @param {string=} md-highlight-text A model to be searched for\n   *\n   * @usage\n   * <hljs lang=\"html\">\n   * <input placeholder=\"Enter a search term...\" ng-model=\"searchTerm\" type=\"text\" />\n   * <ul>\n   *   <li ng-repeat=\"result in results\" md-highlight-text=\"searchTerm\">\n   *     {{result.text}}\n   *   </li>\n   * </ul>\n   * </hljs>\n   */\n\n  function MdHighlight () {\n    return {\n      terminal: true,\n      scope: false,\n      controller: 'MdHighlightCtrl'\n    };\n  }\n})();\n\n(function () {\n  'use strict';\n  angular\n      .module('material.components.autocomplete')\n      .directive('mdAutocompleteListItem', MdAutocompleteListItem);\n\n  function MdAutocompleteListItem ($compile, $mdUtil) {\n    return {\n      require: '^?mdAutocomplete',\n      terminal: true,\n      link: link,\n      scope: false\n    };\n    function link (scope, element, attr, ctrl) {\n      var newScope = ctrl.parent.$new(false, ctrl.parent),\n          itemName = ctrl.scope.$eval(attr.mdAutocompleteListItem);\n      newScope[itemName] = scope.item;\n      $compile(element.contents())(newScope);\n      element.attr({ 'role': 'option', 'id': 'item_' + $mdUtil.nextUid() });\n    }\n  }\n  MdAutocompleteListItem.$inject = [\"$compile\", \"$mdUtil\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/autocomplete/bower.json",
    "content": "{\n  \"name\": \"angular-material-autocomplete\",\n  \"version\": \"0.8.1\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.8.1\",\n    \"angular-material-icon\": \"0.8.1\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/backdrop/backdrop-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.1-master-ca60beb\n */\nmd-backdrop.md-opaque.md-THEME_NAME-theme {\n  background-color: '{{foreground-4-0.5}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/backdrop/backdrop.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.1-master-ca60beb\n */\nmd-backdrop {\n  z-index: 50;\n  background-color: rgba(0, 0, 0, 0);\n  position: fixed;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0; }\n  md-backdrop.md-dialog-backdrop {\n    z-index: 79; }\n  md-backdrop.md-bottom-sheet-backdrop {\n    z-index: 69; }\n  md-backdrop.md-sidenav-backdrop {\n    z-index: 59; }\n  md-backdrop.ng-enter {\n    -webkit-animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both;\n            animation: cubic-bezier(0.25, 0.8, 0.25, 1) mdBackdropFadeIn 0.5s both; }\n  md-backdrop.ng-leave {\n    -webkit-animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both;\n            animation: cubic-bezier(0.55, 0, 0.55, 0.2) mdBackdropFadeOut 0.2s both; }\n\n@-webkit-keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@keyframes mdBackdropFadeIn {\n  from {\n    opacity: 0; }\n\n  to {\n    opacity: 1; } }\n\n@-webkit-keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n\n@keyframes mdBackdropFadeOut {\n  from {\n    opacity: 1; }\n\n  to {\n    opacity: 0; } }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/backdrop/backdrop.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.1-master-ca60beb\n */\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.backdrop\n * @description Backdrop\n */\n\n/**\n * @ngdoc directive\n * @name mdBackdrop\n * @module material.components.backdrop\n *\n * @restrict E\n *\n * @description\n * `<md-backdrop>` is a backdrop element used by other coponents, such as dialog and bottom sheet.\n * Apply class `opaque` to make the backdrop use the theme backdrop color.\n *\n */\n\nangular.module('material.components.backdrop', [\n  'material.core'\n])\n  .directive('mdBackdrop', BackdropDirective);\n\nfunction BackdropDirective($mdTheming) {\n  return $mdTheming;\n}\nBackdropDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/backdrop/bower.json",
    "content": "{\n  \"name\": \"angular-material-backdrop\",\n  \"version\": \"0.7.1-master-ca60beb\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.1-master-ca60beb\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/bottomSheet/bottomSheet-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-bottom-sheet.md-THEME_NAME-theme {\n  background-color: '{{background-50}}';\n  border-top-color: '{{background-300}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {\n    color: '{{foreground-1}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    background-color: '{{background-50}}'; }\n  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {\n    color: '{{foreground-1}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-bottom-sheet {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 8px 16px 88px 16px;\n  z-index: 70;\n  border-top: 1px solid;\n  -webkit-transform: translate3d(0, 80px, 0);\n          transform: translate3d(0, 80px, 0);\n  -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n          transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  -webkit-transition-property: -webkit-transform;\n          transition-property: transform; }\n  md-bottom-sheet.md-has-header {\n    padding-top: 0; }\n  md-bottom-sheet.ng-enter {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n  md-bottom-sheet.ng-enter-active {\n    opacity: 1;\n    display: block;\n    -webkit-transform: translate3d(0, 80px, 0) !important;\n            transform: translate3d(0, 80px, 0) !important; }\n  md-bottom-sheet.ng-leave-active {\n    -webkit-transform: translate3d(0, 100%, 0) !important;\n            transform: translate3d(0, 100%, 0) !important;\n    -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n            transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-bottom-sheet .md-subheader {\n    background-color: transparent;\n    font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif;\n    line-height: 56px;\n    padding: 0;\n    white-space: nowrap; }\n  md-bottom-sheet md-inline-icon {\n    display: inline-block;\n    height: 24px;\n    width: 24px;\n    fill: #444; }\n  md-bottom-sheet md-item {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    outline: none; }\n    md-bottom-sheet md-item:hover {\n      cursor: pointer; }\n  md-bottom-sheet.md-list md-item {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    height: 48px; }\n    md-bottom-sheet.md-list md-item div.md-icon-container {\n      display: inline-block;\n      height: 24px;\n      margin-right: 32px; }\n  md-bottom-sheet.md-grid {\n    padding-left: 24px;\n    padding-right: 24px;\n    padding-top: 0; }\n    md-bottom-sheet.md-grid md-list {\n      display: -webkit-box;\n      display: -webkit-flex;\n      display: -ms-flexbox;\n      display: flex;\n      -webkit-box-orient: horizontal;\n      -webkit-box-direction: normal;\n      -webkit-flex-direction: row;\n          -ms-flex-direction: row;\n              flex-direction: row;\n      -webkit-flex-wrap: wrap;\n          -ms-flex-wrap: wrap;\n              flex-wrap: wrap;\n      -webkit-transition: all 0.5s;\n              transition: all 0.5s;\n      -webkit-box-align: center;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center; }\n    md-bottom-sheet.md-grid md-item {\n      -webkit-box-orient: vertical;\n      -webkit-box-direction: normal;\n      -webkit-flex-direction: column;\n          -ms-flex-direction: column;\n              flex-direction: column;\n      -webkit-box-align: center;\n      -webkit-align-items: center;\n          -ms-flex-align: center;\n              align-items: center;\n      -webkit-transition: all 0.5s;\n              transition: all 0.5s;\n      height: 96px;\n      margin-top: 8px;\n      margin-bottom: 8px;\n      /* Mixin for how many grid items to show per row */ }\n      @media screen and (max-width: 600px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-box-flex: 1;\n          -webkit-flex: 1 1 33.33333%;\n              -ms-flex: 1 1 33.33333%;\n                  flex: 1 1 33.33333%;\n          max-width: 33.33333%; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n+1) {\n            -webkit-box-align: start;\n            -webkit-align-items: flex-start;\n                -ms-flex-align: start;\n                    align-items: flex-start; }\n          md-bottom-sheet.md-grid md-item:nth-of-type(3n) {\n            -webkit-box-align: end;\n            -webkit-align-items: flex-end;\n                -ms-flex-align: end;\n                    align-items: flex-end; } }\n      @media screen and (min-width: 600px) and (max-width: 960px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-box-flex: 1;\n          -webkit-flex: 1 1 25%;\n              -ms-flex: 1 1 25%;\n                  flex: 1 1 25%;\n          max-width: 25%; } }\n      @media screen and (min-width: 960px) and (max-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-box-flex: 1;\n          -webkit-flex: 1 1 16.66667%;\n              -ms-flex: 1 1 16.66667%;\n                  flex: 1 1 16.66667%;\n          max-width: 16.66667%; } }\n      @media screen and (min-width: 1200px) {\n        md-bottom-sheet.md-grid md-item {\n          -webkit-box-flex: 1;\n          -webkit-flex: 1 1 14.28571%;\n              -ms-flex: 1 1 14.28571%;\n                  flex: 1 1 14.28571%;\n          max-width: 14.28571%; } }\n      md-bottom-sheet.md-grid md-item .md-item-content {\n        display: -webkit-box;\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-box-orient: vertical;\n        -webkit-box-direction: normal;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-box-align: center;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 48px;\n        padding-bottom: 16px; }\n      md-bottom-sheet.md-grid md-item .md-grid-item-content {\n        display: -webkit-box;\n        display: -webkit-flex;\n        display: -ms-flexbox;\n        display: flex;\n        -webkit-box-orient: vertical;\n        -webkit-box-direction: normal;\n        -webkit-flex-direction: column;\n            -ms-flex-direction: column;\n                flex-direction: column;\n        -webkit-box-align: center;\n        -webkit-align-items: center;\n            -ms-flex-align: center;\n                align-items: center;\n        width: 80px; }\n      md-bottom-sheet.md-grid md-item .md-icon-container {\n        display: inline-block;\n        box-sizing: border-box;\n        height: 48px;\n        width: 48px;\n        margin: 0 0; }\n      md-bottom-sheet.md-grid md-item p.md-grid-text {\n        font-weight: 300;\n        line-height: 16px;\n        font-size: 13px;\n        margin: 0;\n        white-space: nowrap;\n        width: 64px;\n        text-align: center;\n        padding-top: 8px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/bottomSheet/bottomSheet.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.bottomSheet\n * @description\n * BottomSheet\n */\nangular.module('material.components.bottomSheet', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdBottomSheet', MdBottomSheetDirective)\n  .provider('$mdBottomSheet', MdBottomSheetProvider);\n\nfunction MdBottomSheetDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdBottomSheet\n * @module material.components.bottomSheet\n *\n * @description\n * `$mdBottomSheet` opens a bottom sheet over the app and provides a simple promise API.\n *\n * ### Restrictions\n *\n * - The bottom sheet's template must have an outer `<md-bottom-sheet>` element.\n * - Add the `md-grid` class to the bottom sheet for a grid layout.\n * - Add the `md-list` class to the bottom sheet for a list layout.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openBottomSheet()\">\n *     Open a Bottom Sheet!\n *   </md-button>\n * </div>\n * </hljs>\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdBottomSheet) {\n *   $scope.openBottomSheet = function() {\n *     $mdBottomSheet.show({\n *       template: '<md-bottom-sheet>Hello!</md-bottom-sheet>'\n *     });\n *   };\n * });\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdBottomSheet#show\n *\n * @description\n * Show a bottom sheet with the specified options.\n *\n * @param {object} options An options object, with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *   be used as the content of the bottom sheet. Restrictions: the template must\n *   have an outer `md-bottom-sheet` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *   template string.\n *   - `controller` - `{string=}`: The controller to associate with this bottom sheet.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *   be used as names of values to inject into the controller. For example,\n *   `locals: {three: 3}` would inject `three` into the controller with the value\n *   of 3.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *   the location of the click will be used as the starting point for the opening animation\n *   of the the dialog.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *   and the bottom sheet will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the bottom sheet to. Defaults to appending\n *     to the root element of the application.\n *\n * @returns {promise} A promise that can be resolved with `$mdBottomSheet.hide()` or\n * rejected with `$mdBottomSheet.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#hide\n *\n * @description\n * Hide the existing bottom sheet and resolve the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdBottomSheet#cancel\n *\n * @description\n * Hide the existing bottom sheet and reject the promise returned from\n * `$mdBottomSheet.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n */\n\nfunction MdBottomSheetProvider($$interimElementProvider) {\n\n  bottomSheetDefaults.$inject = [\"$animate\", \"$mdConstant\", \"$timeout\", \"$$rAF\", \"$compile\", \"$mdTheming\", \"$mdBottomSheet\", \"$rootElement\"];\n  return $$interimElementProvider('$mdBottomSheet')\n    .setDefaults({\n      options: bottomSheetDefaults\n    });\n\n  /* @ngInject */\n  function bottomSheetDefaults($animate, $mdConstant, $timeout, $$rAF, $compile, $mdTheming, $mdBottomSheet, $rootElement) {\n    var backdrop;\n\n    return {\n      themable: true,\n      targetEvent: null,\n      onShow: onShow,\n      onRemove: onRemove,\n      escapeToClose: true\n    };\n\n    function onShow(scope, element, options) {\n      // Add a backdrop that will close on click\n      backdrop = $compile('<md-backdrop class=\"md-opaque md-bottom-sheet-backdrop\">')(scope);\n      backdrop.on('click touchstart', function() {\n        $timeout($mdBottomSheet.cancel);\n      });\n\n      $mdTheming.inherit(backdrop, options.parent);\n\n      $animate.enter(backdrop, options.parent, null);\n\n      var bottomSheet = new BottomSheet(element);\n      options.bottomSheet = bottomSheet;\n\n      // Give up focus on calling item\n      options.targetEvent && angular.element(options.targetEvent.target).blur();\n      $mdTheming.inherit(bottomSheet.element, options.parent);\n\n      return $animate.enter(bottomSheet.element, options.parent)\n        .then(function() {\n          var focusable = angular.element(\n            element[0].querySelector('button') ||\n            element[0].querySelector('a') ||\n            element[0].querySelector('[ng-click]')\n          );\n          focusable.focus();\n\n          if (options.escapeToClose) {\n            options.rootElementKeyupCallback = function(e) {\n              if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n                $timeout($mdBottomSheet.cancel);\n              }\n            };\n            $rootElement.on('keyup', options.rootElementKeyupCallback);\n          }\n        });\n\n    }\n\n    function onRemove(scope, element, options) {\n      var bottomSheet = options.bottomSheet;\n      $animate.leave(backdrop);\n      return $animate.leave(bottomSheet.element).then(function() {\n        bottomSheet.cleanup();\n\n        // Restore focus\n        options.targetEvent && angular.element(options.targetEvent.target).focus();\n      });\n    }\n\n    /**\n     * BottomSheet class to apply bottom-sheet behavior to an element\n     */\n    function BottomSheet(element) {\n      var MAX_OFFSET = 80; // amount past the bottom of the element that we can drag down, this is same as in _bottomSheet.scss\n      var WIGGLE_AMOUNT = 20; // point where it starts to get \"harder\" to drag\n      var CLOSING_VELOCITY = 10; // how fast we need to flick down to close the sheet\n      var startY, lastY, velocity, transitionDelay, startTarget;\n\n      // coercion incase $mdCompiler returns multiple elements\n      element = element.eq(0);\n\n      element.on('touchstart', onTouchStart)\n             .on('touchmove', onTouchMove)\n             .on('touchend', onTouchEnd);\n\n      return {\n        element: element,\n        cleanup: function cleanup() {\n          element.off('touchstart', onTouchStart)\n                 .off('touchmove', onTouchMove)\n                 .off('touchend', onTouchEnd);\n        }\n      };\n\n      function onTouchStart(e) {\n        e.preventDefault();\n        startTarget = e.target;\n        startY = getY(e);\n\n        // Disable transitions on transform so that it feels fast\n        transitionDelay = element.css($mdConstant.CSS.TRANSITION_DURATION);\n        element.css($mdConstant.CSS.TRANSITION_DURATION, '0s');\n      }\n\n      function onTouchEnd(e) {\n        // Re-enable the transitions on transforms\n        element.css($mdConstant.CSS.TRANSITION_DURATION, transitionDelay);\n\n        var currentY = getY(e);\n        // If we didn't scroll much, and we didn't change targets, assume its a click\n        if ( Math.abs(currentY - startY) < 5  && e.target == startTarget) {\n          angular.element(e.target).triggerHandler('click');\n        } else {\n          // If they went fast enough, trigger a close.\n          if (velocity > CLOSING_VELOCITY) {\n            $timeout($mdBottomSheet.cancel);\n\n          // Otherwise, untransform so that we go back to our normal position\n          } else {\n            setTransformY(undefined);\n          }\n        }\n      }\n\n      function onTouchMove(e) {\n        var currentY = getY(e);\n        var delta = currentY - startY;\n\n        velocity = currentY - lastY;\n        lastY = currentY;\n\n        // Do some conversion on delta to get a friction-like effect\n        delta = adjustedDelta(delta);\n        setTransformY(delta + MAX_OFFSET);\n      }\n\n      /**\n       * Helper function to find the Y aspect of various touch events.\n       **/\n      function getY(e) {\n        var touch = e.touches && e.touches.length ? e.touches[0] : e.changedTouches[0];\n        return touch.clientY;\n      }\n\n      /**\n       * Transform the element along the y-axis\n       **/\n      function setTransformY(amt) {\n        if (amt === null || amt === undefined) {\n          element.css($mdConstant.CSS.TRANSFORM, '');\n        } else {\n          element.css($mdConstant.CSS.TRANSFORM, 'translate3d(0, ' + amt + 'px, 0)');\n        }\n      }\n\n      // Returns a new value for delta that will never exceed MAX_OFFSET_AMOUNT\n      // Will get harder to exceed it as you get closer to it\n      function adjustedDelta(delta) {\n        if ( delta < 0  && delta < -MAX_OFFSET + WIGGLE_AMOUNT) {\n          delta = -delta;\n          var base = MAX_OFFSET - WIGGLE_AMOUNT;\n          delta = Math.max(-MAX_OFFSET, -Math.min(MAX_OFFSET - 5, base + ( WIGGLE_AMOUNT * (delta - base)) / MAX_OFFSET) - delta / 50);\n        }\n\n        return delta;\n      }\n    }\n\n  }\n\n}\nMdBottomSheetProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/bottomSheet/bower.json",
    "content": "{\n  \"name\": \"angular-material-bottomSheet\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-backdrop\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/button/bower.json",
    "content": "{\n  \"name\": \"angular-material-button\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/button/button-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n.md-button.md-THEME_NAME-theme {\n  border-radius: 3px; }\n  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {\n    background-color: '{{background-500-0.2}}'; }\n  .md-button.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {\n      color: '{{primary-contrast}}';\n      background-color: '{{primary-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {\n        background-color: '{{primary-600}}'; }\n  .md-button.md-THEME_NAME-theme.md-fab {\n    border-radius: 50%; }\n  .md-button.md-THEME_NAME-theme.md-raised, .md-button.md-THEME_NAME-theme.md-fab {\n    color: '{{background-contrast}}';\n    background-color: '{{background-500-0.185}}'; }\n    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {\n      background-color: '{{background-500-0.3}}'; }\n  .md-button.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {\n      color: '{{warn-contrast}}';\n      background-color: '{{warn-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {\n        background-color: '{{warn-700}}'; }\n  .md-button.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {\n      color: '{{accent-contrast}}';\n      background-color: '{{accent-color}}'; }\n      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {\n        background-color: '{{accent-700}}'; }\n  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {\n    color: '{{foreground-3}}';\n    background-color: transparent;\n    cursor: not-allowed; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/button/button.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n/**\n * Position a FAB button.\n */\n.md-button {\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  position: relative;\n  outline: none;\n  border: 0;\n  padding: 6px;\n  margin: 0;\n  background: transparent;\n  white-space: nowrap;\n  text-align: center;\n  text-transform: uppercase;\n  font-weight: 500;\n  font-style: inherit;\n  font-variant: inherit;\n  font-size: inherit;\n  font-family: inherit;\n  line-height: inherit;\n  text-decoration: none;\n  cursor: pointer;\n  overflow: hidden;\n  -webkit-transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n          transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-button.ng-hide {\n    -webkit-transition: none;\n            transition: none; }\n  .md-button.md-cornered {\n    border-radius: 0; }\n  .md-button.md-icon {\n    padding: 0;\n    background: none; }\n  .md-button.md-raised {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  .md-button.md-fab {\n    z-index: 20;\n    width: 56px;\n    height: 56px;\n    border-radius: 50%;\n    border-radius: 50%;\n    overflow: hidden;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    -webkit-transition: 0.2s linear;\n            transition: 0.2s linear;\n    -webkit-transition-property: -webkit-transform, box-shadow;\n            transition-property: transform, box-shadow; }\n    .md-button.md-fab.md-fab-bottom-right {\n      top: auto;\n      right: 20px;\n      bottom: 20px;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-bottom-left {\n      top: auto;\n      right: auto;\n      bottom: 20px;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-right {\n      top: 20px;\n      right: 20px;\n      bottom: auto;\n      left: auto;\n      position: absolute; }\n    .md-button.md-fab.md-fab-top-left {\n      top: 20px;\n      right: auto;\n      bottom: auto;\n      left: 20px;\n      position: absolute; }\n    .md-button.md-fab md-icon {\n      line-height: 56px;\n      margin-top: 0; }\n  .md-button:not([disabled]).md-raised:focus, .md-button:not([disabled]).md-raised:hover, .md-button:not([disabled]).md-fab:focus, .md-button:not([disabled]).md-fab:hover {\n    -webkit-transform: translate3d(0, -1px, 0);\n            transform: translate3d(0, -1px, 0); }\n\n.md-toast-open-top .md-button.md-fab-top-left, .md-toast-open-top .md-button.md-fab-top-right {\n  -webkit-transform: translate3d(0, 42px, 0);\n          transform: translate3d(0, 42px, 0); }\n  .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-left:not([disabled]):hover, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):focus, .md-toast-open-top .md-button.md-fab-top-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, 41px, 0);\n            transform: translate3d(0, 41px, 0); }\n\n.md-toast-open-bottom .md-button.md-fab-bottom-left, .md-toast-open-bottom .md-button.md-fab-bottom-right {\n  -webkit-transform: translate3d(0, -42px, 0);\n          transform: translate3d(0, -42px, 0); }\n  .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-left:not([disabled]):hover, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):focus, .md-toast-open-bottom .md-button.md-fab-bottom-right:not([disabled]):hover {\n    -webkit-transform: translate3d(0, -43px, 0);\n            transform: translate3d(0, -43px, 0); }\n\n.md-button-group {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  width: 100%; }\n\n.md-button-group > .md-button {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  display: block;\n  overflow: hidden;\n  width: 0;\n  border-width: 1px 0px 1px 1px;\n  border-radius: 0;\n  text-align: center;\n  text-overflow: ellipsis;\n  white-space: nowrap; }\n  .md-button-group > .md-button:first-child {\n    border-radius: 2px 0px 0px 2px; }\n  .md-button-group > .md-button:last-child {\n    border-right-width: 1px;\n    border-radius: 0px 2px 2px 0px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/button/button.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.button\n * @description\n *\n * Button\n */\nangular.module('material.components.button', [\n  'material.core'\n])\n  .directive('mdButton', MdButtonDirective);\n\n/**\n * @ngdoc directive\n * @name mdButton\n * @module material.components.button\n *\n * @restrict E\n *\n * @description\n * `<md-button>` is a button directive with optional ink ripples (default enabled).\n *\n * If you supply a `href` or `ng-href` attribute, it will become an `<a>` element. Otherwise, it will\n * become a `<button>` element.\n *\n * @param {boolean=} md-no-ink If present, disable ripple ink effects.\n * @param {expression=} ng-disabled En/Disable based on the expression\n * @param {string=} aria-label Adds alternative text to button for accessibility, useful for icon buttons.\n * If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-button>\n *    Button\n *  </md-button>\n *  <md-button href=\"http://google.com\" class=\"md-button-colored\">\n *    I'm a link\n *  </md-button>\n *  <md-button ng-disabled=\"true\" class=\"md-colored\">\n *    I'm a disabled button\n *  </md-button>\n * </hljs>\n */\nfunction MdButtonDirective($mdInkRipple, $mdTheming, $mdAria) {\n\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: getTemplate,\n    link: postLink\n  };\n\n  function isAnchor(attr) {\n    return angular.isDefined(attr.href) || angular.isDefined(attr.ngHref);\n  }\n  \n  function getTemplate(element, attr) {\n    return isAnchor(attr) ?\n           '<a class=\"md-button\" ng-transclude></a>' :\n           '<button class=\"md-button\" ng-transclude></button>';\n  }\n\n  function postLink(scope, element, attr) {\n    var node = element[0];\n    $mdTheming(element);\n    $mdInkRipple.attachButtonBehavior(scope, element);\n\n    var elementHasText = node.textContent.trim();\n    if (!elementHasText) {\n      $mdAria.expect(element, 'aria-label');\n    }\n\n    // For anchor elements, we have to set tabindex manually when the \n    // element is disabled\n    if (isAnchor(attr) && angular.isDefined(attr.ngDisabled) ) {\n      scope.$watch(attr.ngDisabled, function(isDisabled) {\n        element.attr('tabindex', isDisabled ? -1 : 0);\n      });\n    }\n  }\n\n}\nMdButtonDirective.$inject = [\"$mdInkRipple\", \"$mdTheming\", \"$mdAria\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/card/bower.json",
    "content": "{\n  \"name\": \"angular-material-card\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/card/card-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-card.md-THEME_NAME-theme {\n  border-radius: 2px; }\n  md-card.md-THEME_NAME-theme .md-card-image {\n    border-radius: 2px 2px 0 0; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/card/card.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-card {\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  margin: 8px;\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n  md-card > img {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0;\n    width: 100%; }\n  md-card md-card-content {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 16px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/card/card.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.card\n *\n * @description\n * Card components.\n */\nangular.module('material.components.card', [\n  'material.core'\n])\n  .directive('mdCard', mdCardDirective);\n\n\n\n/**\n * @ngdoc directive\n * @name mdCard\n * @module material.components.card\n *\n * @restrict E\n *\n * @description\n * The `<md-card>` directive is a container element used within `<md-content>` containers.\n *\n * Cards have constant width and variable heights; where the maximum height is limited to what can\n * fit within a single view on a platform, but it can temporarily expand as needed\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-card>\n *  <img src=\"img/washedout.png\" class=\"md-card-image\">\n *  <h2>Paracosm</h2>\n *  <p>\n *    The titles of Washed Out's breakthrough song and the first single from Paracosm share the * two most important words in Ernest Greene's musical language: feel it. It's a simple request, as well...\n *  </p>\n * </md-card>\n * </hljs>\n *\n */\nfunction mdCardDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $mdTheming($element);\n    }\n  };\n}\nmdCardDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/checkbox/bower.json",
    "content": "{\n  \"name\": \"angular-material-checkbox\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/checkbox/checkbox-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-checkbox.md-THEME_NAME-theme .md-ripple {\n  color: '{{primary-600}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon {\n  background-color: '{{primary-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-accent .md-ripple {\n  color: '{{accent-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-accent.md-checked .md-ripple {\n  color: '{{background-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-accent .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-accent.md-checked .md-icon {\n  background-color: '{{accent-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-accent.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {\n  color: '{{warn-600}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {\n  border-color: '{{foreground-2}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {\n  background-color: '{{warn-color-0.87}}'; }\nmd-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {\n  border-color: '{{background-200}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled] .md-icon {\n  border-color: '{{foreground-3}}'; }\nmd-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {\n  background-color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/checkbox/checkbox.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-checkbox {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-checkbox .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 18px;\n    height: 18px; }\n    md-checkbox .md-container:after {\n      content: '';\n      position: absolute;\n      top: -10px;\n      right: -10px;\n      bottom: -10px;\n      left: -10px; }\n    md-checkbox .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -15px;\n      top: -15px;\n      right: -15px;\n      bottom: -15px; }\n  md-checkbox .md-icon {\n    -webkit-transition: 240ms;\n            transition: 240ms;\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 18px;\n    height: 18px;\n    border: 2px solid;\n    border-radius: 2px; }\n  md-checkbox.md-checked .md-icon {\n    border: none; }\n  md-checkbox[disabled] {\n    cursor: no-drop; }\n  md-checkbox:focus .md-label:not(:empty) {\n    border-color: black; }\n  md-checkbox.md-checked .md-icon:after {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg);\n    position: absolute;\n    left: 6px;\n    top: 2px;\n    display: table;\n    width: 6px;\n    height: 12px;\n    border: 2px solid;\n    border-top: 0;\n    border-left: 0;\n    content: ' '; }\n  md-checkbox .md-label {\n    border: 1px dotted transparent;\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    -webkit-user-select: text;\n       -moz-user-select: text;\n        -ms-user-select: text;\n            user-select: text; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/checkbox/checkbox.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.checkbox\n * @description Checkbox module!\n */\nangular.module('material.components.checkbox', [\n  'material.core'\n])\n  .directive('mdCheckbox', MdCheckboxDirective);\n\n/**\n * @ngdoc directive\n * @name mdCheckbox\n * @module material.components.checkbox\n * @restrict E\n *\n * @description\n * The checkbox directive is used like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects\n * @param {string=} aria-label Adds label to checkbox for accessibility.\n * Defaults to checkbox's text. If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-checkbox ng-model=\"isChecked\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-checkbox>\n *\n * <md-checkbox md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-checkbox>\n *\n * <md-checkbox ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-checkbox>\n *\n * </hljs>\n *\n */\nfunction MdCheckboxDirective(inputDirective, $mdInkRipple, $mdAria, $mdConstant, $mdTheming, $mdUtil) {\n  inputDirective = inputDirective[0];\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    require: '?ngModel',\n    template: \n      '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n        '<div class=\"md-icon\"></div>' +\n      '</div>' +\n      '<div ng-transclude class=\"md-label\"></div>',\n    compile: compile\n  };\n\n  // **********************************************************\n  // Private Methods\n  // **********************************************************\n\n  function compile (tElement, tAttrs) {\n\n    tAttrs.type = 'checkbox';\n    tAttrs.tabIndex = 0;\n    tElement.attr('role', tAttrs.type);\n\n    return function postLink(scope, element, attr, ngModelCtrl) {\n      ngModelCtrl = ngModelCtrl || $mdUtil.fakeNgModel();\n      var checked = false;\n      $mdTheming(element);\n\n      $mdAria.expectWithText(tElement, 'aria-label');\n\n      // Reuse the original input[type=checkbox] directive from Angular core.\n      // This is a bit hacky as we need our own event listener and own render\n      // function.\n      inputDirective.link.pre(scope, {\n        on: angular.noop,\n        0: {}\n      }, attr, [ngModelCtrl]);\n\n      // Used by switch. in Switch, we don't want click listeners; we have more granular\n      // touchup/touchdown listening.\n      if (!attr.mdNoClick) {\n        element.on('click', listener);\n      }\n      element.on('keypress', keypressHandler);\n      ngModelCtrl.$render = render;\n\n      function keypressHandler(ev) {\n        if(ev.which === $mdConstant.KEY_CODE.SPACE) {\n          ev.preventDefault();\n          listener(ev);\n        }\n      }\n      function listener(ev) {\n        if (element[0].hasAttribute('disabled')) return;\n\n        scope.$apply(function() {\n          checked = !checked;\n          ngModelCtrl.$setViewValue(checked, ev && ev.type);\n          ngModelCtrl.$render();\n        });\n      }\n\n      function render() {\n        checked = ngModelCtrl.$viewValue;\n        if(checked) {\n          element.addClass(CHECKED_CSS);\n        } else {\n          element.removeClass(CHECKED_CSS);\n        }\n      }\n    };\n  }\n}\nMdCheckboxDirective.$inject = [\"inputDirective\", \"$mdInkRipple\", \"$mdAria\", \"$mdConstant\", \"$mdTheming\", \"$mdUtil\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/content/bower.json",
    "content": "{\n  \"name\": \"angular-material-content\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/content/content-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-content.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/content/content.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-content {\n  display: block;\n  position: relative;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch; }\n  md-content[md-scroll-y] {\n    overflow-y: auto;\n    overflow-x: hidden; }\n  md-content[md-scroll-x] {\n    overflow-x: auto;\n    overflow-y: hidden; }\n  md-content.md-padding {\n    padding: 8px; }\n\n@media (min-width: 600px) {\n  md-content.md-padding {\n    padding: 16px; }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/content/content.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.content\n *\n * @description\n * Scrollable content\n */\nangular.module('material.components.content', [\n  'material.core'\n])\n  .directive('mdContent', mdContentDirective);\n\n/**\n * @ngdoc directive\n * @name mdContent\n * @module material.components.content\n *\n * @restrict E\n *\n * @description\n * The `<md-content>` directive is a container element useful for scrollable content\n *\n * ### Restrictions\n *\n * - Add the `md-padding` class to make the content padded.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-content class=\"md-padding\">\n *      Lorem ipsum dolor sit amet, ne quod novum mei.\n *  </md-content>\n * </hljs>\n *\n */\nfunction mdContentDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: ['$scope', '$element', ContentController],\n    link: function($scope, $element, $attr) {\n      $mdTheming($element);\n      $scope.$broadcast('$mdContentLoaded', $element);\n    }\n  };\n\n  function ContentController($scope, $element) {\n    this.$scope = $scope;\n    this.$element = $element;\n  }\n}\nmdContentDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/core/bower.json",
    "content": "{\n  \"name\": \"angular-material-core\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-theming\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/core/core.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n/* Sizes:\n  0    <= size <= 600  Phone\n  600  <= size <= 960  Tablet\n  960  <= size <= 1200 Tablet-Landscape\n  1200 <= size         PC\n*/\n[layout] {\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n[layout=column] {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n\n[layout=row] {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row; }\n\n[layout-padding], [layout-padding] > [flex] {\n  padding: 8px; }\n\n[layout-margin], [layout-margin] > [flex] {\n  margin: 8px; }\n\n[layout-wrap] {\n  -webkit-flex-wrap: wrap;\n      -ms-flex-wrap: wrap;\n          flex-wrap: wrap; }\n\n[layout-fill] {\n  margin: 0;\n  min-height: 100%;\n  width: 100%; }\n\n@-moz-document url-prefix() {\n  [layout-fill] {\n    margin: 0;\n    width: 100%;\n    min-height: auto;\n    height: inherit; } }\n\n[flex] {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1; }\n\n[flex=\"0\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 0%;\n      -ms-flex: 0 0 0%;\n          flex: 0 0 0%; }\n\n[layout=\"row\"] > [flex=\"0\"] {\n  max-width: 0%; }\n\n[layout=\"column\"] > [flex=\"0\"] {\n  max-height: 0%; }\n\n[flex=\"5\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 5%;\n      -ms-flex: 0 0 5%;\n          flex: 0 0 5%; }\n\n[layout=\"row\"] > [flex=\"5\"] {\n  max-width: 5%; }\n\n[layout=\"column\"] > [flex=\"5\"] {\n  max-height: 5%; }\n\n[flex=\"10\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 10%;\n      -ms-flex: 0 0 10%;\n          flex: 0 0 10%; }\n\n[layout=\"row\"] > [flex=\"10\"] {\n  max-width: 10%; }\n\n[layout=\"column\"] > [flex=\"10\"] {\n  max-height: 10%; }\n\n[flex=\"15\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 15%;\n      -ms-flex: 0 0 15%;\n          flex: 0 0 15%; }\n\n[layout=\"row\"] > [flex=\"15\"] {\n  max-width: 15%; }\n\n[layout=\"column\"] > [flex=\"15\"] {\n  max-height: 15%; }\n\n[flex=\"20\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 20%;\n      -ms-flex: 0 0 20%;\n          flex: 0 0 20%; }\n\n[layout=\"row\"] > [flex=\"20\"] {\n  max-width: 20%; }\n\n[layout=\"column\"] > [flex=\"20\"] {\n  max-height: 20%; }\n\n[flex=\"25\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 25%;\n      -ms-flex: 0 0 25%;\n          flex: 0 0 25%; }\n\n[layout=\"row\"] > [flex=\"25\"] {\n  max-width: 25%; }\n\n[layout=\"column\"] > [flex=\"25\"] {\n  max-height: 25%; }\n\n[flex=\"30\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 30%;\n      -ms-flex: 0 0 30%;\n          flex: 0 0 30%; }\n\n[layout=\"row\"] > [flex=\"30\"] {\n  max-width: 30%; }\n\n[layout=\"column\"] > [flex=\"30\"] {\n  max-height: 30%; }\n\n[flex=\"35\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 35%;\n      -ms-flex: 0 0 35%;\n          flex: 0 0 35%; }\n\n[layout=\"row\"] > [flex=\"35\"] {\n  max-width: 35%; }\n\n[layout=\"column\"] > [flex=\"35\"] {\n  max-height: 35%; }\n\n[flex=\"40\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 40%;\n      -ms-flex: 0 0 40%;\n          flex: 0 0 40%; }\n\n[layout=\"row\"] > [flex=\"40\"] {\n  max-width: 40%; }\n\n[layout=\"column\"] > [flex=\"40\"] {\n  max-height: 40%; }\n\n[flex=\"45\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 45%;\n      -ms-flex: 0 0 45%;\n          flex: 0 0 45%; }\n\n[layout=\"row\"] > [flex=\"45\"] {\n  max-width: 45%; }\n\n[layout=\"column\"] > [flex=\"45\"] {\n  max-height: 45%; }\n\n[flex=\"50\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 50%;\n      -ms-flex: 0 0 50%;\n          flex: 0 0 50%; }\n\n[layout=\"row\"] > [flex=\"50\"] {\n  max-width: 50%; }\n\n[layout=\"column\"] > [flex=\"50\"] {\n  max-height: 50%; }\n\n[flex=\"55\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 55%;\n      -ms-flex: 0 0 55%;\n          flex: 0 0 55%; }\n\n[layout=\"row\"] > [flex=\"55\"] {\n  max-width: 55%; }\n\n[layout=\"column\"] > [flex=\"55\"] {\n  max-height: 55%; }\n\n[flex=\"60\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 60%;\n      -ms-flex: 0 0 60%;\n          flex: 0 0 60%; }\n\n[layout=\"row\"] > [flex=\"60\"] {\n  max-width: 60%; }\n\n[layout=\"column\"] > [flex=\"60\"] {\n  max-height: 60%; }\n\n[flex=\"65\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 65%;\n      -ms-flex: 0 0 65%;\n          flex: 0 0 65%; }\n\n[layout=\"row\"] > [flex=\"65\"] {\n  max-width: 65%; }\n\n[layout=\"column\"] > [flex=\"65\"] {\n  max-height: 65%; }\n\n[flex=\"70\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 70%;\n      -ms-flex: 0 0 70%;\n          flex: 0 0 70%; }\n\n[layout=\"row\"] > [flex=\"70\"] {\n  max-width: 70%; }\n\n[layout=\"column\"] > [flex=\"70\"] {\n  max-height: 70%; }\n\n[flex=\"75\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 75%;\n      -ms-flex: 0 0 75%;\n          flex: 0 0 75%; }\n\n[layout=\"row\"] > [flex=\"75\"] {\n  max-width: 75%; }\n\n[layout=\"column\"] > [flex=\"75\"] {\n  max-height: 75%; }\n\n[flex=\"80\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 80%;\n      -ms-flex: 0 0 80%;\n          flex: 0 0 80%; }\n\n[layout=\"row\"] > [flex=\"80\"] {\n  max-width: 80%; }\n\n[layout=\"column\"] > [flex=\"80\"] {\n  max-height: 80%; }\n\n[flex=\"85\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 85%;\n      -ms-flex: 0 0 85%;\n          flex: 0 0 85%; }\n\n[layout=\"row\"] > [flex=\"85\"] {\n  max-width: 85%; }\n\n[layout=\"column\"] > [flex=\"85\"] {\n  max-height: 85%; }\n\n[flex=\"90\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 90%;\n      -ms-flex: 0 0 90%;\n          flex: 0 0 90%; }\n\n[layout=\"row\"] > [flex=\"90\"] {\n  max-width: 90%; }\n\n[layout=\"column\"] > [flex=\"90\"] {\n  max-height: 90%; }\n\n[flex=\"95\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 95%;\n      -ms-flex: 0 0 95%;\n          flex: 0 0 95%; }\n\n[layout=\"row\"] > [flex=\"95\"] {\n  max-width: 95%; }\n\n[layout=\"column\"] > [flex=\"95\"] {\n  max-height: 95%; }\n\n[flex=\"100\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 100%;\n      -ms-flex: 0 0 100%;\n          flex: 0 0 100%; }\n\n[layout=\"row\"] > [flex=\"100\"] {\n  max-width: 100%; }\n\n[layout=\"column\"] > [flex=\"100\"] {\n  max-height: 100%; }\n\n[layout=\"row\"] > [flex=\"33\"], [layout=\"row\"] > [flex=\"34\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-width: 33.33%; }\n[layout=\"row\"] > [flex=\"66\"], [layout=\"row\"] > [flex=\"67\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-width: 66.66%; }\n\n[layout=\"column\"] > [flex=\"33\"], [layout=\"column\"] > [flex=\"34\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 33.33%;\n      -ms-flex: 0 0 33.33%;\n          flex: 0 0 33.33%;\n  max-height: 33.33%; }\n[layout=\"column\"] > [flex=\"66\"], [layout=\"column\"] > [flex=\"67\"] {\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 66.66%;\n      -ms-flex: 0 0 66.66%;\n          flex: 0 0 66.66%;\n  max-height: 66.66%; }\n\n[layout-align=\"center\"], [layout-align=\"center center\"], [layout-align=\"center start\"], [layout-align=\"center end\"] {\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n[layout-align=\"end\"], [layout-align=\"end center\"], [layout-align=\"end start\"], [layout-align=\"end end\"] {\n  -webkit-box-pack: end;\n  -webkit-justify-content: flex-end;\n      -ms-flex-pack: end;\n          justify-content: flex-end; }\n\n[layout-align=\"space-around\"], [layout-align=\"space-around center\"], [layout-align=\"space-around start\"], [layout-align=\"space-around end\"] {\n  -webkit-justify-content: space-around;\n      -ms-flex-pack: distribute;\n          justify-content: space-around; }\n\n[layout-align=\"space-between\"], [layout-align=\"space-between center\"], [layout-align=\"space-between start\"], [layout-align=\"space-between end\"] {\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between; }\n\n[layout-align=\"center center\"], [layout-align=\"start center\"], [layout-align=\"end center\"], [layout-align=\"space-between center\"], [layout-align=\"space-around center\"] {\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center; }\n\n[layout-align=\"center start\"], [layout-align=\"start start\"], [layout-align=\"end start\"], [layout-align=\"space-between start\"], [layout-align=\"space-around start\"] {\n  -webkit-box-align: start;\n  -webkit-align-items: flex-start;\n      -ms-flex-align: start;\n          align-items: flex-start; }\n\n[layout-align=\"center end\"], [layout-align=\"start end\"], [layout-align=\"end end\"], [layout-align=\"space-between end\"], [layout-align=\"space-around end\"] {\n  -webkit-box-align: end;\n  -webkit-align-items: flex-end;\n      -ms-flex-align: end;\n          align-items: flex-end; }\n\n[flex-order=\"0\"] {\n  -webkit-box-ordinal-group: 1;\n  -webkit-order: 0;\n      -ms-flex-order: 0;\n          order: 0; }\n\n[flex-order=\"1\"] {\n  -webkit-box-ordinal-group: 2;\n  -webkit-order: 1;\n      -ms-flex-order: 1;\n          order: 1; }\n\n[flex-order=\"2\"] {\n  -webkit-box-ordinal-group: 3;\n  -webkit-order: 2;\n      -ms-flex-order: 2;\n          order: 2; }\n\n[flex-order=\"3\"] {\n  -webkit-box-ordinal-group: 4;\n  -webkit-order: 3;\n      -ms-flex-order: 3;\n          order: 3; }\n\n[flex-order=\"4\"] {\n  -webkit-box-ordinal-group: 5;\n  -webkit-order: 4;\n      -ms-flex-order: 4;\n          order: 4; }\n\n[flex-order=\"5\"] {\n  -webkit-box-ordinal-group: 6;\n  -webkit-order: 5;\n      -ms-flex-order: 5;\n          order: 5; }\n\n[flex-order=\"6\"] {\n  -webkit-box-ordinal-group: 7;\n  -webkit-order: 6;\n      -ms-flex-order: 6;\n          order: 6; }\n\n[flex-order=\"7\"] {\n  -webkit-box-ordinal-group: 8;\n  -webkit-order: 7;\n      -ms-flex-order: 7;\n          order: 7; }\n\n[flex-order=\"8\"] {\n  -webkit-box-ordinal-group: 9;\n  -webkit-order: 8;\n      -ms-flex-order: 8;\n          order: 8; }\n\n[flex-order=\"9\"] {\n  -webkit-box-ordinal-group: 10;\n  -webkit-order: 9;\n      -ms-flex-order: 9;\n          order: 9; }\n\n/**\n * `hide-gt-sm show-gt-lg` should hide from 600px to 1200px\n * `show-md hide-gt-sm` should show from 0px to 960px and hide at >960px\n * `hide-gt-md show-gt-sm` should show everywhere (show overrides hide)`\n */\n@media (max-width: 600px) {\n  [hide-sm]:not([show-sm]):not([show]), [hide]:not([show-sm]):not([show]) {\n    display: none; }\n\n  [flex-order-sm=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-sm=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-sm=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-sm=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-sm=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-sm=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-sm=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-sm=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-sm=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-sm=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-sm=\"center\"], [layout-align-sm=\"center center\"], [layout-align-sm=\"center start\"], [layout-align-sm=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-sm=\"end\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-sm=\"space-around\"], [layout-align-sm=\"space-around center\"], [layout-align-sm=\"space-around start\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-sm=\"space-between\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-sm=\"center center\"], [layout-align-sm=\"start center\"], [layout-align-sm=\"end center\"], [layout-align-sm=\"space-between center\"], [layout-align-sm=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-sm=\"center start\"], [layout-align-sm=\"start start\"], [layout-align-sm=\"end start\"], [layout-align-sm=\"space-between start\"], [layout-align-sm=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-sm=\"center end\"], [layout-align-sm=\"start end\"], [layout-align-sm=\"end end\"], [layout-align-sm=\"space-between end\"], [layout-align-sm=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-sm] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-sm=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-sm=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-sm] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-sm=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-sm=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-sm=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-sm=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-sm=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-sm=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-sm=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-sm=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-sm=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-sm=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-sm=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-sm=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-sm=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-sm=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-sm=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-sm=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-sm=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-sm=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-sm=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-sm=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-sm=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-sm=\"33\"], [layout=\"row\"] > [flex-sm=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-sm=\"66\"], [layout=\"row\"] > [flex-sm=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-sm=\"33\"], [layout=\"column\"] > [flex-sm=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-sm=\"66\"], [layout=\"column\"] > [flex-sm=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) {\n  [flex-order-gt-sm=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-sm=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-sm=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-sm=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-sm=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-sm=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-sm=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-sm=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-sm=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-sm=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-sm=\"center\"], [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-sm=\"end\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-sm=\"space-around\"], [layout-align-gt-sm=\"space-around center\"], [layout-align-gt-sm=\"space-around start\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-sm=\"space-between\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-sm=\"center center\"], [layout-align-gt-sm=\"start center\"], [layout-align-gt-sm=\"end center\"], [layout-align-gt-sm=\"space-between center\"], [layout-align-gt-sm=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-sm=\"center start\"], [layout-align-gt-sm=\"start start\"], [layout-align-gt-sm=\"end start\"], [layout-align-gt-sm=\"space-between start\"], [layout-align-gt-sm=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-sm=\"center end\"], [layout-align-gt-sm=\"start end\"], [layout-align-gt-sm=\"end end\"], [layout-align-gt-sm=\"space-between end\"], [layout-align-gt-sm=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-sm] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-sm=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-sm=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-sm] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-sm=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-sm=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-sm=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-sm=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-sm=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-sm=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-sm=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-sm=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-sm=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-sm=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-sm=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-sm=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-sm=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-sm=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-sm=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-sm=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-sm=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-sm=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-sm=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-sm=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-sm=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-sm=\"33\"], [layout=\"row\"] > [flex-gt-sm=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-sm=\"66\"], [layout=\"row\"] > [flex-gt-sm=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-sm=\"33\"], [layout=\"column\"] > [flex-gt-sm=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-sm=\"66\"], [layout=\"column\"] > [flex-gt-sm=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 600px) and (max-width: 960px) {\n  [hide]:not([show-gt-sm]):not([show-md]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-md]):not([show]) {\n    display: none; }\n\n  [hide-md]:not([show-md]):not([show]) {\n    display: none; }\n\n  [flex-order-md=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-md=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-md=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-md=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-md=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-md=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-md=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-md=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-md=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-md=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-md=\"center\"], [layout-align-md=\"center center\"], [layout-align-md=\"center start\"], [layout-align-md=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-md=\"end\"], [layout-align-md=\"end center\"], [layout-align-md=\"end start\"], [layout-align-md=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-md=\"space-around\"], [layout-align-md=\"space-around center\"], [layout-align-md=\"space-around start\"], [layout-align-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-md=\"space-between\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-md=\"center center\"], [layout-align-md=\"start center\"], [layout-align-md=\"end center\"], [layout-align-md=\"space-between center\"], [layout-align-md=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-md=\"center start\"], [layout-align-md=\"start start\"], [layout-align-md=\"end start\"], [layout-align-md=\"space-between start\"], [layout-align-md=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-md=\"center end\"], [layout-align-md=\"start end\"], [layout-align-md=\"end end\"], [layout-align-md=\"space-between end\"], [layout-align-md=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-md] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-md=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-md=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-md] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-md=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-md=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-md=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-md=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-md=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-md=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-md=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-md=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-md=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-md=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-md=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-md=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-md=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-md=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-md=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-md=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-md=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-md=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-md=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-md=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-md=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-md=\"33\"], [layout=\"row\"] > [flex-md=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-md=\"66\"], [layout=\"row\"] > [flex-md=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-md=\"33\"], [layout=\"column\"] > [flex-md=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-md=\"66\"], [layout=\"column\"] > [flex-md=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) {\n  [flex-order-gt-md=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-md=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-md=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-md=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-md=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-md=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-md=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-md=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-md=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-md=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-md=\"center\"], [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-md=\"end\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-md=\"space-around\"], [layout-align-gt-md=\"space-around center\"], [layout-align-gt-md=\"space-around start\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-md=\"space-between\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-md=\"center center\"], [layout-align-gt-md=\"start center\"], [layout-align-gt-md=\"end center\"], [layout-align-gt-md=\"space-between center\"], [layout-align-gt-md=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-md=\"center start\"], [layout-align-gt-md=\"start start\"], [layout-align-gt-md=\"end start\"], [layout-align-gt-md=\"space-between start\"], [layout-align-gt-md=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-md=\"center end\"], [layout-align-gt-md=\"start end\"], [layout-align-gt-md=\"end end\"], [layout-align-gt-md=\"space-between end\"], [layout-align-gt-md=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-md] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-md=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-md=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-md] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-md=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-md=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-md=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-md=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-md=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-md=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-md=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-md=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-md=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-md=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-md=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-md=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-md=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-md=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-md=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-md=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-md=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-md=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-md=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-md=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-md=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-md=\"33\"], [layout=\"row\"] > [flex-gt-md=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-md=\"66\"], [layout=\"row\"] > [flex-gt-md=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-md=\"33\"], [layout=\"column\"] > [flex-gt-md=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-md=\"66\"], [layout=\"column\"] > [flex-gt-md=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 960px) and (max-width: 1200px) {\n  [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-lg]):not([show]) {\n    display: none; }\n\n  [hide-lg]:not([show-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-lg=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-lg=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-lg=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-lg=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-lg=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-lg=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-lg=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-lg=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-lg=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-lg=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-lg=\"center\"], [layout-align-lg=\"center center\"], [layout-align-lg=\"center start\"], [layout-align-lg=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-lg=\"end\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-lg=\"space-around\"], [layout-align-lg=\"space-around center\"], [layout-align-lg=\"space-around start\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-lg=\"space-between\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-lg=\"center center\"], [layout-align-lg=\"start center\"], [layout-align-lg=\"end center\"], [layout-align-lg=\"space-between center\"], [layout-align-lg=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-lg=\"center start\"], [layout-align-lg=\"start start\"], [layout-align-lg=\"end start\"], [layout-align-lg=\"space-between start\"], [layout-align-lg=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-lg=\"center end\"], [layout-align-lg=\"start end\"], [layout-align-lg=\"end end\"], [layout-align-lg=\"space-between end\"], [layout-align-lg=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-lg] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-lg=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-lg=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-lg] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-lg=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-lg=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-lg=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-lg=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-lg=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-lg=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-lg=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-lg=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-lg=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-lg=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-lg=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-lg=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-lg=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-lg=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-lg=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-lg=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-lg=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-lg=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-lg=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-lg=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-lg=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-lg=\"33\"], [layout=\"row\"] > [flex-lg=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-lg=\"66\"], [layout=\"row\"] > [flex-lg=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-lg=\"33\"], [layout=\"column\"] > [flex-lg=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-lg=\"66\"], [layout=\"column\"] > [flex-lg=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n@media (min-width: 1200px) {\n  [hide-gt-sm]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-md]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide-gt-lg]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]), [hide]:not([show-gt-sm]):not([show-gt-md]):not([show-gt-lg]):not([show]) {\n    display: none; }\n\n  [flex-order-gt-lg=\"0\"] {\n    -webkit-box-ordinal-group: 1;\n    -webkit-order: 0;\n        -ms-flex-order: 0;\n            order: 0; }\n\n  [flex-order-gt-lg=\"1\"] {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1; }\n\n  [flex-order-gt-lg=\"2\"] {\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2; }\n\n  [flex-order-gt-lg=\"3\"] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3; }\n\n  [flex-order-gt-lg=\"4\"] {\n    -webkit-box-ordinal-group: 5;\n    -webkit-order: 4;\n        -ms-flex-order: 4;\n            order: 4; }\n\n  [flex-order-gt-lg=\"5\"] {\n    -webkit-box-ordinal-group: 6;\n    -webkit-order: 5;\n        -ms-flex-order: 5;\n            order: 5; }\n\n  [flex-order-gt-lg=\"6\"] {\n    -webkit-box-ordinal-group: 7;\n    -webkit-order: 6;\n        -ms-flex-order: 6;\n            order: 6; }\n\n  [flex-order-gt-lg=\"7\"] {\n    -webkit-box-ordinal-group: 8;\n    -webkit-order: 7;\n        -ms-flex-order: 7;\n            order: 7; }\n\n  [flex-order-gt-lg=\"8\"] {\n    -webkit-box-ordinal-group: 9;\n    -webkit-order: 8;\n        -ms-flex-order: 8;\n            order: 8; }\n\n  [flex-order-gt-lg=\"9\"] {\n    -webkit-box-ordinal-group: 10;\n    -webkit-order: 9;\n        -ms-flex-order: 9;\n            order: 9; }\n\n  [layout-align-gt-lg=\"center\"], [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"center end\"] {\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center; }\n\n  [layout-align-gt-lg=\"end\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"end end\"] {\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end; }\n\n  [layout-align-gt-lg=\"space-around\"], [layout-align-gt-lg=\"space-around center\"], [layout-align-gt-lg=\"space-around start\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-justify-content: space-around;\n        -ms-flex-pack: distribute;\n            justify-content: space-around; }\n\n  [layout-align-gt-lg=\"space-between\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-between end\"] {\n    -webkit-box-pack: justify;\n    -webkit-justify-content: space-between;\n        -ms-flex-pack: justify;\n            justify-content: space-between; }\n\n  [layout-align-gt-lg=\"center center\"], [layout-align-gt-lg=\"start center\"], [layout-align-gt-lg=\"end center\"], [layout-align-gt-lg=\"space-between center\"], [layout-align-gt-lg=\"space-around center\"] {\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n\n  [layout-align-gt-lg=\"center start\"], [layout-align-gt-lg=\"start start\"], [layout-align-gt-lg=\"end start\"], [layout-align-gt-lg=\"space-between start\"], [layout-align-gt-lg=\"space-around start\"] {\n    -webkit-box-align: start;\n    -webkit-align-items: flex-start;\n        -ms-flex-align: start;\n            align-items: flex-start; }\n\n  [layout-align-gt-lg=\"center end\"], [layout-align-gt-lg=\"start end\"], [layout-align-gt-lg=\"end end\"], [layout-align-gt-lg=\"space-between end\"], [layout-align-gt-lg=\"space-around end\"] {\n    -webkit-box-align: end;\n    -webkit-align-items: flex-end;\n        -ms-flex-align: end;\n            align-items: flex-end; }\n\n  [layout-gt-lg] {\n    box-sizing: border-box;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex; }\n\n  [layout-gt-lg=column] {\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: column;\n        -ms-flex-direction: column;\n            flex-direction: column; }\n\n  [layout-gt-lg=row] {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row; }\n\n  [flex-gt-lg] {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1; }\n\n  [flex-gt-lg=\"0\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 0%;\n        -ms-flex: 0 0 0%;\n            flex: 0 0 0%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"0\"] {\n    max-width: 0%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"0\"] {\n    max-height: 0%; }\n\n  [flex-gt-lg=\"5\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 5%;\n        -ms-flex: 0 0 5%;\n            flex: 0 0 5%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"5\"] {\n    max-width: 5%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"5\"] {\n    max-height: 5%; }\n\n  [flex-gt-lg=\"10\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 10%;\n        -ms-flex: 0 0 10%;\n            flex: 0 0 10%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"10\"] {\n    max-width: 10%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"10\"] {\n    max-height: 10%; }\n\n  [flex-gt-lg=\"15\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 15%;\n        -ms-flex: 0 0 15%;\n            flex: 0 0 15%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"15\"] {\n    max-width: 15%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"15\"] {\n    max-height: 15%; }\n\n  [flex-gt-lg=\"20\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 20%;\n        -ms-flex: 0 0 20%;\n            flex: 0 0 20%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"20\"] {\n    max-width: 20%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"20\"] {\n    max-height: 20%; }\n\n  [flex-gt-lg=\"25\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 25%;\n        -ms-flex: 0 0 25%;\n            flex: 0 0 25%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"25\"] {\n    max-width: 25%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"25\"] {\n    max-height: 25%; }\n\n  [flex-gt-lg=\"30\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 30%;\n        -ms-flex: 0 0 30%;\n            flex: 0 0 30%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"30\"] {\n    max-width: 30%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"30\"] {\n    max-height: 30%; }\n\n  [flex-gt-lg=\"35\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 35%;\n        -ms-flex: 0 0 35%;\n            flex: 0 0 35%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"35\"] {\n    max-width: 35%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"35\"] {\n    max-height: 35%; }\n\n  [flex-gt-lg=\"40\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 40%;\n        -ms-flex: 0 0 40%;\n            flex: 0 0 40%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"40\"] {\n    max-width: 40%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"40\"] {\n    max-height: 40%; }\n\n  [flex-gt-lg=\"45\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 45%;\n        -ms-flex: 0 0 45%;\n            flex: 0 0 45%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"45\"] {\n    max-width: 45%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"45\"] {\n    max-height: 45%; }\n\n  [flex-gt-lg=\"50\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 50%;\n        -ms-flex: 0 0 50%;\n            flex: 0 0 50%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"50\"] {\n    max-width: 50%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"50\"] {\n    max-height: 50%; }\n\n  [flex-gt-lg=\"55\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 55%;\n        -ms-flex: 0 0 55%;\n            flex: 0 0 55%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"55\"] {\n    max-width: 55%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"55\"] {\n    max-height: 55%; }\n\n  [flex-gt-lg=\"60\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 60%;\n        -ms-flex: 0 0 60%;\n            flex: 0 0 60%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"60\"] {\n    max-width: 60%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"60\"] {\n    max-height: 60%; }\n\n  [flex-gt-lg=\"65\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 65%;\n        -ms-flex: 0 0 65%;\n            flex: 0 0 65%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"65\"] {\n    max-width: 65%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"65\"] {\n    max-height: 65%; }\n\n  [flex-gt-lg=\"70\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 70%;\n        -ms-flex: 0 0 70%;\n            flex: 0 0 70%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"70\"] {\n    max-width: 70%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"70\"] {\n    max-height: 70%; }\n\n  [flex-gt-lg=\"75\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 75%;\n        -ms-flex: 0 0 75%;\n            flex: 0 0 75%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"75\"] {\n    max-width: 75%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"75\"] {\n    max-height: 75%; }\n\n  [flex-gt-lg=\"80\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 80%;\n        -ms-flex: 0 0 80%;\n            flex: 0 0 80%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"80\"] {\n    max-width: 80%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"80\"] {\n    max-height: 80%; }\n\n  [flex-gt-lg=\"85\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 85%;\n        -ms-flex: 0 0 85%;\n            flex: 0 0 85%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"85\"] {\n    max-width: 85%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"85\"] {\n    max-height: 85%; }\n\n  [flex-gt-lg=\"90\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 90%;\n        -ms-flex: 0 0 90%;\n            flex: 0 0 90%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"90\"] {\n    max-width: 90%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"90\"] {\n    max-height: 90%; }\n\n  [flex-gt-lg=\"95\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 95%;\n        -ms-flex: 0 0 95%;\n            flex: 0 0 95%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"95\"] {\n    max-width: 95%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"95\"] {\n    max-height: 95%; }\n\n  [flex-gt-lg=\"100\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 100%;\n        -ms-flex: 0 0 100%;\n            flex: 0 0 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"100\"] {\n    max-width: 100%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"100\"] {\n    max-height: 100%; }\n\n  [layout=\"row\"] > [flex-gt-lg=\"33\"], [layout=\"row\"] > [flex-gt-lg=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-width: 33.33%; }\n  [layout=\"row\"] > [flex-gt-lg=\"66\"], [layout=\"row\"] > [flex-gt-lg=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-width: 66.66%; }\n\n  [layout=\"column\"] > [flex-gt-lg=\"33\"], [layout=\"column\"] > [flex-gt-lg=\"34\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 33.33%;\n        -ms-flex: 0 0 33.33%;\n            flex: 0 0 33.33%;\n    max-height: 33.33%; }\n  [layout=\"column\"] > [flex-gt-lg=\"66\"], [layout=\"column\"] > [flex-gt-lg=\"67\"] {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 0 66.66%;\n        -ms-flex: 0 0 66.66%;\n            flex: 0 0 66.66%;\n    max-height: 66.66%; }\n }\n\n*, *:before, *:after {\n  box-sizing: border-box; }\n\n:focus {\n  outline: none; }\n\nhtml, body {\n  height: 100%;\n  color: rgba(0, 0, 0, 0.87);\n  background: white;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  -webkit-touch-callout: none;\n  -webkit-text-size-adjust: 100%;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility; }\n  html p, body p {\n    line-height: 1.846; }\n  html h3, body h3 {\n    display: block;\n    -webkit-margin-before: 1em;\n    -webkit-margin-after: 1em;\n    -webkit-margin-start: 0px;\n    -webkit-margin-end: 0px;\n    font-size: 1.17em;\n    font-weight: bold; }\n\nbutton, select, html, textarea, input {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\nbody {\n  margin: 0;\n  padding: 0;\n  outline: none; }\n\n.inset {\n  padding: 10px; }\n\nbutton {\n  font-family: RobotoDraft, Roboto, 'Helvetica Neue', sans-serif; }\n\na {\n  background: transparent;\n  outline: none; }\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0; }\n\nh2 {\n  font-size: 1.5em;\n  margin: 0.83em 0; }\n\nh3 {\n  font-size: 1.17em;\n  margin: 1em 0; }\n\nh4 {\n  font-size: 1em;\n  margin: 1.33em 0; }\n\nh5 {\n  font-size: 0.83em;\n  margin: 1.67em 0; }\n\nh6 {\n  font-size: 0.75em;\n  margin: 2.33em 0; }\n\nselect, button, textarea, input {\n  margin: 0;\n  font-size: 100%;\n  font-family: inherit;\n  vertical-align: baseline; }\n\ninput[type=\"reset\"], input[type=\"submit\"], html input[type=\"button\"], button {\n  cursor: pointer;\n  -webkit-appearance: button; }\n  input[type=\"reset\"][disabled], input[type=\"submit\"][disabled], html input[type=\"button\"][disabled], button[disabled] {\n    cursor: default; }\n\ntextarea {\n  vertical-align: top;\n  overflow: auto; }\n\ninput[type=\"radio\"], input[type=\"checkbox\"] {\n  padding: 0;\n  box-sizing: border-box; }\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box; }\n  input[type=\"search\"]::-webkit-search-decoration, input[type=\"search\"]::-webkit-search-cancel-button {\n    -webkit-appearance: none; }\n\n.md-shadow {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: inherit;\n  pointer-events: none; }\n\n.md-shadow-bottom-z-1 {\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-shadow-bottom-z-2 {\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.4); }\n\n.md-shadow-animated.md-shadow {\n  -webkit-transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);\n          transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); }\n\n/*\n * A container inside of a rippling element (eg a button),\n * which contains all of the individual ripples\n */\n.md-ripple-container {\n  pointer-events: none;\n  position: absolute;\n  overflow: hidden;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  -webkit-transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1);\n          transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1); }\n\n.md-ripple {\n  position: absolute;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n  opacity: 0;\n  border-radius: 50%; }\n  .md-ripple.md-ripple-placed {\n    -webkit-transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: left 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), top 0.9s cubic-bezier(0.25, 0.8, 0.25, 1), margin 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), border 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), width 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.65s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.65s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  .md-ripple.md-ripple-scaled {\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  .md-ripple.md-ripple-active, .md-ripple.md-ripple-full, .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n\nmd-tab > .md-ripple-container .md-ripple {\n  box-sizing: content-box;\n  background-color: transparent !important;\n  border-width: 0;\n  border-style: solid;\n  opacity: 0.2;\n  -webkit-transform: none !important;\n          transform: none !important; }\n  md-tab > .md-ripple-container .md-ripple.md-ripple-active, md-tab > .md-ripple-container .md-ripple.md-ripple-full, md-tab > .md-ripple-container .md-ripple.md-ripple-visible {\n    opacity: 0.2; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/core/core.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * Initialization function that validates environment\n * requirements.\n */\nangular.module('material.core', ['material.core.theming'])\n  .run(MdCoreInitialize)\n  .config(MdCoreConfigure);\n\nfunction MdCoreInitialize() {\n  if (typeof Hammer === 'undefined') {\n    throw new Error(\n      'ngMaterial requires HammerJS to be preloaded.'\n    );\n  }\n  // By default, Hammer disables user selection on desktop if swipe is enabled.\n  // We don't want this, so we make sure Hammer doesn't set a user-select: none.\n  Hammer.defaults.cssProps.userSelect = '';\n}\n\nfunction MdCoreConfigure($provide, $mdThemingProvider) {\n  $provide.decorator('$$rAF', ['$delegate', '$rootScope', rAFDecorator]);\n\n  $mdThemingProvider.theme('default')\n    .primaryColor('blue')\n    .accentColor('green')\n    .warnColor('red')\n    .backgroundColor('grey');\n\n  function rAFDecorator($$rAF, $rootScope) {\n    /**\n     * Use this to debounce events that come in often.\n     * The debounced function will always use the *last* invocation before the\n     * coming frame.\n     *\n     * For example, window resize events that fire many times a second:\n     * If we set to use an raf-debounced callback on window resize, then\n     * our callback will only be fired once per frame, with the last resize\n     * event that happened before that frame.\n     *\n     * @param {function} callback function to debounce\n     */\n    $$rAF.debounce = function(cb) {\n      var queueArgs, alreadyQueued, queueCb, context;\n      return function debounced() {\n        queueArgs = arguments;\n        context = this;\n        queueCb = cb;\n        if (!alreadyQueued) {\n          alreadyQueued = true;\n          $$rAF(function() {\n            queueCb.apply(context, queueArgs);\n            alreadyQueued = false;\n          });\n        }\n      };\n    };\n    return $$rAF;\n\n  }\n\n}\nMdCoreConfigure.$inject = [\"$provide\", \"$mdThemingProvider\"];\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n.factory('$mdConstant', MdConstantFactory);\n\nfunction MdConstantFactory($$rAF, $sniffer) {\n\n  var webkit = /webkit/i.test($sniffer.vendorPrefix);\n  function vendorProperty(name) {\n    return webkit ?  ('webkit' + name.charAt(0).toUpperCase() + name.substring(1)) : name;\n  }\n\n  return {\n    KEY_CODE: {\n      ENTER: 13,\n      ESCAPE: 27,\n      SPACE: 32,\n      LEFT_ARROW : 37,\n      UP_ARROW : 38,\n      RIGHT_ARROW : 39,\n      DOWN_ARROW : 40\n    },\n    CSS: {\n      /* Constants */\n      TRANSITIONEND: 'transitionend' + (webkit ? ' webkitTransitionEnd' : ''),\n      ANIMATIONEND: 'animationend' + (webkit ? ' webkitAnimationEnd' : ''),\n\n      TRANSFORM: vendorProperty('transform'),\n      TRANSITION: vendorProperty('transition'),\n      TRANSITION_DURATION: vendorProperty('transitionDuration'),\n      ANIMATION_PLAY_STATE: vendorProperty('animationPlayState'),\n      ANIMATION_DURATION: vendorProperty('animationDuration'),\n      ANIMATION_NAME: vendorProperty('animationName'),\n      ANIMATION_TIMING: vendorProperty('animationTimingFunction'),\n      ANIMATION_DIRECTION: vendorProperty('animationDirection')\n    },\n    MEDIA: {\n      'sm': '(max-width: 600px)',\n      'gt-sm': '(min-width: 600px)',\n      'md': '(min-width: 600px) and (max-width: 960px)',\n      'gt-md': '(min-width: 960px)',\n      'lg': '(min-width: 960px) and (max-width: 1200px)',\n      'gt-lg': '(min-width: 1200px)'\n    }\n  };\n}\nMdConstantFactory.$inject = [\"$$rAF\", \"$sniffer\"];\n\n})();\n\n(function(){\n\n  angular\n    .module('material.core')\n    .config( [\"$provide\", function($provide){\n       $provide.decorator('$mdUtil', ['$delegate', function ($delegate){\n           /**\n            * Inject the iterator facade to easily support iteration and accessors\n            * @see iterator below\n            */\n           $delegate.iterator = Iterator;\n\n           return $delegate;\n         }\n       ]);\n     }]);\n\n  /**\n   * iterator is a list facade to easily support iteration and accessors\n   *\n   * @param items Array list which this iterator will enumerate\n   * @param reloop Boolean enables iterator to consider the list as an endless reloop\n   */\n  function Iterator(items, reloop) {\n    var trueFn = function() { return true; };\n\n    reloop = !!reloop;\n    var _items = items || [ ];\n\n    // Published API\n    return {\n      items: getItems,\n      count: count,\n\n      inRange: inRange,\n      contains: contains,\n      indexOf: indexOf,\n      itemAt: itemAt,\n\n      findBy: findBy,\n\n      add: add,\n      remove: remove,\n\n      first: first,\n      last: last,\n      next: angular.bind(null, findSubsequentItem, false),\n      previous: angular.bind(null, findSubsequentItem, true),\n\n      hasPrevious: hasPrevious,\n      hasNext: hasNext\n\n    };\n\n    /**\n     * Publish copy of the enumerable set\n     * @returns {Array|*}\n     */\n    function getItems() {\n      return [].concat(_items);\n    }\n\n    /**\n     * Determine length of the list\n     * @returns {Array.length|*|number}\n     */\n    function count() {\n      return _items.length;\n    }\n\n    /**\n     * Is the index specified valid\n     * @param index\n     * @returns {Array.length|*|number|boolean}\n     */\n    function inRange(index) {\n      return _items.length && ( index > -1 ) && (index < _items.length );\n    }\n\n    /**\n     * Can the iterator proceed to the next item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasNext(item) {\n      return item ? inRange(indexOf(item) + 1) : false;\n    }\n\n    /**\n     * Can the iterator proceed to the previous item in the list; relative to\n     * the specified item.\n     *\n     * @param item\n     * @returns {Array.length|*|number|boolean}\n     */\n    function hasPrevious(item) {\n      return item ? inRange(indexOf(item) - 1) : false;\n    }\n\n    /**\n     * Get item at specified index/position\n     * @param index\n     * @returns {*}\n     */\n    function itemAt(index) {\n      return inRange(index) ? _items[index] : null;\n    }\n\n    /**\n     * Find all elements matching the key/value pair\n     * otherwise return null\n     *\n     * @param val\n     * @param key\n     *\n     * @return array\n     */\n    function findBy(key, val) {\n      return _items.filter(function(item) {\n        return item[key] === val;\n      });\n    }\n\n    /**\n     * Add item to list\n     * @param item\n     * @param index\n     * @returns {*}\n     */\n    function add(item, index) {\n      if ( !item ) return -1;\n\n      if (!angular.isNumber(index)) {\n        index = _items.length;\n      }\n\n      _items.splice(index, 0, item);\n\n      return indexOf(item);\n    }\n\n    /**\n     * Remove item from list...\n     * @param item\n     */\n    function remove(item) {\n      if ( contains(item) ){\n        _items.splice(indexOf(item), 1);\n      }\n    }\n\n    /**\n     * Get the zero-based index of the target item\n     * @param item\n     * @returns {*}\n     */\n    function indexOf(item) {\n      return _items.indexOf(item);\n    }\n\n    /**\n     * Boolean existence check\n     * @param item\n     * @returns {boolean}\n     */\n    function contains(item) {\n      return item && (indexOf(item) > -1);\n    }\n\n    /**\n     * Return first item in the list\n     * @returns {*}\n     */\n    function first() {\n      return _items.length ? _items[0] : null;\n    }\n\n    /**\n     * Return last item in the list...\n     * @returns {*}\n     */\n    function last() {\n      return _items.length ? _items[_items.length - 1] : null;\n    }\n\n    /**\n     * Find the next item. If reloop is true and at the end of the list, it will\n     * go back to the first item. If given ,the `validate` callback will be used\n     * determine whether the next item is valid. If not valid, it will try to find the\n     * next item again.\n     * @param item\n     * @param {optional} validate function\n     * @param {optional} recursion limit\n     * @returns {*}\n     */\n    function findSubsequentItem(backwards, item, validate, limit) {\n      validate = validate || trueFn;\n\n      var curIndex = indexOf(item);\n      if (!inRange(curIndex)) {\n        return null;\n      }\n\n      var nextIndex = curIndex + (backwards ? -1 : 1);\n      var foundItem = null;\n      if (inRange(nextIndex)) {\n        foundItem = _items[nextIndex];\n      } else if (reloop) {\n        foundItem = backwards ? last() : first();\n        nextIndex = indexOf(foundItem);\n      }\n\n      if ((foundItem === null) || (nextIndex === limit)) {\n        return null;\n      }\n\n      if (angular.isUndefined(limit)) {\n        limit = nextIndex;\n      }\n\n      return validate(foundItem) ? foundItem : findSubsequentItem(backwards, foundItem, validate, limit);\n    }\n  }\n\n})();\n\nangular.module('material.core')\n.factory('$mdMedia', mdMediaFactory);\n\n/**\n * Exposes a function on the '$mdMedia' service which will return true or false,\n * whether the given media query matches. Re-evaluates on resize. Allows presets\n * for 'sm', 'md', 'lg'.\n *\n * @example $mdMedia('sm') == true if device-width <= sm\n * @example $mdMedia('(min-width: 1200px)') == true if device-width >= 1200px\n * @example $mdMedia('max-width: 300px') == true if device-width <= 300px (sanitizes input, adding parens)\n */\nfunction mdMediaFactory($mdConstant, $mdUtil, $rootScope, $window) {\n  var queriesCache = $mdUtil.cacheFactory('$mdMedia:queries', {capacity: 15});\n  var resultsCache = $mdUtil.cacheFactory('$mdMedia:results', {capacity: 15});\n\n  angular.element($window).on('resize', updateAll);\n\n  return $mdMedia;\n\n  function $mdMedia(query) {\n    var validated = queriesCache.get(query);\n    if (angular.isUndefined(validated)) {\n      validated = queriesCache.put(query, validate(query));\n    }\n\n    var result = resultsCache.get(validated);\n    if (angular.isUndefined(result)) {\n      result = add(validated);\n    }\n\n    return result;\n  }\n\n  function validate(query) {\n    return $mdConstant.MEDIA[query] ||\n           ((query.charAt(0) !== '(') ? ('(' + query + ')') : query);\n  }\n\n  function add(query) {\n    return resultsCache.put(query, !!$window.matchMedia(query).matches);\n  }\n\n  function updateAll() {\n    var keys = resultsCache.keys();\n    var len = keys.length;\n\n    if (len) {\n      for (var i = 0; i < len; i++) {\n        add(keys[i]);\n      }\n\n      // Trigger a $digest() if not already in progress\n      $rootScope.$evalAsync();\n    }\n  }\n}\nmdMediaFactory.$inject = [\"$mdConstant\", \"$mdUtil\", \"$rootScope\", \"$window\"];\n\n(function() {\n'use strict';\n\n/*\n * This var has to be outside the angular factory, otherwise when\n * there are multiple material apps on the same page, each app\n * will create its own instance of this array and the app's IDs\n * will not be unique.\n */\nvar nextUniqueId = ['0','0','0'];\n\nangular.module('material.core')\n.factory('$mdUtil', [\"$cacheFactory\", \"$document\", \"$timeout\", function($cacheFactory, $document, $timeout) {\n  var Util;\n  return Util = {\n    now: window.performance ? angular.bind(window.performance, window.performance.now) : Date.now,\n\n    attachDragBehavior: attachDragBehavior,\n\n    elementRect: function(element, offsetParent) {\n      var node = element[0];\n      offsetParent = offsetParent || node.offsetParent || document.body;\n      offsetParent = offsetParent[0] || offsetParent;\n      var nodeRect = node.getBoundingClientRect();\n      var parentRect = offsetParent.getBoundingClientRect();\n      return {\n        left: nodeRect.left - parentRect.left + offsetParent.scrollLeft,\n        top: nodeRect.top - parentRect.top + offsetParent.scrollTop,\n        width: nodeRect.width,\n        height: nodeRect.height\n      };\n    },\n\n    fakeNgModel: function() {\n      return {\n        $setViewValue: function(value) {\n          this.$viewValue = value;\n          this.$render(value);\n          this.$viewChangeListeners.forEach(function(cb) { cb(); });\n        },\n        $parsers: [],\n        $formatters: [],\n        $viewChangeListeners: [],\n        $render: angular.noop\n      };\n    },\n\n    /**\n     * @see cacheFactory below\n     */\n    cacheFactory: cacheFactory,\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds.\n    // @param wait Integer value of msecs to delay (since last debounce reset); default value 10 msecs\n    // @param invokeApply should the $timeout trigger $digest() dirty checking\n    debounce: function (func, wait, scope, invokeApply) {\n      var timer;\n\n      return function debounced() {\n        var context = scope,\n          args = Array.prototype.slice.call(arguments);\n\n        $timeout.cancel(timer);\n        timer = $timeout(function() {\n\n          timer = undefined;\n          func.apply(context, args);\n\n        }, wait || 10, invokeApply );\n      };\n    },\n\n    // Returns a function that can only be triggered every `delay` milliseconds.\n    // In other words, the function will not be called unless it has been more\n    // than `delay` milliseconds since the last call.\n    throttle: function throttle(func, delay) {\n      var recent;\n      return function throttled() {\n        var context = this;\n        var args = arguments;\n        var now = Util.now();\n\n        if (!recent || (now - recent > delay)) {\n          func.apply(context, args);\n          recent = now;\n        }\n      };\n    },\n\n    /**\n     * nextUid, from angular.js.\n     * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\n     * characters such as '012ABC'. The reason why we are not using simply a number counter is that\n     * the number string gets longer over time, and it can also overflow, where as the nextId\n     * will grow much slower, it is a string, and it will never overflow.\n     *\n     * @returns an unique alpha-numeric string\n     */\n    nextUid: function() {\n      var index = nextUniqueId.length;\n      var digit;\n\n      while(index) {\n        index--;\n        digit = nextUniqueId[index].charCodeAt(0);\n        if (digit == 57 /*'9'*/) {\n          nextUniqueId[index] = 'A';\n          return nextUniqueId.join('');\n        }\n        if (digit == 90  /*'Z'*/) {\n          nextUniqueId[index] = '0';\n        } else {\n          nextUniqueId[index] = String.fromCharCode(digit + 1);\n          return nextUniqueId.join('');\n        }\n      }\n      nextUniqueId.unshift('0');\n      return nextUniqueId.join('');\n    },\n\n    // Stop watchers and events from firing on a scope without destroying it,\n    // by disconnecting it from its parent and its siblings' linked lists.\n    disconnectScope: function disconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't destroy the root scope or a scope that has been already destroyed\n      if (scope.$root === scope) return;\n      if (scope.$$destroyed ) return;\n\n      var parent = scope.$parent;\n      scope.$$disconnected = true;\n\n      // See Scope.$destroy\n      if (parent.$$childHead === scope) parent.$$childHead = scope.$$nextSibling;\n      if (parent.$$childTail === scope) parent.$$childTail = scope.$$prevSibling;\n      if (scope.$$prevSibling) scope.$$prevSibling.$$nextSibling = scope.$$nextSibling;\n      if (scope.$$nextSibling) scope.$$nextSibling.$$prevSibling = scope.$$prevSibling;\n\n      scope.$$nextSibling = scope.$$prevSibling = null;\n\n    },\n\n    // Undo the effects of disconnectScope above.\n    reconnectScope: function reconnectScope(scope) {\n      if (!scope) return;\n\n      // we can't disconnect the root node or scope already disconnected\n      if (scope.$root === scope) return;\n      if (!scope.$$disconnected) return;\n\n      var child = scope;\n\n      var parent = child.$parent;\n      child.$$disconnected = false;\n      // See Scope.$new for this logic...\n      child.$$prevSibling = parent.$$childTail;\n      if (parent.$$childHead) {\n        parent.$$childTail.$$nextSibling = child;\n        parent.$$childTail = child;\n      } else {\n        parent.$$childHead = parent.$$childTail = child;\n      }\n    },\n  /*\n   * getClosest replicates jQuery.closest() to walk up the DOM tree until it finds a matching nodeName\n   *\n   * @param el Element to start walking the DOM from\n   * @param tagName Tag name to find closest to el, such as 'form'\n   */\n    getClosest: function getClosest(el, tagName) {\n      tagName = tagName.toUpperCase();\n      do {\n        if (el.nodeName === tagName) {\n          return el;\n        }\n      } while (el = el.parentNode);\n      return null;\n    }\n  };\n\n\n  function attachDragBehavior(scope, element, options) {\n    // The state of the current drag & previous drag\n    var drag;\n    var previousDrag;\n    // Whether the pointer is currently down on this element.\n    var pointerIsDown;\n    var START_EVENTS = 'mousedown touchstart pointerdown';\n    var MOVE_EVENTS = 'mousemove touchmove pointermove';\n    var END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';\n\n    // Listen to move and end events on document. End events especially could have bubbled up\n    // from the child.\n    element.on(START_EVENTS, startDrag);\n    $document.on(MOVE_EVENTS, doDrag)\n      .on(END_EVENTS, endDrag);\n\n    scope.$on('$destroy', cleanup);\n\n    return cleanup;\n\n    function cleanup() {\n      if (cleanup.called) return;\n      cleanup.called = true;\n\n      element.off(START_EVENTS, startDrag);\n      $document.off(MOVE_EVENTS, doDrag)\n        .off(END_EVENTS, endDrag);\n      drag = pointerIsDown = false;\n    }\n\n    function startDrag(ev) {\n      var eventType = ev.type.charAt(0);\n      var now = Util.now();\n      // iOS & old android bug: after a touch event, iOS sends a click event 350 ms later.\n      // Don't allow a drag of a different pointerType than the previous drag if it has been\n      // less than 400ms.\n      if (previousDrag && previousDrag.pointerType !== eventType &&\n          (now - previousDrag.endTime < 400)) {\n        return;\n      }\n      if (pointerIsDown) return;\n      pointerIsDown = true;\n\n      drag = {\n        // Restrict this drag to whatever started it: if a mousedown started the drag,\n        // don't let anything but mouse events continue it.\n        pointerType: eventType,\n        startX: getPosition(ev),\n        startTime: now\n      };\n\n      element.one('$md.dragstart', function(ev) {\n        // Allow user to cancel by preventing default\n        if (ev.defaultPrevented) drag = null;\n      });\n      element.triggerHandler('$md.dragstart', drag);\n    }\n    function doDrag(ev) {\n      if (!drag || !isProperEventType(ev, drag)) return;\n\n      if (drag.pointerType === 't' || drag.pointerType === 'p') {\n        // No scrolling for touch/pointer events\n        ev.preventDefault();\n      }\n      updateDragState(ev);\n      element.triggerHandler('$md.drag', drag);\n    }\n    function endDrag(ev) {\n      pointerIsDown = false;\n      if (!drag || !isProperEventType(ev, drag)) return;\n\n      drag.endTime = Util.now();\n      updateDragState(ev);\n\n      element.triggerHandler('$md.dragend', drag);\n\n      previousDrag = drag;\n      drag = null;\n    }\n\n    function updateDragState(ev) {\n      var x = getPosition(ev);\n      drag.distance = drag.startX - x;\n      drag.direction = drag.distance > 0 ? 'left' : (drag.distance < 0 ? 'right' : '');\n      drag.duration = drag.startTime - Util.now();\n      drag.velocity = Math.abs(drag.duration) / drag.time;\n    }\n    function getPosition(ev) {\n      ev = ev.originalEvent || ev; //support jQuery events\n      var point = (ev.touches && ev.touches[0]) ||\n        (ev.changedTouches && ev.changedTouches[0]) ||\n        ev;\n      return point.pageX;\n    }\n    function isProperEventType(ev, drag) {\n      return drag && ev && (ev.type || '').charAt(0) === drag.pointerType;\n    }\n  }\n\n  /*\n   * Inject a 'keys()' method into Angular's $cacheFactory. Then\n   * head-hook all other methods\n   *\n   */\n  function cacheFactory(id, options) {\n    var cache = $cacheFactory(id, options);\n    var keys = {};\n\n    cache._put = cache.put;\n    cache.put = function(k,v) {\n      keys[k] = true;\n      return cache._put(k, v);\n    };\n\n    cache._remove = cache.remove;\n    cache.remove = function(k) {\n      delete keys[k];\n      return cache._remove(k);\n    };\n\n    cache._removeAll = cache.removeAll;\n    cache.removeAll = function() {\n      keys = {};\n      return cache._removeAll();\n    };\n\n    cache._destroy = cache.destroy;\n    cache.destroy = function() {\n      keys = {};\n      return cache._destroy();\n    };\n\n    cache.keys = function() {\n      return Object.keys(keys);\n    };\n\n    return cache;\n  }\n}]);\n\n/*\n * Since removing jQuery from the demos, some code that uses `element.focus()` is broken.\n *\n * We need to add `element.focus()`, because it's testable unlike `element[0].focus`.\n *\n * TODO(ajoslin): This should be added in a better place later.\n */\n\nangular.element.prototype.focus = angular.element.prototype.focus || function() {\n  if (this.length) {\n    this[0].focus();\n  }\n  return this;\n};\nangular.element.prototype.blur = angular.element.prototype.blur || function() {\n  if (this.length) {\n    this[0].blur();\n  }\n  return this;\n};\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdAria', AriaService);\n\nfunction AriaService($$rAF, $log, $window) {\n\n  return {\n    expect: expect,\n    expectAsync: expectAsync,\n    expectWithText: expectWithText\n  };\n\n  /**\n   * Check if expected attribute has been specified on the target element or child\n   * @param element\n   * @param attrName\n   * @param {optional} defaultValue What to set the attr to if no value is found\n   */\n  function expect(element, attrName, defaultValue) {\n    var node = element[0];\n\n    if (!node.hasAttribute(attrName) && !childHasAttribute(node, attrName)) {\n\n      defaultValue = angular.isString(defaultValue) && defaultValue.trim() || '';\n      if (defaultValue.length) {\n        element.attr(attrName, defaultValue);\n      } else {\n        $log.warn('ARIA: Attribute \"', attrName, '\", required for accessibility, is missing on node:', node);\n      }\n\n    }\n  }\n\n  function expectAsync(element, attrName, defaultValueGetter) {\n    // Problem: when retrieving the element's contents synchronously to find the label,\n    // the text may not be defined yet in the case of a binding.\n    // There is a higher chance that a binding will be defined if we wait one frame.\n    $$rAF(function() {\n      expect(element, attrName, defaultValueGetter());\n    });\n  }\n\n  function expectWithText(element, attrName) {\n    expectAsync(element, attrName, function() {\n      return element.text().trim();\n    });\n  }\n\n  function childHasAttribute(node, attrName) {\n    var hasChildren = node.hasChildNodes(),\n        hasAttr = false;\n\n    function isHidden(el) {\n      var style = el.currentStyle ? el.currentStyle : $window.getComputedStyle(el);\n      return (style.display === 'none');\n    }\n\n    if(hasChildren) {\n      var children = node.childNodes;\n      for(var i=0; i<children.length; i++){\n        var child = children[i];\n        if(child.nodeType === 1 && child.hasAttribute(attrName)) {\n          if(!isHidden(child)){\n            hasAttr = true;\n          }\n        }\n      }\n    }\n    return hasAttr;\n  }\n}\nAriaService.$inject = [\"$$rAF\", \"$log\", \"$window\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .service('$mdCompiler', mdCompilerService);\n\nfunction mdCompilerService($q, $http, $injector, $compile, $controller, $templateCache) {\n  /* jshint validthis: true */\n\n  /*\n   * @ngdoc service\n   * @name $mdCompiler\n   * @module material.core\n   * @description\n   * The $mdCompiler service is an abstraction of angular's compiler, that allows the developer\n   * to easily compile an element with a templateUrl, controller, and locals.\n   *\n   * @usage\n   * <hljs lang=\"js\">\n   * $mdCompiler.compile({\n   *   templateUrl: 'modal.html',\n   *   controller: 'ModalCtrl',\n   *   locals: {\n   *     modal: myModalInstance;\n   *   }\n   * }).then(function(compileData) {\n   *   compileData.element; // modal.html's template in an element\n   *   compileData.link(myScope); //attach controller & scope to element\n   * });\n   * </hljs>\n   */\n\n   /*\n    * @ngdoc method\n    * @name $mdCompiler#compile\n    * @description A helper to compile an HTML template/templateUrl with a given controller,\n    * locals, and scope.\n    * @param {object} options An options object, with the following properties:\n    *\n    *    - `controller` - `{(string=|function()=}` Controller fn that should be associated with\n    *      newly created scope or the name of a registered controller if passed as a string.\n    *    - `controllerAs` - `{string=}` A controller alias name. If present the controller will be\n    *      published to scope under the `controllerAs` name.\n    *    - `template` - `{string=}` An html template as a string.\n    *    - `templateUrl` - `{string=}` A path to an html template.\n    *    - `transformTemplate` - `{function(template)=}` A function which transforms the template after\n    *      it is loaded. It will be given the template string as a parameter, and should\n    *      return a a new string representing the transformed template.\n    *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n    *      be injected into the controller. If any of these dependencies are promises, the compiler\n    *      will wait for them all to be resolved, or if one is rejected before the controller is\n    *      instantiated `compile()` will fail..\n    *      * `key` - `{string}`: a name of a dependency to be injected into the controller.\n    *      * `factory` - `{string|function}`: If `string` then it is an alias for a service.\n    *        Otherwise if function, then it is injected and the return value is treated as the\n    *        dependency. If the result is a promise, it is resolved before its value is \n    *        injected into the controller.\n    *\n    * @returns {object=} promise A promise, which will be resolved with a `compileData` object.\n    * `compileData` has the following properties: \n    *\n    *   - `element` - `{element}`: an uncompiled element matching the provided template.\n    *   - `link` - `{function(scope)}`: A link function, which, when called, will compile\n    *     the element and instantiate the provided controller (if given).\n    *   - `locals` - `{object}`: The locals which will be passed into the controller once `link` is\n    *     called. If `bindToController` is true, they will be coppied to the ctrl instead\n    *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in\n    */\n  this.compile = function(options) {\n    var templateUrl = options.templateUrl;\n    var template = options.template || '';\n    var controller = options.controller;\n    var controllerAs = options.controllerAs;\n    var resolve = options.resolve || {};\n    var locals = options.locals || {};\n    var transformTemplate = options.transformTemplate || angular.identity;\n    var bindToController = options.bindToController;\n\n    // Take resolve values and invoke them.  \n    // Resolves can either be a string (value: 'MyRegisteredAngularConst'),\n    // or an invokable 'factory' of sorts: (value: function ValueGetter($dependency) {})\n    angular.forEach(resolve, function(value, key) {\n      if (angular.isString(value)) {\n        resolve[key] = $injector.get(value);\n      } else {\n        resolve[key] = $injector.invoke(value);\n      }\n    });\n    //Add the locals, which are just straight values to inject\n    //eg locals: { three: 3 }, will inject three into the controller\n    angular.extend(resolve, locals);\n\n    if (templateUrl) {\n      resolve.$template = $http.get(templateUrl, {cache: $templateCache})\n        .then(function(response) {\n          return response.data;\n        });\n    } else {\n      resolve.$template = $q.when(template);\n    }\n\n    // Wait for all the resolves to finish if they are promises\n    return $q.all(resolve).then(function(locals) {\n\n      var template = transformTemplate(locals.$template);\n      var element = angular.element('<div>').html(template.trim()).contents();\n      var linkFn = $compile(element);\n\n      //Return a linking function that can be used later when the element is ready\n      return {\n        locals: locals,\n        element: element,\n        link: function link(scope) {\n          locals.$scope = scope;\n\n          //Instantiate controller if it exists, because we have scope\n          if (controller) {\n            var ctrl = $controller(controller, locals);\n            if (bindToController) {\n              angular.extend(ctrl, locals);\n            }\n            //See angular-route source for this logic\n            element.data('$ngControllerController', ctrl);\n            element.children().data('$ngControllerController', ctrl);\n\n            if (controllerAs) {\n              scope[controllerAs] = ctrl;\n            }\n          }\n\n          return linkFn(scope);\n        }\n      };\n    });\n\n  };\n}\nmdCompilerService.$inject = [\"$q\", \"$http\", \"$injector\", \"$compile\", \"$controller\", \"$templateCache\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .provider('$$interimElement', InterimElementProvider);\n\n/*\n * @ngdoc service\n * @name $$interimElement\n * @module material.core\n *\n * @description\n *\n * Factory that contructs `$$interimElement.$service` services.\n * Used internally in material design for elements that appear on screen temporarily.\n * The service provides a promise-like API for interacting with the temporary\n * elements.\n *\n * ```js\n * app.service('$mdToast', function($$interimElement) {\n *   var $mdToast = $$interimElement(toastDefaultOptions);\n *   return $mdToast;\n * });\n * ```\n * @param {object=} defaultOptions Options used by default for the `show` method on the service.\n *\n * @returns {$$interimElement.$service}\n *\n */\n\nfunction InterimElementProvider() {\n  createInterimElementProvider.$get = InterimElementFactory;\n  InterimElementFactory.$inject = [\"$document\", \"$q\", \"$rootScope\", \"$timeout\", \"$rootElement\", \"$animate\", \"$interpolate\", \"$mdCompiler\", \"$mdTheming\"];\n  return createInterimElementProvider;\n\n  /**\n   * Returns a new provider which allows configuration of a new interimElement\n   * service. Allows configuration of default options & methods for options,\n   * as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)\n   */\n  function createInterimElementProvider(interimFactoryName) {\n    var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];\n    var providerConfig = {\n      presets: {}\n    };\n    var provider = {\n      setDefaults: setDefaults,\n      addPreset: addPreset,\n      $get: factory\n    };\n\n    /**\n     * all interim elements will come with the 'build' preset\n     */\n    provider.addPreset('build', {\n      methods: ['controller', 'controllerAs', 'resolve',\n        'template', 'templateUrl', 'themable', 'transformTemplate', 'parent']\n    });\n\n    factory.$inject = [\"$$interimElement\", \"$animate\", \"$injector\"];\n    return provider;\n\n    /**\n     * Save the configured defaults to be used when the factory is instantiated\n     */\n    function setDefaults(definition) {\n      providerConfig.optionsFactory = definition.options;\n      providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);\n      return provider;\n    }\n\n    /**\n     * Save the configured preset to be used when the factory is instantiated\n     */\n    function addPreset(name, definition) {\n      definition = definition || {};\n      definition.methods = definition.methods || [];\n      definition.options = definition.options || function() { return {}; };\n\n      if (/^cancel|hide|show$/.test(name)) {\n        throw new Error(\"Preset '\" + name + \"' in \" + interimFactoryName + \" is reserved!\");\n      }\n      if (definition.methods.indexOf('_options') > -1) {\n        throw new Error(\"Method '_options' in \" + interimFactoryName + \" is reserved!\");\n      }\n      providerConfig.presets[name] = {\n        methods: definition.methods.concat(EXPOSED_METHODS),\n        optionsFactory: definition.options,\n        argOption: definition.argOption\n      };\n      return provider;\n    }\n\n    /**\n     * Create a factory that has the given methods & defaults implementing interimElement\n     */\n    /* @ngInject */\n    function factory($$interimElement, $animate, $injector) {\n      var defaultMethods;\n      var defaultOptions;\n      var interimElementService = $$interimElement();\n\n      /*\n       * publicService is what the developer will be using.\n       * It has methods hide(), cancel(), show(), build(), and any other\n       * presets which were set during the config phase.\n       */\n      var publicService = {\n        hide: interimElementService.hide,\n        cancel: interimElementService.cancel,\n        show: showInterimElement\n      };\n\n      defaultMethods = providerConfig.methods || [];\n      // This must be invoked after the publicService is initialized\n      defaultOptions = invokeFactory(providerConfig.optionsFactory, {});\n\n      angular.forEach(providerConfig.presets, function(definition, name) {\n        var presetDefaults = invokeFactory(definition.optionsFactory, {});\n        var presetMethods = (definition.methods || []).concat(defaultMethods);\n\n        // Every interimElement built with a preset has a field called `$type`,\n        // which matches the name of the preset.\n        // Eg in preset 'confirm', options.$type === 'confirm'\n        angular.extend(presetDefaults, { $type: name });\n\n        // This creates a preset class which has setter methods for every\n        // method given in the `.addPreset()` function, as well as every\n        // method given in the `.setDefaults()` function.\n        //\n        // @example\n        // .setDefaults({\n        //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n        //   options: dialogDefaultOptions\n        // })\n        // .addPreset('alert', {\n        //   methods: ['title', 'ok'],\n        //   options: alertDialogOptions\n        // })\n        //\n        // Set values will be passed to the options when interimElemnt.show() is called.\n        function Preset(opts) {\n          this._options = angular.extend({}, presetDefaults, opts);\n        }\n        angular.forEach(presetMethods, function(name) {\n          Preset.prototype[name] = function(value) {\n            this._options[name] = value;\n            return this;\n          };\n        });\n\n        // Create shortcut method for one-linear methods\n        if (definition.argOption) {\n          var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);\n          publicService[methodName] = function(arg) {\n            var config = publicService[name](arg);\n            return publicService.show(config);\n          };\n        }\n\n        // eg $mdDialog.alert() will return a new alert preset\n        publicService[name] = function(arg) {\n          // If argOption is supplied, eg `argOption: 'content'`, then we assume\n          // if the argument is not an options object then it is the `argOption` option.\n          //\n          // @example `$mdToast.simple('hello')` // sets options.content to hello\n          //                                     // because argOption === 'content'\n          if (arguments.length && definition.argOption && !angular.isObject(arg) &&\n              !angular.isArray(arg)) {\n            return (new Preset())[definition.argOption](arg);\n          } else {\n            return new Preset(arg);\n          }\n\n        };\n      });\n\n      return publicService;\n\n      function showInterimElement(opts) {\n        // opts is either a preset which stores its options on an _options field,\n        // or just an object made up of options\n        if (opts && opts._options) opts = opts._options;\n        return interimElementService.show(\n          angular.extend({}, defaultOptions, opts)\n        );\n      }\n\n      /**\n       * Helper to call $injector.invoke with a local of the factory name for\n       * this provider.\n       * If an $mdDialog is providing options for a dialog and tries to inject\n       * $mdDialog, a circular dependency error will happen.\n       * We get around that by manually injecting $mdDialog as a local.\n       */\n      function invokeFactory(factory, defaultVal) {\n        var locals = {};\n        locals[interimFactoryName] = publicService;\n        return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);\n      }\n\n    }\n\n  }\n\n  /* @ngInject */\n  function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate,\n                                 $interpolate, $mdCompiler, $mdTheming ) {\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        usesStandardSymbols = ((startSymbol === '{{') && (endSymbol === '}}')),\n        processTemplate  = usesStandardSymbols ? angular.identity : replaceInterpolationSymbols;\n\n    return function createInterimElementService() {\n      /*\n       * @ngdoc service\n       * @name $$interimElement.$service\n       *\n       * @description\n       * A service used to control inserting and removing an element into the DOM.\n       *\n       */\n      var stack = [];\n      var service;\n      return service = {\n        show: show,\n        hide: hide,\n        cancel: cancel\n      };\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#show\n       * @kind function\n       *\n       * @description\n       * Adds the `$interimElement` to the DOM and returns a promise that will be resolved or rejected\n       * with hide or cancel, respectively.\n       *\n       * @param {*} options is hashMap of settings\n       * @returns a Promise\n       *\n       */\n      function show(options) {\n        if (stack.length) {\n          service.cancel();\n        }\n\n        var interimElement = new InterimElement(options);\n\n        stack.push(interimElement);\n        return interimElement.show().then(function() {\n          return interimElement.deferred.promise;\n        });\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#hide\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and resolves the promise returned from `show`\n       *\n       * @param {*} resolveParam Data to resolve the promise with\n       * @returns a Promise that will be resolved after the element has been removed.\n       *\n       */\n      function hide(response) {\n        var interimElement = stack.shift();\n        interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.resolve(response);\n        });\n\n        return interimElement ? interimElement.deferred.promise : $q.when(response);\n      }\n\n      /*\n       * @ngdoc method\n       * @name $$interimElement.$service#cancel\n       * @kind function\n       *\n       * @description\n       * Removes the `$interimElement` from the DOM and rejects the promise returned from `show`\n       *\n       * @param {*} reason Data to reject the promise with\n       * @returns Promise that will be rejected after the element has been removed.\n       *\n       */\n      function cancel(reason) {\n        var interimElement = stack.shift();\n        interimElement && interimElement.remove().then(function() {\n          interimElement.deferred.reject(reason);\n        });\n\n        return interimElement ? interimElement.deferred.promise : $q.reject(reason);\n      }\n\n\n      /*\n       * Internal Interim Element Object\n       * Used internally to manage the DOM element and related data\n       */\n      function InterimElement(options) {\n        var self;\n        var hideTimeout, element;\n\n        options = options || {};\n        options = angular.extend({\n          scope: options.scope || $rootScope.$new(options.isolateScope),\n          onShow: function(scope, element, options) {\n            return $animate.enter(element, options.parent);\n          },\n          onRemove: function(scope, element, options) {\n            // Element could be undefined if a new element is shown before\n            // the old one finishes compiling.\n            return element && $animate.leave(element) || $q.when();\n          }\n        }, options);\n\n        if (options.template) {\n          options.template = processTemplate(options.template);\n        }\n\n        return self = {\n          options: options,\n          deferred: $q.defer(),\n          show: function() {\n            return $mdCompiler.compile(options).then(function(compileData) {\n              angular.extend(compileData.locals, self.options);\n\n              // Search for parent at insertion time, if not specified\n              if (angular.isString(options.parent)) {\n                options.parent = angular.element($document[0].querySelector(options.parent));\n              } else if (!options.parent) {\n                options.parent = $rootElement.find('body');\n                if (!options.parent.length) options.parent = $rootElement;\n              }\n\n              element = compileData.link(options.scope);\n              if (options.themable) $mdTheming(element);\n              var ret = options.onShow(options.scope, element, options);\n              return $q.when(ret)\n                .then(function(){\n                  // Issue onComplete callback when the `show()` finishes\n                  (options.onComplete || angular.noop)(options.scope, element, options);\n                  startHideTimeout();\n                });\n\n              function startHideTimeout() {\n                if (options.hideDelay) {\n                  hideTimeout = $timeout(service.cancel, options.hideDelay) ;\n                }\n              }\n            });\n          },\n          cancelTimeout: function() {\n            if (hideTimeout) {\n              $timeout.cancel(hideTimeout);\n              hideTimeout = undefined;\n            }\n          },\n          remove: function() {\n            self.cancelTimeout();\n            var ret = options.onRemove(options.scope, element, options);\n            return $q.when(ret).then(function() {\n              options.scope.$destroy();\n            });\n          }\n        };\n      }\n    };\n\n    /*\n     * Replace `{{` and `}}` in a string (usually a template) with the actual start-/endSymbols used\n     * for interpolation. This allows pre-defined templates (for components such as dialog, toast etc)\n     * to continue to work in apps that use custom interpolation start-/endSymbols.\n     *\n     * @param {string} text The text in which to replace `{{` / `}}`\n     * @returns {string} The modified string using the actual interpolation start-/endSymbols\n     */\n    function replaceInterpolationSymbols(text) {\n      if (!text || !angular.isString(text)) return text;\n      return text.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n    }\n  }\n\n}\n\n})();\n\n(function() {\n  'use strict';\n\n  /**\n   * @ngdoc module\n   * @name material.core.componentRegistry\n   *\n   * @description\n   * A component instance registration service.\n   * Note: currently this as a private service in the SideNav component.\n   */\n  angular.module('material.core')\n    .factory('$mdComponentRegistry', ComponentRegistry);\n\n  /*\n   * @private\n   * @ngdoc factory\n   * @name ComponentRegistry\n   * @module material.core.componentRegistry\n   *\n   */\n  function ComponentRegistry($log, $q) {\n\n    var self;\n    var instances = [ ];\n    var pendings = { };\n\n    return self = {\n      /**\n       * Used to print an error when an instance for a handle isn't found.\n       */\n      notFoundError: function(handle) {\n        $log.error('No instance found for handle', handle);\n      },\n      /**\n       * Return all registered instances as an array.\n       */\n      getInstances: function() {\n        return instances;\n      },\n\n      /**\n       * Get a registered instance.\n       * @param handle the String handle to look up for a registered instance.\n       */\n      get: function(handle) {\n        if ( !isValidID(handle) ) return null;\n\n        var i, j, instance;\n        for(i = 0, j = instances.length; i < j; i++) {\n          instance = instances[i];\n          if(instance.$$mdHandle === handle) {\n            return instance;\n          }\n        }\n        return null;\n      },\n\n      /**\n       * Register an instance.\n       * @param instance the instance to register\n       * @param handle the handle to identify the instance under.\n       */\n      register: function(instance, handle) {\n        if ( !handle ) return angular.noop;\n\n        instance.$$mdHandle = handle;\n        instances.push(instance);\n        resolveWhen();\n\n        return deregister;\n\n        /**\n         * Remove registration for an instance\n         */\n        function deregister() {\n          var index = instances.indexOf(instance);\n          if (index !== -1) {\n            instances.splice(index, 1);\n          }\n        }\n\n        /**\n         * Resolve any pending promises for this instance\n         */\n        function resolveWhen() {\n          var dfd = pendings[handle];\n          if ( dfd ) {\n            dfd.resolve( instance );\n            delete pendings[handle];\n          }\n        }\n      },\n\n      /**\n       * Async accessor to registered component instance\n       * If not available then a promise is created to notify\n       * all listeners when the instance is registered.\n       */\n      when : function(handle) {\n        if ( isValidID(handle) ) {\n          var deferred = $q.defer();\n          var instance = self.get(handle);\n\n          if ( instance )  {\n            deferred.resolve( instance );\n          } else {\n            pendings[handle] = deferred;\n          }\n\n          return deferred.promise;\n        }\n        return $q.reject(\"Invalid `md-component-id` value.\");\n      }\n\n    };\n\n    function isValidID(handle){\n      return handle && (handle !== \"\");\n    }\n\n  }\n  ComponentRegistry.$inject = [\"$log\", \"$q\"];\n\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core')\n  .factory('$mdInkRipple', InkRippleService)\n  .directive('mdInkRipple', InkRippleDirective)\n  .directive('mdNoInk', attrNoDirective())\n  .directive('mdNoBar', attrNoDirective())\n  .directive('mdNoStretch', attrNoDirective());\n\nfunction InkRippleDirective($mdInkRipple) {\n  return {\n    controller: angular.noop,\n    link: function (scope, element, attr) {\n      if (attr.hasOwnProperty('mdInkRippleCheckbox')) {\n        $mdInkRipple.attachCheckboxBehavior(scope, element);\n      } else {\n        $mdInkRipple.attachButtonBehavior(scope, element);\n      }\n    }\n  };\n}\nInkRippleDirective.$inject = [\"$mdInkRipple\"];\n\nfunction InkRippleService($window, $timeout) {\n\n  return {\n    attachButtonBehavior: attachButtonBehavior,\n    attachCheckboxBehavior: attachCheckboxBehavior,\n    attachTabBehavior: attachTabBehavior,\n    attach: attach\n  };\n\n  function attachButtonBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      isFAB: element.hasClass('md-fab'),\n      isMenuItem: element.hasClass('md-menu-item'),\n      center: false,\n      dimBackground: true\n    }, options));\n  }\n\n  function attachCheckboxBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: true,\n      dimBackground: false\n    }, options));\n  }\n\n  function attachTabBehavior(scope, element, options) {\n    return attach(scope, element, angular.extend({\n      center: false,\n      dimBackground: true,\n      outline: true\n    }, options));\n  }\n\n  function attach(scope, element, options) {\n    if (element.controller('mdNoInk')) return angular.noop;\n\n    options = angular.extend({\n      colorElement: element,\n      mousedown: true,\n      hover: true,\n      focus: true,\n      center: false,\n      mousedownPauseTime: 150,\n      dimBackground: false,\n      outline: false,\n      isFAB: false,\n      isMenuItem: false\n    }, options);\n\n    var rippleContainer, rippleSize,\n        controller = element.controller('mdInkRipple') || {},\n        counter = 0,\n        ripples = [],\n        states = [],\n        isActiveExpr = element.attr('md-highlight'),\n        isActive = false,\n        isHeld = false,\n        node = element[0],\n        hammertime = new Hammer(node),\n        color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n    // expose onInput for ripple testing\n    scope._onInput = onInput;\n\n    options.mousedown && hammertime.on('hammer.input', onInput);\n\n    controller.createRipple = createRipple;\n\n    if (isActiveExpr) {\n      scope.$watch(isActiveExpr, function watchActive(newValue) {\n        isActive = newValue;\n        if (isActive && !ripples.length) {\n          $timeout(function () { createRipple(0, 0); }, 0, false);\n        }\n        angular.forEach(ripples, updateElement);\n      });\n    }\n\n    // Publish self-detach method if desired...\n    return function detach() {\n      hammertime.destroy();\n      rippleContainer && rippleContainer.remove();\n    };\n\n    function parseColor(color) {\n      if (!color) return;\n      if (color.indexOf('rgba') === 0) return color.replace(/\\d?\\.?\\d*\\s*\\)\\s*$/, '0.1)');\n      if (color.indexOf('rgb')  === 0) return rgbToRGBA(color);\n      if (color.indexOf('#')    === 0) return hexToRGBA(color);\n\n      /**\n       * Converts a hex value to an rgba string\n       *\n       * @param {string} hex value (3 or 6 digits) to be converted\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function hexToRGBA(color) {\n        var hex = color.charAt(0) === '#' ? color.substr(1) : color,\n          dig = hex.length / 3,\n          red = hex.substr(0, dig),\n          grn = hex.substr(dig, dig),\n          blu = hex.substr(dig * 2);\n        if (dig === 1) {\n          red += red;\n          grn += grn;\n          blu += blu;\n        }\n        return 'rgba(' + parseInt(red, 16) + ',' + parseInt(grn, 16) + ',' + parseInt(blu, 16) + ',0.1)';\n      }\n\n      /**\n       * Converts rgb value to rgba string\n       *\n       * @param {string} rgb color string\n       *\n       * @returns {string} rgba color with 0.1 alpha\n       */\n      function rgbToRGBA(color) {\n        return color.replace(')', ', 0.1)').replace('(', 'a(');\n      }\n\n    }\n\n    function removeElement(elem, wait) {\n      ripples.splice(ripples.indexOf(elem), 1);\n      if (ripples.length === 0) {\n        rippleContainer && rippleContainer.css({ backgroundColor: '' });\n      }\n      $timeout(function () { elem.remove(); }, wait, false);\n    }\n\n    function updateElement(elem) {\n      var index = ripples.indexOf(elem),\n          state = states[index] || {},\n          elemIsActive = ripples.length > 1 ? false : isActive,\n          elemIsHeld   = ripples.length > 1 ? false : isHeld;\n      if (elemIsActive || state.animating || elemIsHeld) {\n        elem.addClass('md-ripple-visible');\n      } else if (elem) {\n        elem.removeClass('md-ripple-visible');\n        if (options.outline) {\n          elem.css({\n            width: rippleSize + 'px',\n            height: rippleSize + 'px',\n            marginLeft: (rippleSize * -1) + 'px',\n            marginTop: (rippleSize * -1) + 'px'\n          });\n        }\n        removeElement(elem, options.outline ? 450 : 650);\n      }\n    }\n\n    /**\n     * Creates a ripple at the provided coordinates\n     *\n     * @param {number} left cursor position\n     * @param {number} top cursor position\n     *\n     * @returns {angular.element} the generated ripple element\n     */\n    function createRipple(left, top) {\n\n      color = parseColor(element.attr('md-ink-ripple')) || parseColor($window.getComputedStyle(options.colorElement[0]).color || 'rgb(0, 0, 0)');\n\n      var container = getRippleContainer(),\n          size = getRippleSize(left, top),\n          css = getRippleCss(size, left, top),\n          elem = getRippleElement(css),\n          index = ripples.indexOf(elem),\n          state = states[index] || {};\n\n      rippleSize = size;\n\n      state.animating = true;\n\n      $timeout(function () {\n        if (options.dimBackground) {\n          container.css({ backgroundColor: color });\n        }\n        elem.addClass('md-ripple-placed md-ripple-scaled');\n        if (options.outline) {\n          elem.css({\n            borderWidth: (size * 0.5) + 'px',\n            marginLeft: (size * -0.5) + 'px',\n            marginTop: (size * -0.5) + 'px'\n          });\n        } else {\n          elem.css({ left: '50%', top: '50%' });\n        }\n        updateElement(elem);\n        $timeout(function () {\n          state.animating = false;\n          updateElement(elem);\n        }, (options.outline ? 450 : 225), false);\n      }, 0, false);\n\n      return elem;\n\n      /**\n       * Creates the ripple element with the provided css\n       *\n       * @param {object} css properties to be applied\n       *\n       * @returns {angular.element} the generated ripple element\n       */\n      function getRippleElement(css) {\n        var elem = angular.element('<div class=\"md-ripple\" data-counter=\"' + counter++ + '\">');\n        ripples.unshift(elem);\n        states.unshift({ animating: true });\n        container.append(elem);\n        css && elem.css(css);\n        return elem;\n      }\n\n      /**\n       * Calculate the ripple size\n       *\n       * @returns {number} calculated ripple diameter\n       */\n      function getRippleSize(left, top) {\n        var width = container.prop('offsetWidth'),\n            height = container.prop('offsetHeight'),\n            multiplier, size, rect;\n        if (options.isMenuItem) {\n          size = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else if (options.outline) {\n          rect = node.getBoundingClientRect();\n          left -= rect.left;\n          top -= rect.top;\n          width = Math.max(left, width - left);\n          height = Math.max(top, height - top);\n          size = 2 * Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n        } else {\n          multiplier = options.isFAB ? 1.1 : 0.8;\n          size = Math.max(width, height) * multiplier;\n        }\n        return size;\n      }\n\n      /**\n       * Generates the ripple css\n       *\n       * @param {number} the diameter of the ripple\n       * @param {number} the left cursor offset\n       * @param {number} the top cursor offset\n       *\n       * @returns {{backgroundColor: *, width: string, height: string, marginLeft: string, marginTop: string}}\n       */\n      function getRippleCss(size, left, top) {\n        var rect,\n            css = {\n              backgroundColor: rgbaToRGB(color),\n              borderColor: rgbaToRGB(color),\n              width: size + 'px',\n              height: size + 'px'\n            };\n\n        if (options.outline) {\n          css.width = 0;\n          css.height = 0;\n        } else {\n          css.marginLeft = css.marginTop = (size * -0.5) + 'px';\n        }\n\n        if (options.center) {\n          css.left = css.top = '50%';\n        } else {\n          rect = node.getBoundingClientRect();\n          css.left = Math.round((left - rect.left) / container.prop('offsetWidth') * 100) + '%';\n          css.top = Math.round((top - rect.top) / container.prop('offsetHeight') * 100) + '%';\n        }\n\n        return css;\n\n        /**\n         * Converts rgba string to rgb, removing the alpha value\n         *\n         * @param {string} rgba color\n         *\n         * @returns {string} rgb color\n         */\n        function rgbaToRGB(color) {\n          return color.replace('rgba', 'rgb').replace(/,[^\\)\\,]+\\)/, ')');\n        }\n      }\n\n      /**\n       * Gets the current ripple container\n       * If there is no ripple container, it creates one and returns it\n       *\n       * @returns {angular.element} ripple container element\n       */\n      function getRippleContainer() {\n        if (rippleContainer) return rippleContainer;\n        var container = angular.element('<div class=\"md-ripple-container\"></div>');\n        rippleContainer = container;\n        element.append(container);\n        return container;\n      }\n    }\n\n    /**\n     * Handles user input start and stop events\n     *\n     * @param {event} event fired by hammer.js\n     */\n    function onInput(ev) {\n      var ripple, index;\n      if (ev.eventType === Hammer.INPUT_START && ev.isFirst && isRippleAllowed()) {\n        ripple = createRipple(ev.center.x, ev.center.y);\n        isHeld = true;\n      } else if (ev.eventType === Hammer.INPUT_END && ev.isFinal) {\n        isHeld = false;\n        index = ripples.length - 1;\n        ripple = ripples[index];\n        $timeout(function () { updateElement(ripple); }, 0, false);\n      }\n\n      /**\n       * Determines if the ripple is allowed\n       *\n       * @returns {boolean} true if the ripple is allowed, false if not\n       */\n      function isRippleAllowed() {\n        var parent = node.parentNode;\n        var grandparent = parent && parent.parentNode;\n        var ancestor = grandparent && grandparent.parentNode;\n        return !isDisabled(node) && !isDisabled(parent) && !isDisabled(grandparent) && !isDisabled(ancestor);\n        function isDisabled (elem) {\n          return elem && elem.hasAttribute && elem.hasAttribute('disabled');\n        }\n      }\n    }\n  }\n}\nInkRippleService.$inject = [\"$window\", \"$timeout\"];\n\n/**\n * noink/nobar/nostretch directive: make any element that has one of\n * these attributes be given a controller, so that other directives can\n * `require:` these and see if there is a `no<xxx>` parent attribute.\n *\n * @usage\n * <hljs lang=\"html\">\n * <parent md-no-ink>\n *   <child detect-no>\n *   </child>\n * </parent>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * myApp.directive('detectNo', function() {\n *   return {\n *     require: ['^?mdNoInk', ^?mdNoBar'],\n *     link: function(scope, element, attr, ctrls) {\n *       var noinkCtrl = ctrls[0];\n *       var nobarCtrl = ctrls[1];\n *       if (noInkCtrl) {\n *         alert(\"the md-no-ink flag has been specified on an ancestor!\");\n *       }\n *       if (nobarCtrl) {\n *         alert(\"the md-no-bar flag has been specified on an ancestor!\");\n *       }\n *     }\n *   };\n * });\n * </hljs>\n */\nfunction attrNoDirective() {\n  return function() {\n    return {\n      controller: angular.noop\n    };\n  };\n}\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core.theming.palette', [])\n.constant('$mdColorPalette', {\n  'red': {\n    '50': '#ffebee',\n    '100': '#ffcdd2',\n    '200': '#ef9a9a',\n    '300': '#e57373',\n    '400': '#ef5350',\n    '500': '#f44336',\n    '600': '#e53935',\n    '700': '#d32f2f',\n    '800': '#c62828',\n    '900': '#b71c1c',\n    'A100': '#ff8a80',\n    'A200': '#ff5252',\n    'A400': '#ff1744',\n    'A700': '#d50000',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100'\n  },\n  'pink': {\n    '50': '#fce4ec',\n    '100': '#f8bbd0',\n    '200': '#f48fb1',\n    '300': '#f06292',\n    '400': '#ec407a',\n    '500': '#e91e63',\n    '600': '#d81b60',\n    '700': '#c2185b',\n    '800': '#ad1457',\n    '900': '#880e4f',\n    'A100': '#ff80ab',\n    'A200': '#ff4081',\n    'A400': '#f50057',\n    'A700': '#c51162',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100'\n  },\n  'purple': {\n    '50': '#f3e5f5',\n    '100': '#e1bee7',\n    '200': '#ce93d8',\n    '300': '#ba68c8',\n    '400': '#ab47bc',\n    '500': '#9c27b0',\n    '600': '#8e24aa',\n    '700': '#7b1fa2',\n    '800': '#6a1b9a',\n    '900': '#4a148c',\n    'A100': '#ea80fc',\n    'A200': '#e040fb',\n    'A400': '#d500f9',\n    'A700': '#aa00ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100'\n  },\n  'deep-purple': {\n    '50': '#ede7f6',\n    '100': '#d1c4e9',\n    '200': '#b39ddb',\n    '300': '#9575cd',\n    '400': '#7e57c2',\n    '500': '#673ab7',\n    '600': '#5e35b1',\n    '700': '#512da8',\n    '800': '#4527a0',\n    '900': '#311b92',\n    'A100': '#b388ff',\n    'A200': '#7c4dff',\n    'A400': '#651fff',\n    'A700': '#6200ea',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100'\n  },\n  'indigo': {\n    '50': '#e8eaf6',\n    '100': '#c5cae9',\n    '200': '#9fa8da',\n    '300': '#7986cb',\n    '400': '#5c6bc0',\n    '500': '#3f51b5',\n    '600': '#3949ab',\n    '700': '#303f9f',\n    '800': '#283593',\n    '900': '#1a237e',\n    'A100': '#8c9eff',\n    'A200': '#536dfe',\n    'A400': '#3d5afe',\n    'A700': '#304ffe',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 A100'\n  },\n  'blue': {\n    '50': '#e3f2fd',\n    '100': '#bbdefb',\n    '200': '#90caf9',\n    '300': '#64b5f6',\n    '400': '#42a5f5',\n    '500': '#2196f3',\n    '600': '#1e88e5',\n    '700': '#1976d2',\n    '800': '#1565c0',\n    '900': '#0d47a1',\n    'A100': '#82b1ff',\n    'A200': '#448aff',\n    'A400': '#2979ff',\n    'A700': '#2962ff',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '100 200 300 400 A100'\n  },\n  'light-blue': {\n    '50': '#e1f5fe',\n    '100': '#b3e5fc',\n    '200': '#81d4fa',\n    '300': '#4fc3f7',\n    '400': '#29b6f6',\n    '500': '#03a9f4',\n    '600': '#039be5',\n    '700': '#0288d1',\n    '800': '#0277bd',\n    '900': '#01579b',\n    'A100': '#80d8ff',\n    'A200': '#40c4ff',\n    'A400': '#00b0ff',\n    'A700': '#0091ea',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900 A700'\n  },\n  'cyan': {\n    '50': '#e0f7fa',\n    '100': '#b2ebf2',\n    '200': '#80deea',\n    '300': '#4dd0e1',\n    '400': '#26c6da',\n    '500': '#00bcd4',\n    '600': '#00acc1',\n    '700': '#0097a7',\n    '800': '#00838f',\n    '900': '#006064',\n    'A100': '#84ffff',\n    'A200': '#18ffff',\n    'A400': '#00e5ff',\n    'A700': '#00b8d4',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900'\n  },\n  'teal': {\n    '50': '#e0f2f1',\n    '100': '#b2dfdb',\n    '200': '#80cbc4',\n    '300': '#4db6ac',\n    '400': '#26a69a',\n    '500': '#009688',\n    '600': '#00897b',\n    '700': '#00796b',\n    '800': '#00695c',\n    '900': '#004d40',\n    'A100': '#a7ffeb',\n    'A200': '#64ffda',\n    'A400': '#1de9b6',\n    'A700': '#00bfa5',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900'\n  },\n  'green': {\n    '50': '#e8f5e9',\n    '100': '#c8e6c9',\n    '200': '#a5d6a7',\n    '300': '#81c784',\n    '400': '#66bb6a',\n    '500': '#4caf50',\n    '600': '#43a047',\n    '700': '#388e3c',\n    '800': '#2e7d32',\n    '900': '#1b5e20',\n    'A100': '#b9f6ca',\n    'A200': '#69f0ae',\n    'A400': '#00e676',\n    'A700': '#00c853',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '500 600 700 800 900'\n  },\n  'light-green': {\n    '50': '#f1f8e9',\n    '100': '#dcedc8',\n    '200': '#c5e1a5',\n    '300': '#aed581',\n    '400': '#9ccc65',\n    '500': '#8bc34a',\n    '600': '#7cb342',\n    '700': '#689f38',\n    '800': '#558b2f',\n    '900': '#33691e',\n    'A100': '#ccff90',\n    'A200': '#b2ff59',\n    'A400': '#76ff03',\n    'A700': '#64dd17',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900'\n  },\n  'lime': {\n    '50': '#f9fbe7',\n    '100': '#f0f4c3',\n    '200': '#e6ee9c',\n    '300': '#dce775',\n    '400': '#d4e157',\n    '500': '#cddc39',\n    '600': '#c0ca33',\n    '700': '#afb42b',\n    '800': '#9e9d24',\n    '900': '#827717',\n    'A100': '#f4ff81',\n    'A200': '#eeff41',\n    'A400': '#c6ff00',\n    'A700': '#aeea00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '900'\n  },\n  'yellow': {\n    '50': '#fffde7',\n    '100': '#fff9c4',\n    '200': '#fff59d',\n    '300': '#fff176',\n    '400': '#ffee58',\n    '500': '#ffeb3b',\n    '600': '#fdd835',\n    '700': '#fbc02d',\n    '800': '#f9a825',\n    '900': '#f57f17',\n    'A100': '#ffff8d',\n    'A200': '#ffff00',\n    'A400': '#ffea00',\n    'A700': '#ffd600',\n    'contrastDefaultColor': 'dark'\n  },\n  'amber': {\n    '50': '#fff8e1',\n    '100': '#ffecb3',\n    '200': '#ffe082',\n    '300': '#ffd54f',\n    '400': '#ffca28',\n    '500': '#ffc107',\n    '600': '#ffb300',\n    '700': '#ffa000',\n    '800': '#ff8f00',\n    '900': '#ff6f00',\n    'A100': '#ffe57f',\n    'A200': '#ffd740',\n    'A400': '#ffc400',\n    'A700': '#ffab00',\n    'contrastDefaultColor': 'dark'\n  },\n  'orange': {\n    '50': '#fff3e0',\n    '100': '#ffe0b2',\n    '200': '#ffcc80',\n    '300': '#ffb74d',\n    '400': '#ffa726',\n    '500': '#ff9800',\n    '600': '#fb8c00',\n    '700': '#f57c00',\n    '800': '#ef6c00',\n    '900': '#e65100',\n    'A100': '#ffd180',\n    'A200': '#ffab40',\n    'A400': '#ff9100',\n    'A700': '#ff6d00',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '800 900'\n  },\n  'deep-orange': {\n    '50': '#fbe9e7',\n    '100': '#ffccbc',\n    '200': '#ffab91',\n    '300': '#ff8a65',\n    '400': '#ff7043',\n    '500': '#ff5722',\n    '600': '#f4511e',\n    '700': '#e64a19',\n    '800': '#d84315',\n    '900': '#bf360c',\n    'A100': '#ff9e80',\n    'A200': '#ff6e40',\n    'A400': '#ff3d00',\n    'A700': '#dd2c00',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300 400 A100 A200'\n  },\n  'brown': {\n    '50': '#efebe9',\n    '100': '#d7ccc8',\n    '200': '#bcaaa4',\n    '300': '#a1887f',\n    '400': '#8d6e63',\n    '500': '#795548',\n    '600': '#6d4c41',\n    '700': '#5d4037',\n    '800': '#4e342e',\n    '900': '#3e2723',\n    'A100': '#d7ccc8',\n    'A200': '#bcaaa4',\n    'A400': '#8d6e63',\n    'A700': '#5d4037',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200'\n  },\n  'grey': {\n    '0': '#ffffff',\n    '50': '#fafafa',\n    '100': '#f5f5f5',\n    '200': '#eeeeee',\n    '300': '#e0e0e0',\n    '400': '#bdbdbd',\n    '500': '#9e9e9e',\n    '600': '#757575',\n    '700': '#616161',\n    '800': '#424242',\n    '900': '#212121',\n    '1000': '#000000',\n    'A100': '#ffffff',\n    'A200': '#eeeeee',\n    'A400': '#bdbdbd',\n    'A700': '#616161',\n    'contrastDefaultColor': 'dark',\n    'contrastLightColors': '600 700 800 900'\n  },\n  'blue-grey': {\n    '50': '#eceff1',\n    '100': '#cfd8dc',\n    '200': '#b0bec5',\n    '300': '#90a4ae',\n    '400': '#78909c',\n    '500': '#607d8b',\n    '600': '#546e7a',\n    '700': '#455a64',\n    '800': '#37474f',\n    '900': '#263238',\n    'A100': '#cfd8dc',\n    'A200': '#b0bec5',\n    'A400': '#78909c',\n    'A700': '#455a64',\n    'contrastDefaultColor': 'light',\n    'contrastDarkColors': '50 100 200 300'\n  }\n});\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.core.theming', ['material.core.theming.palette'])\n  .directive('mdTheme', ThemingDirective)\n  .directive('mdThemable', ThemableDirective)\n  .provider('$mdTheming', ThemingProvider)\n  .run(generateThemes);\n\n/**\n * @ngdoc provider\n * @name $mdThemingProvider\n * @module material.core\n *\n * @description Provider to configure the `$mdTheming` service.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#setDefaultTheme\n * @param {string} themeName Default theme name to be applied to elements. Default value is `default`.\n */\n\n/**\n * @ngdoc method\n * @name $mdThemingProvider#alwaysWatchTheme\n * @param {boolean} watch Whether or not to always watch themes for changes and re-apply\n * classes when they change. Default is `false`. Enabling can reduce performance.\n */\n\n// In memory storage of defined themes and color palettes (both loaded by CSS, and user specified)\nvar PALETTES;\nvar THEMES;\nvar themingProvider;\nvar generationIsDone;\n\nvar DARK_FOREGROUND = {\n  name: 'dark',\n  '1': 'rgba(0,0,0,0.87)',\n  '2': 'rgba(0,0,0,0.54)',\n  '3': 'rgba(0,0,0,0.26)',\n  '4': 'rgba(0,0,0,0.12)'\n};\nvar LIGHT_FOREGROUND = {\n  name: 'light',\n  '1': 'rgba(255,255,255,1.0)',\n  '2': 'rgba(255,255,255,0.7)',\n  '3': 'rgba(255,255,255,0.3)',\n  '4': 'rgba(255,255,255,0.12)'\n};\n\nvar DARK_SHADOW = '1px 1px 0px rgba(0,0,0,0.4), -1px -1px 0px rgba(0,0,0,0.4)';\nvar LIGHT_SHADOW = '';\n\nvar DARK_CONTRAST_COLOR = colorToRgbaArray('rgba(0,0,0,0.87)');\nvar LIGHT_CONTRAST_COLOR = colorToRgbaArray('rgb(255,255,255)');\n\nvar THEME_COLOR_TYPES = ['primary', 'accent', 'warn', 'background'];\nvar DEFAULT_COLOR_TYPE = 'primary';\n\n// A color in a theme will use these hues by default, if not specified by user.\nvar LIGHT_DEFAULT_HUES = {\n  'accent': {\n    'default': 'A700',\n    'hue-1': 'A200',\n    'hue-2': 'A400',\n    'hue-3': 'A100'\n  }\n};\nvar DARK_DEFAULT_HUES = {\n  'background': {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '600',\n    'hue-3': '800'\n  }\n};\nTHEME_COLOR_TYPES.forEach(function(colorType) {\n  // Color types with unspecified default hues will use these default hue values\n  var defaultDefaultHues = {\n    'default': '500',\n    'hue-1': '300',\n    'hue-2': '800',\n    'hue-3': 'A100'\n  };\n  if (!LIGHT_DEFAULT_HUES[colorType]) LIGHT_DEFAULT_HUES[colorType] = defaultDefaultHues;\n  if (!DARK_DEFAULT_HUES[colorType]) DARK_DEFAULT_HUES[colorType] = defaultDefaultHues;\n});\n\nvar VALID_HUE_VALUES = [\n  '50', '100', '200', '300', '400', '500', '600',\n  '700', '800', '900', 'A100', 'A200', 'A400', 'A700'\n];\n\nfunction ThemingProvider($mdColorPalette) {\n  PALETTES = {};\n  THEMES = {};\n  var defaultTheme = 'default';\n  var alwaysWatchTheme = false;\n\n  // Load JS Defined Palettes\n  angular.extend(PALETTES, $mdColorPalette);\n\n  // Default theme defined in core.js\n\n  ThemingService.$inject = [\"$rootScope\"];\n  return themingProvider = {\n    definePalette: definePalette,\n    extendPalette: extendPalette,\n    theme: registerTheme,\n\n    setDefaultTheme: function(theme) {\n      defaultTheme = theme;\n    },\n    alwaysWatchTheme: function(alwaysWatch) {\n      alwaysWatchTheme = alwaysWatch;\n    },\n    $get: ThemingService,\n    _LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,\n    _DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,\n    _PALETTES: PALETTES,\n    _THEMES: THEMES,\n    _parseRules: parseRules,\n    _rgba: rgba\n  };\n\n  // Example: $mdThemingProvider.definePalette('neonRed', { 50: '#f5fafa', ... });\n  function definePalette(name, map) {\n    map = map || {};\n    PALETTES[name] = checkPaletteValid(name, map);\n    return themingProvider;\n  }\n\n  // Returns an new object which is a copy of a given palette `name` with variables from\n  // `map` overwritten\n  // Example: var neonRedMap = $mdThemingProvider.extendPalette('red', { 50: '#f5fafafa' });\n  function extendPalette(name, map) {\n    return checkPaletteValid(name,  angular.extend({}, PALETTES[name] || {}, map) );\n  }\n\n  // Make sure that palette has all required hues\n  function checkPaletteValid(name, map) {\n    var missingColors = VALID_HUE_VALUES.filter(function(field) {\n      return !map[field];\n    });\n    if (missingColors.length) {\n      throw new Error(\"Missing colors %1 in palette %2!\"\n                      .replace('%1', missingColors.join(', '))\n                      .replace('%2', name));\n    }\n\n    return map;\n  }\n\n  // Register a theme (which is a collection of color palettes to use with various states\n  // ie. warn, accent, primary )\n  // Optionally inherit from an existing theme\n  // $mdThemingProvider.theme('custom-theme').primaryColor('red');\n  function registerTheme(name, inheritFrom) {\n    inheritFrom = inheritFrom || 'default';\n    if (THEMES[name]) return THEMES[name];\n\n    var parentTheme = typeof inheritFrom === 'string' ? THEMES[inheritFrom] : inheritFrom;\n    var theme = new Theme(name);\n\n    if (parentTheme) {\n      angular.forEach(parentTheme.colors, function(color, colorType) {\n        theme.colors[colorType] = {\n          name: color.name,\n          // Make sure a COPY of the hues is given to the child color,\n          // not the same reference.\n          hues: angular.extend({}, color.hues)\n        };\n      });\n    }\n    THEMES[name] = theme;\n\n    return theme;\n  }\n\n  function Theme(name) {\n    var self = this;\n    self.name = name;\n    self.colors = {};\n\n    self.dark = setDark;\n    setDark(false);\n\n    function setDark(isDark) {\n      isDark = arguments.length === 0 ? true : !!isDark;\n\n      // If no change, abort\n      if (isDark === self.isDark) return;\n\n      self.isDark = isDark;\n\n      self.foregroundPalette = self.isDark ? LIGHT_FOREGROUND : DARK_FOREGROUND;\n      self.foregroundShadow = self.isDark ? DARK_SHADOW : LIGHT_SHADOW;\n      \n      // Light and dark themes have different default hues.\n      // Go through each existing color type for this theme, and for every\n      // hue value that is still the default hue value from the previous light/dark setting,\n      // set it to the default hue value from the new light/dark setting.\n      var newDefaultHues = self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES;\n      var oldDefaultHues = self.isDark ? LIGHT_DEFAULT_HUES : DARK_DEFAULT_HUES;\n      angular.forEach(newDefaultHues, function(newDefaults, colorType) {\n        var color = self.colors[colorType];\n        var oldDefaults = oldDefaultHues[colorType];\n        if (color) {\n          for (var hueName in color.hues) {\n            if (color.hues[hueName] === oldDefaults[hueName]) {\n              color.hues[hueName] = newDefaults[hueName];\n            }\n          }\n        }\n      });\n\n      return self;\n    }\n\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      var defaultHues = (self.isDark ? DARK_DEFAULT_HUES : LIGHT_DEFAULT_HUES)[colorType];\n      self[colorType + 'Color'] = function setColorType(paletteName, hues) {\n        var color = self.colors[colorType] = {\n          name: paletteName,\n          hues: angular.extend({}, defaultHues, hues)\n        };\n\n        Object.keys(color.hues).forEach(function(name) {\n          if (!defaultHues[name]) {\n            throw new Error(\"Invalid hue name '%1' in theme %2's %3 color %4. Available hue names: %4\"\n              .replace('%1', name)\n              .replace('%2', self.name)\n              .replace('%3', paletteName)\n              .replace('%4', Object.keys(defaultHues).join(', '))\n            );\n          }\n        });\n        Object.keys(color.hues).map(function(key) {\n          return color.hues[key];\n        }).forEach(function(hueValue) {\n          if (VALID_HUE_VALUES.indexOf(hueValue) == -1) {\n            throw new Error(\"Invalid hue value '%1' in theme %2's %3 color %4. Available hue values: %5\"\n              .replace('%1', hueValue)\n              .replace('%2', self.name)\n              .replace('%3', colorType)\n              .replace('%4', paletteName)\n              .replace('%5', VALID_HUE_VALUES.join(', '))\n            );\n          }\n        });\n\n        return self;\n      };\n    });\n  }\n\n  /**\n   * @ngdoc service\n   * @name $mdTheming\n   *\n   * @description\n   *\n   * Service that makes an element apply theming related classes to itself.\n   *\n   * ```js\n   * app.directive('myFancyDirective', function($mdTheming) {\n   *   return {\n   *     restrict: 'e',\n   *     link: function(scope, el, attrs) {\n   *       $mdTheming(el);\n   *     }\n   *   };\n   * });\n   * ```\n   * @param {el=} element to apply theming to\n   */\n  /* @ngInject */\n  function ThemingService($rootScope) {\n    applyTheme.inherit = function(el, parent) {\n      var ctrl = parent.controller('mdTheme');\n\n      var attrThemeValue = el.attr('md-theme-watch');\n      if ( (alwaysWatchTheme || angular.isDefined(attrThemeValue)) && attrThemeValue != 'false') {\n        var deregisterWatch = $rootScope.$watch(function() {\n          return ctrl && ctrl.$mdTheme || defaultTheme;\n        }, changeTheme);\n        el.on('$destroy', deregisterWatch);\n      } else {\n        var theme = ctrl && ctrl.$mdTheme || defaultTheme;\n        changeTheme(theme);\n      }\n\n      function changeTheme(theme) {\n        var oldTheme = el.data('$mdThemeName');\n        if (oldTheme) el.removeClass('md-' + oldTheme +'-theme');\n        el.addClass('md-' + theme + '-theme');\n        el.data('$mdThemeName', theme);\n      }\n    };\n\n    return applyTheme;\n\n    function applyTheme(scope, el) {\n      // Allow us to be invoked via a linking function signature.\n      if (el === undefined) {\n        el = scope;\n        scope = undefined;\n      }\n      if (scope === undefined) {\n        scope = $rootScope;\n      }\n      applyTheme.inherit(el, el);\n    }\n  }\n}\nThemingProvider.$inject = [\"$mdColorPalette\"];\n\nfunction ThemingDirective($interpolate) {\n  return {\n    priority: 100,\n    link: {\n      pre: function(scope, el, attrs) {\n        var ctrl = {\n          $setTheme: function(theme) {\n            ctrl.$mdTheme = theme;\n          }\n        };\n        el.data('$mdThemeController', ctrl);\n        ctrl.$setTheme($interpolate(attrs.mdTheme)(scope));\n        attrs.$observe('mdTheme', ctrl.$setTheme);\n      }\n    }\n  };\n}\nThemingDirective.$inject = [\"$interpolate\"];\n\nfunction ThemableDirective($mdTheming) {\n  return $mdTheming;\n}\nThemableDirective.$inject = [\"$mdTheming\"];\n\nfunction parseRules(theme, colorType, rules) {\n  checkValidPalette(theme, colorType);\n\n  rules = rules.replace(/THEME_NAME/g, theme.name);\n  var generatedRules = [];\n  var color = theme.colors[colorType];\n\n  var themeNameRegex = new RegExp('.md-' + theme.name + '-theme', 'g');\n  // Matches '{{ primary-color }}', etc\n  var hueRegex = new RegExp('(\\'|\")?{{\\\\s*(' + colorType + ')-(color|contrast)-?(\\\\d\\\\.?\\\\d*)?\\\\s*}}(\\\"|\\')?','g');\n  var simpleVariableRegex = /'?\"?\\{\\{\\s*([a-zA-Z]+)-(A?\\d+|hue\\-[0-3]|shadow)-?(\\d\\.?\\d*)?\\s*\\}\\}'?\"?/g;\n  var palette = PALETTES[color.name];\n\n  // find and replace simple variables where we use a specific hue, not angentire palette\n  // eg. \"{{primary-100}}\"\n  //\\(' + THEME_COLOR_TYPES.join('\\|') + '\\)'\n  rules = rules.replace(simpleVariableRegex, function(match, colorType, hue, opacity) {\n    if (colorType === 'foreground') {\n      if (hue == 'shadow') {\n        return theme.foregroundShadow;\n      } else {\n        return theme.foregroundPalette[hue] || theme.foregroundPalette['1'];\n      }\n    }\n    if (hue.indexOf('hue') === 0) {\n      hue = theme.colors[colorType].hues[hue];\n    }\n    return rgba( (PALETTES[ theme.colors[colorType].name ][hue] || '').value, opacity );\n  });\n\n  // For each type, generate rules for each hue (ie. default, md-hue-1, md-hue-2, md-hue-3)\n  angular.forEach(color.hues, function(hueValue, hueName) {\n    var newRule = rules\n      .replace(hueRegex, function(match, _, colorType, hueType, opacity) {\n        return rgba(palette[hueValue][hueType === 'color' ? 'value' : 'contrast'], opacity);\n      });\n    if (hueName !== 'default') {\n      newRule = newRule.replace(themeNameRegex, '.md-' + theme.name + '-theme.md-' + hueName);\n    }\n    generatedRules.push(newRule);\n  });\n\n  return generatedRules.join('');\n}\n\n// Generate our themes at run time given the state of THEMES and PALETTES\nfunction generateThemes($injector) {\n  var themeCss = $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';\n\n  // MD_THEME_CSS is a string generated by the build process that includes all the themable\n  // components as templates\n\n  // Expose contrast colors for palettes to ensure that text is always readable\n  angular.forEach(PALETTES, sanitizePalette);\n\n  // Break the CSS into individual rules\n  var rules = themeCss.split(/\\}(?!(\\}|'|\"|;))/)\n    .filter(function(rule) { return rule && rule.length; })\n    .map(function(rule) { return rule.trim() + '}'; });\n\n  var rulesByType = {};\n  THEME_COLOR_TYPES.forEach(function(type) {\n    rulesByType[type] = '';\n  });\n  var ruleMatchRegex = new RegExp('md-(' + THEME_COLOR_TYPES.join('|') + ')', 'g');\n\n  // Sort the rules based on type, allowing us to do color substitution on a per-type basis\n  rules.forEach(function(rule) {\n    var match = rule.match(ruleMatchRegex);\n    // First: test that if the rule has '.md-accent', it goes into the accent set of rules\n    for (var i = 0, type; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf('.md-' + type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // If no eg 'md-accent' class is found, try to just find 'accent' in the rule and guess from\n    // there\n    for (i = 0; type = THEME_COLOR_TYPES[i]; i++) {\n      if (rule.indexOf(type) > -1) {\n        return rulesByType[type] += rule;\n      }\n    }\n\n    // Default to the primary array\n    return rulesByType[DEFAULT_COLOR_TYPE] += rule;\n  });\n\n  var styleString = '';\n\n  // For each theme, use the color palettes specified for `primary`, `warn` and `accent`\n  // to generate CSS rules.\n  angular.forEach(THEMES, function(theme) {\n    THEME_COLOR_TYPES.forEach(function(colorType) {\n      styleString += parseRules(theme, colorType, rulesByType[colorType] + '');\n    });\n  });\n\n  // Insert our newly minted styles into the DOM\n  if (!generationIsDone) {\n    var style = document.createElement('style');\n    style.innerHTML = styleString;\n    var head = document.getElementsByTagName('head')[0];\n    head.insertBefore(style, head.firstElementChild);\n    generationIsDone = true;\n  }\n\n  // The user specifies a 'default' contrast color as either light or dark,\n  // then explicitly lists which hues are the opposite contrast (eg. A100 has dark, A200 has light)\n  function sanitizePalette(palette) {\n    var defaultContrast = palette.contrastDefaultColor;\n    var lightColors = palette.contrastLightColors || [];\n    var darkColors = palette.contrastDarkColors || [];\n\n    // Sass provides these colors as space-separated lists\n    if (typeof lightColors === 'string') lightColors = lightColors.split(' ');\n    if (typeof darkColors === 'string') darkColors = darkColors.split(' ');\n\n    // Cleanup after ourselves\n    delete palette.contrastDefaultColor;\n    delete palette.contrastLightColors;\n    delete palette.contrastDarkColors;\n\n    // Change { 'A100': '#fffeee' } to { 'A100': { value: '#fffeee', contrast:DARK_CONTRAST_COLOR }\n    angular.forEach(palette, function(hueValue, hueName) {\n      if (angular.isObject(hueValue)) return; // Already converted\n      // Map everything to rgb colors\n      var rgbValue = colorToRgbaArray(hueValue);\n      if (!rgbValue) {\n        throw new Error(\"Color %1, in palette %2's hue %3, is invalid. Hex or rgb(a) color expected.\"\n                        .replace('%1', hueValue)\n                        .replace('%2', palette.name)\n                        .replace('%3', hueName));\n      }\n\n      palette[hueName] = {\n        value: rgbValue,\n        contrast: getContrastColor()\n      };\n      function getContrastColor() {\n        if (defaultContrast === 'light') {\n          return darkColors.indexOf(hueName) > -1 ? DARK_CONTRAST_COLOR : LIGHT_CONTRAST_COLOR;\n        } else {\n          return lightColors.indexOf(hueName) > -1 ? LIGHT_CONTRAST_COLOR : DARK_CONTRAST_COLOR;\n        }\n      }\n    });\n  }\n\n}\ngenerateThemes.$inject = [\"$injector\"];\n\nfunction checkValidPalette(theme, colorType) {\n  // If theme attempts to use a palette that doesnt exist, throw error\n  if (!PALETTES[ (theme.colors[colorType] || {}).name ]) {\n    throw new Error(\n      \"You supplied an invalid color palette for theme %1's %2 palette. Available palettes: %3\"\n                    .replace('%1', theme.name)\n                    .replace('%2', colorType)\n                    .replace('%3', Object.keys(PALETTES).join(', '))\n    );\n  }\n}\n\nfunction colorToRgbaArray(clr) {\n  if (angular.isArray(clr) && clr.length == 3) return clr;\n  if (/^rgb/.test(clr)) {\n    return clr.replace(/(^\\s*rgba?\\(|\\)\\s*$)/g, '').split(',').map(function(value) {\n      return parseInt(value, 10);\n    });\n  }\n  if (clr.charAt(0) == '#') clr = clr.substring(1);\n  if (!/^([a-fA-F0-9]{3}){1,2}$/g.test(clr)) return;\n\n  var dig = clr.length / 3;\n  var red = clr.substr(0, dig);\n  var grn = clr.substr(dig, dig);\n  var blu = clr.substr(dig * 2);\n  if (dig === 1) {\n    red += red;\n    grn += grn;\n    blu += blu;\n  }\n  return [parseInt(red, 16), parseInt(grn, 16), parseInt(blu, 16)];\n}\n\nfunction rgba(rgbArray, opacity) {\n  if (rgbArray.length == 4) opacity = rgbArray.pop();\n  return opacity && opacity.length ?\n    'rgba(' + rgbArray.join(',') + ',' + opacity + ')' :\n    'rgb(' + rgbArray.join(',') + ')';\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/core/default-theme.js",
    "content": "angular.module(\"material.core\").constant(\"$MD_THEME_CSS\", \"md-autocomplete {  background: '{{background-50}}'; }  md-autocomplete button md-icon path {    fill: '{{background-600}}'; }  md-autocomplete button:after {    background: '{{background-600-0.3}}'; }  md-autocomplete ul {    background: '{{background-50}}'; }    md-autocomplete ul li {      border-top: 1px solid '{{background-400}}';      color: '{{background-900}}'; }      md-autocomplete ul li .highlight {        color: '{{background-600}}'; }      md-autocomplete ul li:hover, md-autocomplete ul li.selected {        background: '{{background-200}}'; }md-backdrop.md-opaque.md-THEME_NAME-theme {  background-color: '{{foreground-4-0.5}}'; }md-bottom-sheet.md-THEME_NAME-theme {  background-color: '{{background-50}}';  border-top-color: '{{background-300}}'; }  md-bottom-sheet.md-THEME_NAME-theme.md-list md-item {    color: '{{foreground-1}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    background-color: '{{background-50}}'; }  md-bottom-sheet.md-THEME_NAME-theme .md-subheader {    color: '{{foreground-1}}'; }md-card.md-THEME_NAME-theme {  border-radius: 2px; }  md-card.md-THEME_NAME-theme .md-card-image {    border-radius: 2px 2px 0 0; }md-toolbar .md-button.md-THEME_NAME-theme.md-fab {  background-color: white; }.md-button.md-THEME_NAME-theme {  border-radius: 3px; }  .md-button.md-THEME_NAME-theme:not([disabled]):hover, .md-button.md-THEME_NAME-theme:not([disabled]):focus {    background-color: '{{background-500-0.2}}'; }  .md-button.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }    .md-button.md-THEME_NAME-theme.md-primary.md-raised, .md-button.md-THEME_NAME-theme.md-primary.md-fab {      color: '{{primary-contrast}}';      background-color: '{{primary-color}}'; }      .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-primary.md-fab:not([disabled]):focus {        background-color: '{{primary-600}}'; }  .md-button.md-THEME_NAME-theme.md-fab {    border-radius: 50%;    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }    .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-fab:not([disabled]):focus {      background-color: '{{accent-A700}}'; }  .md-button.md-THEME_NAME-theme.md-raised {    color: '{{background-contrast}}';    background-color: '{{background-50}}'; }    .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-raised:not([disabled]):focus {      background-color: '{{background-200}}'; }  .md-button.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }    .md-button.md-THEME_NAME-theme.md-warn.md-raised, .md-button.md-THEME_NAME-theme.md-warn.md-fab {      color: '{{warn-contrast}}';      background-color: '{{warn-color}}'; }      .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-warn.md-fab:not([disabled]):focus {        background-color: '{{warn-700}}'; }  .md-button.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }    .md-button.md-THEME_NAME-theme.md-accent.md-raised, .md-button.md-THEME_NAME-theme.md-accent.md-fab {      color: '{{accent-contrast}}';      background-color: '{{accent-color}}'; }      .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-raised:not([disabled]):focus, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):hover, .md-button.md-THEME_NAME-theme.md-accent.md-fab:not([disabled]):focus {        background-color: '{{accent-700}}'; }  .md-button.md-THEME_NAME-theme[disabled], .md-button.md-THEME_NAME-theme.md-raised[disabled], .md-button.md-THEME_NAME-theme.md-fab[disabled] {    color: '{{foreground-3}}';    background-color: transparent;    cursor: not-allowed; }md-checkbox.md-THEME_NAME-theme .md-ripple {  color: '{{accent-600}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon {  background-color: '{{accent-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-ripple {  color: '{{primary-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ripple {  color: '{{background-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon {  background-color: '{{primary-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-ripple {  color: '{{warn-600}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn .md-icon {  border-color: '{{foreground-2}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon {  background-color: '{{warn-color-0.87}}'; }md-checkbox.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-icon:after {  border-color: '{{background-200}}'; }md-checkbox.md-THEME_NAME-theme[disabled] .md-icon {  border-color: '{{foreground-3}}'; }md-checkbox.md-THEME_NAME-theme[disabled].md-checked .md-icon {  background-color: '{{foreground-3}}'; }md-content.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-dialog.md-THEME_NAME-theme {  border-radius: 4px;  background-color: '{{background-hue-3}}'; }  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {    border-top-color: '{{foreground-4}}'; }md-divider.md-THEME_NAME-theme {  border-top-color: '{{foreground-4}}'; }md-icon.md-THEME_NAME-theme.md-primary {  color: '{{primary-color}}'; }md-icon.md-THEME_NAME-theme.md-accent {  color: '{{accent-color}}'; }md-icon.md-THEME_NAME-theme.md-warn {  color: '{{warn-color}}'; }md-icon.md-THEME_NAME-theme.md-danger {  color: '{{danger-color}}'; }md-input-container.md-THEME_NAME-theme .md-input {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}';  text-shadow: '{{foreground-shadow}}'; }  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme label, md-input-container.md-THEME_NAME-theme .md-placeholder {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {  color: '{{foreground-2}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {  border-color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {  color: '{{primary-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {  border-color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {  border-color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid label {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {  color: '{{warn-500}}'; }md-input-container.md-THEME_NAME-theme .md-input[disabled], [disabled] md-input-container.md-THEME_NAME-theme .md-input {  border-bottom-color: transparent;  color: '{{foreground-3}}';  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);  background-image: -ms-linear-gradient(left, transparent 0%, '{{foreground-4}}' 100%); }md-progress-circular.md-THEME_NAME-theme {  background-color: transparent; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {    border-top-color: '{{primary-color}}';    border-bottom-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-top-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {    border-right-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {    border-left-color: '{{primary-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {    border-top-color: '{{warn-color}}';    border-bottom-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-top-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {    border-right-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {    border-left-color: '{{warn-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {    border-top-color: '{{accent-color}}';    border-bottom-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-top-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {    border-right-color: '{{accent-color}}'; }  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {    border-left-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme .md-container {  background-color: '{{primary-100}}'; }md-progress-linear.md-THEME_NAME-theme .md-bar {  background-color: '{{primary-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-container {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {  background-color: '{{warn-color}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-container {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {  background-color: '{{accent-color}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {  background-color: '{{warn-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {  background-color: '{{accent-100}}'; }md-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }md-radio-button.md-THEME_NAME-theme .md-off {  border-color: '{{foreground-2}}'; }md-radio-button.md-THEME_NAME-theme .md-on {  background-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-off {  border-color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {  color: '{{accent-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme .md-container .md-ripple {  color: '{{accent-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-on {  background-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-off {  border-color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary.md-checked .md-ink-ripple {  color: '{{primary-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-primary .md-container .md-ripple {  color: '{{primary-600}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {  background-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {  border-color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {  color: '{{warn-color-0.87}}'; }md-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {  color: '{{warn-600}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {  border-color: '{{foreground-3}}'; }md-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {  border-color: '{{foreground-3}}'; }md-radio-group.md-THEME_NAME-theme:focus:not(:empty) {  border-color: '{{foreground-1}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label {  border-bottom-color: '{{primary-color}}';  color: '{{ foreground-1 }}'; }  md-select.md-THEME_NAME-theme:not([disabled]):focus .md-select-label.md-placeholder {    color: '{{ foreground-1 }}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-accent .md-select-label {  border-bottom-color: '{{accent-color}}'; }md-select.md-THEME_NAME-theme:not([disabled]):focus.md-warn .md-select-label {  border-bottom-color: '{{warn-color}}'; }md-select.md-THEME_NAME-theme[disabled] .md-select-label {  color: '{{foreground-3}}'; }  md-select.md-THEME_NAME-theme[disabled] .md-select-label.md-placeholder {    color: '{{foreground-3}}'; }md-select.md-THEME_NAME-theme .md-select-label {  border-bottom-color: '{{foreground-4}}'; }  md-select.md-THEME_NAME-theme .md-select-label.md-placeholder {    color: '{{foreground-2}}'; }md-select-menu.md-THEME_NAME-theme md-optgroup {  color: '{{foreground-2}}'; }  md-select-menu.md-THEME_NAME-theme md-optgroup md-option {    color: '{{foreground-1}}'; }md-select-menu.md-THEME_NAME-theme md-option[selected] {  background-color: '{{primary-50}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected]:focus {    background-color: '{{primary-100}}'; }  md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent {    background-color: '{{accent-50}}'; }    md-select-menu.md-THEME_NAME-theme md-option[selected].md-accent:focus {      background-color: '{{accent-100}}'; }md-select-menu.md-THEME_NAME-theme md-option:focus:not([selected]) {  background: '{{background-200}}'; }md-sidenav.md-THEME_NAME-theme {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track {  background-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme .md-track-ticks {  background-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-focus-thumb {  background-color: '{{foreground-2}}'; }md-slider.md-THEME_NAME-theme .md-focus-ring {  border-color: '{{foreground-4}}'; }md-slider.md-THEME_NAME-theme .md-disabled-thumb {  border-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme.md-min .md-thumb:after {  background-color: '{{background-hue-3}}'; }md-slider.md-THEME_NAME-theme .md-track.md-track-fill {  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb:after {  border-color: '{{accent-color}}';  background-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-sign {  background-color: '{{accent-color}}'; }  md-slider.md-THEME_NAME-theme .md-sign:after {    border-top-color: '{{accent-color}}'; }md-slider.md-THEME_NAME-theme .md-thumb-text {  color: '{{accent-contrast}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-track.md-track-fill {  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {  border-color: '{{warn-color}}';  background-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-sign {  background-color: '{{warn-color}}'; }  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {    border-top-color: '{{warn-color}}'; }md-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {  color: '{{warn-contrast}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-track.md-track-fill {  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb:after {  border-color: '{{primary-color}}';  background-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-sign {  background-color: '{{primary-color}}'; }  md-slider.md-THEME_NAME-theme.md-primary .md-sign:after {    border-top-color: '{{primary-color}}'; }md-slider.md-THEME_NAME-theme.md-primary .md-thumb-text {  color: '{{primary-contrast}}'; }md-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {  border-color: '{{foreground-3}}'; }md-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {  background-color: '{{foreground-3}}'; }.md-subheader.md-THEME_NAME-theme {  color: '{{ foreground-2-0.23 }}';  background-color: '{{background-hue-3}}'; }  .md-subheader.md-THEME_NAME-theme.md-primary {    color: '{{primary-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-accent {    color: '{{accent-color}}'; }  .md-subheader.md-THEME_NAME-theme.md-warn {    color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme .md-thumb {  background-color: '{{background-50}}'; }md-switch.md-THEME_NAME-theme .md-bar {  background-color: '{{background-500}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-thumb {  background-color: '{{accent-color}}'; }md-switch.md-THEME_NAME-theme.md-checked .md-bar {  background-color: '{{accent-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-thumb {  background-color: '{{primary-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-primary .md-bar {  background-color: '{{primary-color-0.5}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {  background-color: '{{warn-color}}'; }md-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {  background-color: '{{warn-color-0.5}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-thumb {  background-color: '{{background-400}}'; }md-switch.md-THEME_NAME-theme[disabled] .md-bar {  background-color: '{{foreground-4}}'; }md-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {  border-color: '{{foreground-1}}';  border-style: dotted; }md-tabs.md-THEME_NAME-theme .md-header {  background-color: transparent; }md-tabs.md-THEME_NAME-theme .md-paginator md-icon {  color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent .md-header {  background-color: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {  color: '{{accent-100}}'; }  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {    color: '{{accent-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary .md-header {  background-color: '{{primary-color}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]) {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:not([disabled]).active {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-primary md-tab {  color: '{{primary-100}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab:focus {    color: '{{primary-contrast}}';    background-color: '{{primary-contrast-0.1}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab.active {    color: '{{primary-contrast}}'; }  md-tabs.md-THEME_NAME-theme.md-primary md-tab .md-ripple-container {    color: '{{primary-contrast}}'; }md-tabs.md-THEME_NAME-theme.md-warn .md-header {  background-color: '{{warn-color}}'; }md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {  color: '{{warn-100}}'; }  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {    color: '{{warn-contrast}}'; }md-tabs.md-THEME_NAME-theme md-tabs-ink-bar {  color: '{{accent-color}}';  background: '{{accent-color}}'; }md-tabs.md-THEME_NAME-theme md-tab {  color: '{{foreground-2}}'; }  md-tabs.md-THEME_NAME-theme md-tab[disabled] {    color: '{{foreground-3}}'; }  md-tabs.md-THEME_NAME-theme md-tab:focus {    color: '{{foreground-1}}'; }  md-tabs.md-THEME_NAME-theme md-tab.active {    color: '{{primary-color}}'; }  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {    color: '{{accent-100}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  text-shadow: '{{foreground-shadow}}'; }  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {    color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme label {  text-shadow: '{{foreground-shadow}}';  color: '{{foreground-3}}'; }md-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {  color: '{{foreground-1}}';  border-color: '{{foreground-4}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {  border-color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused label {  color: '{{primary-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {  border-color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {  color: '{{accent-500}}'; }md-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {  color: '{{foreground-2}}'; }md-input-group.md-THEME_NAME-theme .md-input[disabled] {  border-bottom-color: '{{foreground-4}}';  color: '{{foreground-3}}'; }md-toast.md-THEME_NAME-theme {  background-color: '{{foreground-1}}';  color: '{{background-50}}'; }  md-toast.md-THEME_NAME-theme .md-button {    color: '{{background-50}}'; }    md-toast.md-THEME_NAME-theme .md-button.md-highlight {      color: '{{primary-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-accent {        color: '{{accent-A200}}'; }      md-toast.md-THEME_NAME-theme .md-button.md-highlight.md-warn {        color: '{{warn-A200}}'; }md-toolbar.md-THEME_NAME-theme {  background-color: '{{primary-color}}';  color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme .md-button {    color: '{{primary-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-accent {    background-color: '{{accent-color}}';    color: '{{accent-contrast}}'; }  md-toolbar.md-THEME_NAME-theme.md-warn {    background-color: '{{warn-color}}';    color: '{{warn-contrast}}'; }md-tooltip.md-THEME_NAME-theme {  color: '{{background-A100}}'; }  md-tooltip.md-THEME_NAME-theme .md-background {    background-color: '{{foreground-2}}'; }\");"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/dialog/bower.json",
    "content": "{\n  \"name\": \"angular-material-dialog\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-backdrop\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/dialog/dialog-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-dialog.md-THEME_NAME-theme {\n  border-radius: 4px;\n  background-color: '{{background-hue-3}}'; }\n  md-dialog.md-THEME_NAME-theme.md-content-overflow .md-actions {\n    border-top-color: '{{foreground-4}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/dialog/dialog.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n.md-dialog-container {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 80; }\n\nmd-dialog {\n  opacity: 0;\n  min-width: 240px;\n  max-width: 80%;\n  max-height: 80%;\n  position: relative;\n  overflow: hidden;\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-dialog.transition-in {\n    opacity: 1;\n    -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0) scale(1);\n            transform: translate3d(0, 0, 0) scale(1); }\n  md-dialog.transition-out {\n    -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    -webkit-transform: translate3d(0, 100%, 0) scale(0.2);\n            transform: translate3d(0, 100%, 0) scale(0.2); }\n  md-dialog md-content {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    padding: 24px;\n    overflow: auto;\n    -webkit-overflow-scrolling: touch; }\n    md-dialog md-content:not([layout=row]) *:first-child {\n      margin-top: 0px; }\n  md-dialog .md-actions {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    box-sizing: border-box;\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-box-pack: end;\n    -webkit-justify-content: flex-end;\n        -ms-flex-pack: end;\n            justify-content: flex-end;\n    padding: 16px 16px;\n    min-height: 40px; }\n    md-dialog .md-actions > * {\n      margin-left: 8px; }\n  md-dialog.md-content-overflow .md-actions {\n    border-top: 1px solid; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/dialog/dialog.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.dialog\n */\nangular.module('material.components.dialog', [\n  'material.core',\n  'material.components.backdrop'\n])\n  .directive('mdDialog', MdDialogDirective)\n  .provider('$mdDialog', MdDialogProvider);\n\nfunction MdDialogDirective($$rAF, $mdTheming) {\n  return {\n    restrict: 'E',\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n      $$rAF(function() {\n        var content = element[0].querySelector('md-content');\n        if (content && content.scrollHeight > content.clientHeight) {\n          element.addClass('md-content-overflow');\n        }\n      });\n    }\n  };\n}\nMdDialogDirective.$inject = [\"$$rAF\", \"$mdTheming\"];\n\n/**\n * @ngdoc service\n * @name $mdDialog\n * @module material.components.dialog\n *\n * @description\n * `$mdDialog` opens a dialog over the app and provides a simple promise API.\n *\n * ### Restrictions\n *\n * - The dialog is always given an isolate scope.\n * - The dialog's template must have an outer `<md-dialog>` element.\n *   Inside, use an `<md-content>` element for the dialog's content, and use\n *   an element with class `md-actions` for the dialog's actions.\n *\n * @usage\n * ##### HTML\n *\n * <hljs lang=\"html\">\n * <div  ng-app=\"demoApp\" ng-controller=\"EmployeeController\">\n *   <md-button ng-click=\"showAlert()\" class=\"md-raised md-warn\">\n *     Employee Alert!\n *   </md-button>\n *   <md-button ng-click=\"closeAlert()\" ng-disabled=\"!hasAlert()\" class=\"md-raised\">\n *     Close Alert\n *   </md-button>\n *   <md-button ng-click=\"showGreeting($event)\" class=\"md-raised md-primary\" >\n *     Greet Employee\n *   </md-button>\n * </div>\n * </hljs>\n *\n * ##### JavaScript\n *\n * <hljs lang=\"js\">\n * (function(angular, undefined){\n *   \"use strict\";\n *\n *   angular\n *     .module('demoApp', ['ngMaterial'])\n *     .controller('EmployeeController', EmployeeEditor)\n *     .controller('GreetingController', GreetingController);\n *\n *   // Fictitious Employee Editor to show how to use simple and complex dialogs.\n *\n *   function EmployeeEditor($scope, $mdDialog) {\n *     var alert;\n *\n *     $scope.showAlert = showAlert;\n *     $scope.closeAlert = closeAlert;\n *     $scope.showGreeting = showCustomGreeting;\n *\n *     $scope.hasAlert = function() { return !!alert };\n *     $scope.userName = $scope.userName || 'Bobby';\n *\n *     // Dialog #1 - Show simple alert dialog and cache\n *     // reference to dialog instance\n *\n *     function showAlert() {\n *       alert = $mdDialog.alert()\n *         .title('Attention, ' + $scope.userName)\n *         .content('This is an example of how easy dialogs can be!')\n *         .ok('Close');\n *\n *       $mdDialog\n *           .show( alert )\n *           .finally(function() {\n *             alert = undefined;\n *           });\n *     }\n *\n *     // Close the specified dialog instance and resolve with 'finished' flag\n *     // Normally this is not needed, just use '$mdDialog.hide()' to close\n *     // the most recent dialog popup.\n *\n *     function closeAlert() {\n *       $mdDialog.hide( alert, \"finished\" );\n *       alert = undefined;\n *     }\n *\n *     // Dialog #2 - Demonstrate more complex dialogs construction and popup.\n *\n *     function showCustomGreeting($event) {\n *         $mdDialog.show({\n *           targetEvent: $event,\n *           template:\n *             '<md-dialog>' +\n *\n *             '  <md-content>Hello {{ employee }}!</md-content>' +\n *\n *             '  <div class=\"md-actions\">' +\n *             '    <md-button ng-click=\"closeDialog()\">' +\n *             '      Close Greeting' +\n *\n *             '    </md-button>' +\n *             '  </div>' +\n *             '</md-dialog>',\n *           controller: 'GreetingController',\n *           onComplete: afterShowAnimation,\n *           locals: { employee: $scope.userName }\n *         });\n *\n *         // When the 'enter' animation finishes...\n *\n *         function afterShowAnimation(scope, element, options) {\n *            // post-show code here: DOM element focus, etc.\n *         }\n *     }\n *   }\n *\n *   // Greeting controller used with the more complex 'showCustomGreeting()' custom dialog\n *\n *   function GreetingController($scope, $mdDialog, employee) {\n *     // Assigned from construction <code>locals</code> options...\n *     $scope.employee = employee;\n *\n *     $scope.closeDialog = function() {\n *       // Easily hides most recent dialog shown...\n *       // no specific instance reference is needed.\n *       $mdDialog.hide();\n *     };\n *   }\n *\n * })(angular);\n * </hljs>\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#alert\n *\n * @description\n * Builds a preconfigured dialog with the specified message.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdDialog#confirm\n *\n * @description\n * Builds a preconfigured dialog with the specified message. You can call show and the promise returned\n * will be resolved only if the user clicks the confirm action on the dialog.\n *\n * @returns {obj} an `$mdDialogPreset` with the chainable configuration methods:\n *\n * Additionally, it supports the following methods:\n *\n * - $mdDialogPreset#title(string) - sets title to string\n * - $mdDialogPreset#content(string) - sets content / message to string\n * - $mdDialogPreset#ok(string) - sets okay button text to string\n * - $mdDialogPreset#cancel(string) - sets cancel button text to string\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#show\n *\n * @description\n * Show a dialog with the specified options.\n *\n * @param {object} optionsOrPreset Either provide an `$mdDialogPreset` returned from `alert()`,\n * `confirm()` or an options object with the following properties:\n *   - `templateUrl` - `{string=}`: The url of a template that will be used as the content\n *   of the dialog.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual template string.\n *   - `targetEvent` - `{DOMClickEvent=}`: A click's event object. When passed in as an option,\n *     the location of the click will be used as the starting point for the opening animation\n *     of the the dialog.\n *   - `disableParentScroll` - `{boolean=}`: Whether to disable scrolling while the dialog is open.\n *     Default true.\n *   - `hasBackdrop` - `{boolean=}`: Whether there should be an opaque backdrop behind the dialog.\n *     Default true.\n *   - `clickOutsideToClose` - `{boolean=}`: Whether the user can click outside the dialog to\n *     close it. Default true.\n *   - `escapeToClose` - `{boolean=}`: Whether the user can press escape to close the dialog.\n *     Default true.\n *   - `controller` - `{string=}`: The controller to associate with the dialog. The controller\n *     will be injected with the local `$hideDialog`, which is a function used to hide the dialog.\n *   - `locals` - `{object=}`: An object containing key/value pairs. The keys will be used as names\n *     of values to inject into the controller. For example, `locals: {three: 3}` would inject\n *     `three` into the controller, with the value 3. If `bindToController` is true, they will be\n *     copied to the controller instead.\n *   - `bindToController` - `bool`: bind the locals to the controller, instead of passing them in\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values, and the\n *     dialog will not open until all of the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the dialog to. Defaults to appending\n *     to the root element of the application.\n *   - `onComplete` `{function=}`: Callback function used to announce when the show() action is\n *     finished.\n *\n * @returns {promise} A promise that can be resolved with `$mdDialog.hide()` or\n * rejected with `mdDialog.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#hide\n *\n * @description\n * Hide an existing dialog and resolve the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n */\n\n/**\n * @ngdoc method\n * @name $mdDialog#cancel\n *\n * @description\n * Hide an existing dialog and reject the promise returned from `$mdDialog.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n */\n\nfunction MdDialogProvider($$interimElementProvider) {\n\n  var alertDialogMethods = ['title', 'content', 'ariaLabel', 'ok'];\n\n  advancedDialogOptions.$inject = [\"$mdDialog\"];\n  dialogDefaultOptions.$inject = [\"$timeout\", \"$rootElement\", \"$compile\", \"$animate\", \"$mdAria\", \"$document\", \"$mdUtil\", \"$mdConstant\", \"$mdTheming\", \"$$rAF\", \"$q\", \"$mdDialog\"];\n  return $$interimElementProvider('$mdDialog')\n    .setDefaults({\n      methods: ['disableParentScroll', 'hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],\n      options: dialogDefaultOptions\n    })\n    .addPreset('alert', {\n      methods: ['title', 'content', 'ariaLabel', 'ok'],\n      options: advancedDialogOptions\n    })\n    .addPreset('confirm', {\n      methods: ['title', 'content', 'ariaLabel', 'ok', 'cancel'],\n      options: advancedDialogOptions\n    });\n\n  /* @ngInject */\n  function advancedDialogOptions($mdDialog) {\n    return {\n      template: [\n        '<md-dialog aria-label=\"{{ dialog.ariaLabel }}\">',\n          '<md-content>',\n            '<h2>{{ dialog.title }}</h2>',\n            '<p>{{ dialog.content }}</p>',\n          '</md-content>',\n          '<div class=\"md-actions\">',\n            '<md-button ng-if=\"dialog.$type == \\'confirm\\'\" ng-click=\"dialog.abort()\">',\n              '{{ dialog.cancel }}',\n            '</md-button>',\n            '<md-button ng-click=\"dialog.hide()\" class=\"md-primary\">',\n              '{{ dialog.ok }}',\n            '</md-button>',\n          '</div>',\n        '</md-dialog>'\n      ].join(''),\n      controller: function mdDialogCtrl() {\n        this.hide = function() {\n          $mdDialog.hide(true);\n        };\n        this.abort = function() {\n          $mdDialog.cancel();\n        };\n      },\n      controllerAs: 'dialog',\n      bindToController: true\n    };\n  }\n\n  /* @ngInject */\n  function dialogDefaultOptions($timeout, $rootElement, $compile, $animate, $mdAria, $document,\n                                $mdUtil, $mdConstant, $mdTheming, $$rAF, $q, $mdDialog) {\n    return {\n      hasBackdrop: true,\n      isolateScope: true,\n      onShow: onShow,\n      onRemove: onRemove,\n      clickOutsideToClose: true,\n      escapeToClose: true,\n      targetEvent: null,\n      disableParentScroll: true,\n      transformTemplate: function(template) {\n        return '<div class=\"md-dialog-container\">' + template + '</div>';\n      }\n    };\n\n\n    // On show method for dialogs\n    function onShow(scope, element, options) {\n      // Incase the user provides a raw dom element, always wrap it in jqLite\n      options.parent = angular.element(options.parent);\n\n      options.popInTarget = angular.element((options.targetEvent || {}).target);\n      var closeButton = findCloseButton();\n\n      configureAria(element.find('md-dialog'));\n\n      if (options.hasBackdrop) {\n        options.backdrop = angular.element('<md-backdrop class=\"md-dialog-backdrop md-opaque\">');\n        $mdTheming.inherit(options.backdrop, options.parent);\n        $animate.enter(options.backdrop, options.parent);\n      }\n\n      if (options.disableParentScroll) {\n        options.oldOverflowStyle = options.parent.css('overflow');\n        options.parent.css('overflow', 'hidden');\n      }\n\n      return dialogPopIn(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      )\n      .then(function() {\n        if (options.escapeToClose) {\n          options.rootElementKeyupCallback = function(e) {\n            if (e.keyCode === $mdConstant.KEY_CODE.ESCAPE) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          $rootElement.on('keyup', options.rootElementKeyupCallback);\n        }\n\n        if (options.clickOutsideToClose) {\n          options.dialogClickOutsideCallback = function(e) {\n            // Only close if we click the flex container outside the backdrop\n            if (e.target === element[0]) {\n              $timeout($mdDialog.cancel);\n            }\n          };\n          element.on('click', options.dialogClickOutsideCallback);\n        }\n        closeButton.focus();\n      });\n\n\n      function findCloseButton() {\n        //If no element with class dialog-close, try to find the last\n        //button child in md-actions and assume it is a close button\n        var closeButton = element[0].querySelector('.dialog-close');\n        if (!closeButton) {\n          var actionButtons = element[0].querySelectorAll('.md-actions button');\n          closeButton = actionButtons[ actionButtons.length - 1 ];\n        }\n        return angular.element(closeButton);\n      }\n\n    }\n\n    // On remove function for all dialogs\n    function onRemove(scope, element, options) {\n\n      if (options.backdrop) {\n        $animate.leave(options.backdrop);\n      }\n      if (options.disableParentScroll) {\n        options.parent.css('overflow', options.oldOverflowStyle);\n        $document[0].removeEventListener('scroll', options.captureScroll, true);\n      }\n      if (options.escapeToClose) {\n        $rootElement.off('keyup', options.rootElementKeyupCallback);\n      }\n      if (options.clickOutsideToClose) {\n        element.off('click', options.dialogClickOutsideCallback);\n      }\n      return dialogPopOut(\n        element,\n        options.parent,\n        options.popInTarget && options.popInTarget.length && options.popInTarget\n      ).then(function() {\n        options.scope.$destroy();\n        element.remove();\n        options.popInTarget && options.popInTarget.focus();\n      });\n\n    }\n\n    /**\n     * Inject ARIA-specific attributes appropriate for Dialogs\n     */\n    function configureAria(element) {\n      element.attr({\n        'role': 'dialog'\n      });\n\n      var dialogContent = element.find('md-content');\n      if (dialogContent.length === 0){\n        dialogContent = element;\n      }\n      $mdAria.expectAsync(element, 'aria-label', function() {\n        var words = dialogContent.text().split(/\\s+/);\n        if (words.length > 3) words = words.slice(0,3).concat('...');\n        return words.join(' ');\n      });\n    }\n\n    function dialogPopIn(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      parentElement.append(container);\n      transformToClickElement(dialogEl, clickElement);\n\n      $$rAF(function() {\n        dialogEl.addClass('transition-in')\n          .css($mdConstant.CSS.TRANSFORM, '');\n      });\n\n      return dialogTransitionEnd(dialogEl);\n    }\n\n    function dialogPopOut(container, parentElement, clickElement) {\n      var dialogEl = container.find('md-dialog');\n\n      dialogEl.addClass('transition-out').removeClass('transition-in');\n      transformToClickElement(dialogEl, clickElement);\n\n      return dialogTransitionEnd(dialogEl);\n    }\n\n    function transformToClickElement(dialogEl, clickElement) {\n      if (clickElement) {\n        var clickRect = clickElement[0].getBoundingClientRect();\n        var dialogRect = dialogEl[0].getBoundingClientRect();\n\n        var scaleX = Math.min(0.5, clickRect.width / dialogRect.width);\n        var scaleY = Math.min(0.5, clickRect.height / dialogRect.height);\n\n        dialogEl.css($mdConstant.CSS.TRANSFORM, 'translate3d(' +\n          (-dialogRect.left + clickRect.left + clickRect.width/2 - dialogRect.width/2) + 'px,' +\n          (-dialogRect.top + clickRect.top + clickRect.height/2 - dialogRect.height/2) + 'px,' +\n          '0) scale(' + scaleX + ',' + scaleY + ')'\n        );\n      }\n    }\n\n    function dialogTransitionEnd(dialogEl) {\n      var deferred = $q.defer();\n      dialogEl.on($mdConstant.CSS.TRANSITIONEND, finished);\n      function finished(ev) {\n        //Make sure this transitionend didn't bubble up from a child\n        if (ev.target === dialogEl[0]) {\n          dialogEl.off($mdConstant.CSS.TRANSITIONEND, finished);\n          deferred.resolve();\n        }\n      }\n      return deferred.promise;\n    }\n\n  }\n}\nMdDialogProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/divider/bower.json",
    "content": "{\n  \"name\": \"angular-material-divider\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/divider/divider-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-divider.md-THEME_NAME-theme {\n  border-top-color: '{{foreground-4}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/divider/divider.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-divider {\n  display: block;\n  border-top: 1px solid;\n  margin: 0; }\n  md-divider[md-inset] {\n    margin-left: 80px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/divider/divider.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.divider\n * @description Divider module!\n */\nangular.module('material.components.divider', [\n  'material.core'\n])\n  .directive('mdDivider', MdDividerDirective);\n\nfunction MdDividerController(){}\n\n/**\n * @ngdoc directive\n * @name mdDivider\n * @module material.components.divider\n * @restrict E\n *\n * @description\n * Dividers group and separate content within lists and page layouts using strong visual and spatial distinctions. This divider is a thin rule, lightweight enough to not distract the user from content.\n *\n * @param {boolean=} md-inset Add this attribute to activate the inset divider style.\n * @usage\n * <hljs lang=\"html\">\n * <md-divider></md-divider>\n *\n * <md-divider md-inset></md-divider>\n * </hljs>\n *\n */\nfunction MdDividerDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    link: $mdTheming,\n    controller: [MdDividerController]\n  };\n}\nMdDividerDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/icon/bower.json",
    "content": "{\n  \"name\": \"angular-material-icon\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/icon/icon.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-icon {\n  margin: auto;\n  padding: 0;\n  display: inline-block;\n  margin-top: 5px;\n  background-repeat: no-repeat no-repeat;\n  pointer-events: none;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n  md-icon object.md-icon {\n    display: inline-block; }\n\nsvg, object {\n  fill: currentColor;\n  color: currentColor; }\n\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/icon/icon.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.icon\n * @description\n * Icon\n */\nangular.module('material.components.icon', [\n  'material.core'\n])\n  .directive('mdIcon', mdIconDirective);\n\n/*\n * @ngdoc directive\n * @name mdIcon\n * @module material.components.icon\n *\n * @restrict E\n *\n * @description\n * The `<md-icon>` directive is an element useful for SVG icons\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-icon icon=\"/img/icons/ic_access_time_24px.svg\">\n *  </md-icon>\n * </hljs>\n *\n */\nfunction mdIconDirective() {\n  return {\n    restrict: 'E',\n    template: '<object class=\"md-icon\"></object>',\n    compile: function(element, attr) {\n      var object = angular.element(element[0].children[0]);\n      if(angular.isDefined(attr.icon)) {\n        object.attr('data', attr.icon);\n      }\n    }\n  };\n}\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/input/bower.json",
    "content": "{\n  \"name\": \"angular-material-input\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/input/input-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-input-container.md-THEME_NAME-theme .md-input {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}';\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-container.md-THEME_NAME-theme .md-input::-webkit-input-placeholder, md-input-container.md-THEME_NAME-theme .md-input::-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-moz-placeholder, md-input-container.md-THEME_NAME-theme .md-input:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme label {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-has-value label {\n  color: '{{foreground-2}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused .md-input {\n  border-color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent .md-input {\n  border-color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme:not(.md-input-invalid).md-input-focused.md-warn label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid .md-input {\n  border-color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid label {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme.md-input-invalid ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid data-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid x-ng-message, md-input-container.md-THEME_NAME-theme.md-input-invalid [ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [data-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid [x-ng-message], md-input-container.md-THEME_NAME-theme.md-input-invalid .md-char-counter {\n  color: '{{warn-500}}'; }\nmd-input-container.md-THEME_NAME-theme .md-input[disabled] {\n  border-bottom-color: transparent;\n  color: '{{foreground-3}}';\n  background-image: -webkit-linear-gradient(left, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%);\n  background-image: linear-gradient(to right, '{{foreground-4}}' 0%, '{{foreground-4}}' 33%, transparent 0%); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/input/input.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-input-container {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: relative;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  padding: 2px;\n  padding-bottom: 26px;\n  /* \n   * The .md-input class is added to the input/textarea \n   */ }\n  md-input-container textarea, md-input-container input[type=\"text\"], md-input-container input[type=\"password\"], md-input-container input[type=\"datetime\"], md-input-container input[type=\"datetime-local\"], md-input-container input[type=\"date\"], md-input-container input[type=\"month\"], md-input-container input[type=\"time\"], md-input-container input[type=\"week\"], md-input-container input[type=\"number\"], md-input-container input[type=\"email\"], md-input-container input[type=\"url\"], md-input-container input[type=\"search\"], md-input-container input[type=\"tel\"], md-input-container input[type=\"color\"] {\n    /* remove default appearance from all input/textarea */\n    -moz-appearance: none;\n    -webkit-appearance: none; }\n  md-input-container textarea {\n    resize: none;\n    overflow: hidden; }\n  md-input-container label {\n    -webkit-box-ordinal-group: 2;\n    -webkit-order: 1;\n        -ms-flex-order: 1;\n            order: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased;\n    padding-left: 2px;\n    z-index: 1;\n    -webkit-transform: translate3d(0, 24px, 0) scale(1);\n            transform: translate3d(0, 24px, 0) scale(1);\n    -webkit-transform-origin: left top;\n            transform-origin: left top;\n    -webkit-transition: -webkit-transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s;\n            transition: transform cubic-bezier(0.25, 0.8, 0.25, 1) 0.25s; }\n  md-input-container .md-input {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1;\n        -ms-flex: 1;\n            flex: 1;\n    -webkit-box-ordinal-group: 3;\n    -webkit-order: 2;\n        -ms-flex-order: 2;\n            order: 2;\n    display: block;\n    background: none;\n    padding-top: 2px;\n    padding-bottom: 1px;\n    border-width: 0 0 1px 0;\n    line-height: 26px;\n    -ms-flex-preferred-size: 26px; }\n    md-input-container .md-input:focus {\n      outline: none; }\n  md-input-container ng-messages, md-input-container data-ng-messages, md-input-container x-ng-messages, md-input-container [ng-messages], md-input-container [data-ng-messages], md-input-container [x-ng-messages] {\n    -webkit-box-ordinal-group: 4;\n    -webkit-order: 3;\n        -ms-flex-order: 3;\n            order: 3;\n    position: relative; }\n  md-input-container ng-message, md-input-container data-ng-message, md-input-container x-ng-message, md-input-container [ng-message], md-input-container [data-ng-message], md-input-container [x-ng-message], md-input-container .md-char-counter {\n    -webkit-font-smoothing: antialiased;\n    position: absolute;\n    font-size: 12px;\n    line-height: 24px; }\n    md-input-container ng-message.ng-enter, md-input-container data-ng-message.ng-enter, md-input-container x-ng-message.ng-enter, md-input-container [ng-message].ng-enter, md-input-container [data-ng-message].ng-enter, md-input-container [x-ng-message].ng-enter, md-input-container .md-char-counter.ng-enter {\n      -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n              transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n      -webkit-transition-delay: 0.2s;\n              transition-delay: 0.2s; }\n    md-input-container ng-message.ng-leave, md-input-container data-ng-message.ng-leave, md-input-container x-ng-message.ng-leave, md-input-container [ng-message].ng-leave, md-input-container [data-ng-message].ng-leave, md-input-container [x-ng-message].ng-leave, md-input-container .md-char-counter.ng-leave {\n      -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n              transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n    md-input-container ng-message.ng-enter, md-input-container ng-message.ng-leave.ng-leave-active, md-input-container data-ng-message.ng-enter, md-input-container data-ng-message.ng-leave.ng-leave-active, md-input-container x-ng-message.ng-enter, md-input-container x-ng-message.ng-leave.ng-leave-active, md-input-container [ng-message].ng-enter, md-input-container [ng-message].ng-leave.ng-leave-active, md-input-container [data-ng-message].ng-enter, md-input-container [data-ng-message].ng-leave.ng-leave-active, md-input-container [x-ng-message].ng-enter, md-input-container [x-ng-message].ng-leave.ng-leave-active, md-input-container .md-char-counter.ng-enter, md-input-container .md-char-counter.ng-leave.ng-leave-active {\n      opacity: 0;\n      -webkit-transform: translate3d(0, -20%, 0);\n              transform: translate3d(0, -20%, 0); }\n    md-input-container ng-message.ng-leave, md-input-container ng-message.ng-enter.ng-enter-active, md-input-container data-ng-message.ng-leave, md-input-container data-ng-message.ng-enter.ng-enter-active, md-input-container x-ng-message.ng-leave, md-input-container x-ng-message.ng-enter.ng-enter-active, md-input-container [ng-message].ng-leave, md-input-container [ng-message].ng-enter.ng-enter-active, md-input-container [data-ng-message].ng-leave, md-input-container [data-ng-message].ng-enter.ng-enter-active, md-input-container [x-ng-message].ng-leave, md-input-container [x-ng-message].ng-enter.ng-enter-active, md-input-container .md-char-counter.ng-leave, md-input-container .md-char-counter.ng-enter.ng-enter-active {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0); }\n  md-input-container .md-char-counter {\n    bottom: 2px;\n    right: 2px; }\n  md-input-container.md-input-focused label, md-input-container.md-input-has-value label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-container.md-input-focused .md-input, md-input-container .md-input.ng-invalid.ng-dirty {\n    padding-bottom: 0px;\n    border-width: 0 0 2px 0; }\n  md-input-container .md-input[disabled] {\n    background-position: 0 bottom;\n    background-size: 3px 1px;\n    background-repeat: repeat-x; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/input/input.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n\n/**\n * @ngdoc module\n * @name material.components.input\n */\n\nangular.module('material.components.input', [\n  'material.core'\n])\n  .directive('mdInputContainer', mdInputContainerDirective)\n  .directive('label', labelDirective)\n  .directive('input', inputTextareaDirective)\n  .directive('textarea', inputTextareaDirective)\n  .directive('mdMaxlength', mdMaxlengthDirective);\n\n/**\n * @ngdoc directive\n * @name mdInputContainer\n * @module material.components.input\n *\n * @restrict E\n *\n * @description\n * `<md-input-container>` is the parent of any input or textarea element.\n *\n * Input and textarea elements will not behave properly unless the md-input-container \n * parent is provided.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-input-container>\n *   <label>Username</label>\n *   <input type=\"text\" ng-model=\"user.name\">\n * </md-input-container>\n *\n * <md-input-container>\n *   <label>Description</label>\n *   <textarea ng-model=\"user.description\"></textarea>\n * </md-input-container>\n *\n * </hljs>\n */\nfunction mdInputContainerDirective($mdTheming) {\n  ContainerCtrl.$inject = [\"$scope\", \"$element\", \"$mdUtil\"];\n  return {\n    restrict: 'E',\n    link: postLink,\n    controller: ContainerCtrl\n  };\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n  }\n  function ContainerCtrl($scope, $element, $mdUtil) {\n    var self = this;\n\n    self.element = $element;\n    self.setFocused = function(isFocused) {\n      $element.toggleClass('md-input-focused', !!isFocused);\n    };\n    self.setHasValue = function(hasValue) {\n      $element.toggleClass('md-input-has-value', !!hasValue);\n    };\n    self.setInvalid = function(isInvalid) {\n      $element.toggleClass('md-input-invalid', !!isInvalid);\n    };\n\n    $scope.$watch(function() {\n      return self.label && self.input;\n    }, function(hasLabelAndInput) {\n      if (hasLabelAndInput && !self.label.attr('for')) {\n        self.label.attr('for', self.input.attr('id'));\n      }\n    });\n  }\n}\nmdInputContainerDirective.$inject = [\"$mdTheming\"];\n\nfunction labelDirective() {\n  return {\n    restrict: 'E',\n    require: '^?mdInputContainer',\n    link: function(scope, element, attr, containerCtrl) {\n      if (!containerCtrl) return;\n\n      containerCtrl.label = element;\n      scope.$on('$destroy', function() {\n        containerCtrl.label = null;\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n * @module material.components.input\n *\n * @description\n * Must be placed as a child of an `<md-input-container>`. \n *\n * Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/input).\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-input-container>\n *   <label>Color</label>\n *   <input type=\"text\" ng-model=\"color\" required md-maxlength=\"10\">\n * </md-input-container>\n * </hljs>\n * <h3>With Errors (uses [ngMessages](https://docs.angularjs.org/api/ngMessages))</h3>\n * <hljs lang=\"html\">\n * <form name=\"userForm\">\n *   <md-input-container>\n *     <label>Last Name</label>\n *     <input name=\"lastName\" ng-model=\"lastName\" required md-maxlength=\"10\" minlength=\"4\">\n *     <div ng-messages=\"userForm.lastName.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *       <div ng-message=\"minlength\">That's too short!</div>\n *     </div>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * @param {number=} md-maxlength The maximum number of characters allowed in this input. If this is specified, a character counter will be shown underneath the input.\n */\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n * @module material.components.input\n *\n * @description\n * Must be placed as a child of an `<md-input-container>`. \n *\n * Behaves like the [AngularJS input directive](https://docs.angularjs.org/api/ng/directive/textarea).\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-input-container>\n *   <label>Description</label>\n *   <textarea ng-model=\"description\" required minlength=\"15\" md-maxlength=\"20\"></textarea>\n * </md-input-container>\n * </hljs>\n * <h3>With Errors (uses [ngMessages](https://docs.angularjs.org/api/ngMessages))</h3>\n * <hljs lang=\"html\">\n * <form name=\"userForm\">\n *   <md-input-container>\n *     <label>Biography</label>\n *     <textarea name=\"bio\" ng-model=\"biography\" required md-maxlength=\"150\"></textarea>\n *     <div ng-messages=\"userForm.bio.$error\" ng-show=\"userForm.bio.$dirty\">\n *       <div ng-message=\"required\">This is required!</div>\n *       <div ng-message=\"md-maxlength\">That's too long!</div>\n *     </div>\n *   </md-input-container>\n * </form>\n * </hljs>\n *\n * @param {number=} md-maxlength The maximum number of characters allowed in this input. If this is specified, a character counter will be shown underneath the input.\n */\nfunction inputTextareaDirective($mdUtil, $window, $compile, $animate) {\n  return {\n    restrict: 'E',\n    require: ['^?mdInputContainer', '?ngModel'],\n    compile: compile,\n  };\n  \n  function compile(element) {\n    element.addClass('md-input');\n    return postLink;\n  }\n  function postLink(scope, element, attr, ctrls) {\n\n    var containerCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1];\n\n    if ( !containerCtrl ) return;\n    if (containerCtrl.input) {\n      throw new Error(\"<md-input-container> can only have *one* <input> or <textarea> child element!\");\n    }\n    containerCtrl.input = element;\n\n    if (!element.attr('id')) {\n      element.attr('id', 'input_' + $mdUtil.nextUid());\n    }\n\n    if (element[0].tagName.toLowerCase() === 'textarea') {\n      setupTextarea();\n    }\n\n    var isEmpty = ngModelCtrl ? \n      ngModelCtrl.$isEmpty : \n      function() { return ('' + element.val()).length === 0; };\n\n    // When the input value changes, check if it \"has\" a value, and\n    // set the appropriate class on the input group\n    if (ngModelCtrl) {\n      scope.$watch(function() {\n        return ngModelCtrl.$dirty && ngModelCtrl.$invalid;\n      }, containerCtrl.setInvalid);\n      \n      ngModelCtrl.$formatters.push(checkHasValue);\n      ngModelCtrl.$parsers.push(checkHasValue);\n    } else {\n      checkHasValue();\n    }\n    element.on('input', checkHasValue);\n\n    function checkHasValue(value) {\n      containerCtrl.setHasValue(\n        !isEmpty(value) ||\n        (element[0].validity || {}).badInput // allow badInput to count as having a value.\n      );\n      return value;\n    }\n\n    element\n      .on('focus', function(ev) {\n        containerCtrl.setFocused(true);\n      })\n      .on('blur', function(ev) {\n        containerCtrl.setFocused(false);\n      });\n\n    scope.$on('$destroy', function() {\n      containerCtrl.setFocused(false);\n      containerCtrl.setHasValue(false);\n      containerCtrl.input = null;\n    });\n\n    function setupTextarea() {\n      var node = element[0];\n      var onChangeTextarea = $mdUtil.debounce(growTextarea, 1);\n\n      function pipelineListener(value) {\n        onChangeTextarea();\n        return value;\n      }\n\n      if (ngModelCtrl) {\n        ngModelCtrl.$formatters.push(pipelineListener);\n        ngModelCtrl.$viewChangeListeners.push(pipelineListener);\n      } else {\n        onChangeTextarea();\n      }\n      element.on('keydown input', onChangeTextarea);\n      element.on('scroll', onScroll);\n      angular.element($window).on('resize', onChangeTextarea);\n\n      scope.$on('$destroy', function() {\n        angular.element($window).off('resize', onChangeTextarea);\n      });\n\n      function growTextarea() {\n        node.style.height = \"auto\";\n        var line = node.scrollHeight - node.offsetHeight;\n        node.scrollTop = 0;\n        var height = node.offsetHeight + (line > 0 ? line : 0);\n        node.style.height = height + 'px';\n      }\n\n      function onScroll(e) {\n        node.scrollTop = 0;\n        // for smooth new line adding\n        var line = node.scrollHeight - node.offsetHeight;\n        var height = node.offsetHeight + line;\n        node.style.height = height + 'px';\n      }\n    }\n  }\n}\ninputTextareaDirective.$inject = [\"$mdUtil\", \"$window\", \"$compile\", \"$animate\"];\n\nfunction mdMaxlengthDirective() {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^mdInputContainer'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    var maxlength;\n    var ngModelCtrl = ctrls[0];\n    var containerCtrl = ctrls[1];\n    var charCountEl = angular.element('<div class=\"md-char-counter\">');\n\n    // Stop model from trimming. This makes it so whitespace \n    // over the maxlength still counts as invalid.\n    attr.$set('ngTrim', 'false');\n    containerCtrl.element.append(charCountEl);\n\n    ngModelCtrl.$formatters.push(renderCharCount);\n    ngModelCtrl.$viewChangeListeners.push(renderCharCount);\n    element.on('input keydown', renderCharCount);\n\n    scope.$watch(attr.mdMaxlength, function(value) {\n      maxlength = value;\n      if (angular.isNumber(value) && value > 0) {\n        if (!charCountEl.parent().length) {\n          $animate.enter(charCountEl, containerCtrl.element, \n                         angular.element(containerCtrl.element[0].lastElementChild));\n        }\n        renderCharCount();\n      } else {\n        $animate.leave(charCountEl);\n      }\n    });\n\n    ngModelCtrl.$validators['md-maxlength'] = function(modelValue, viewValue) {\n      if (!angular.isNumber(maxlength) || maxlength < 0) {\n        return true;\n      }\n      return ( element.val() || modelValue || viewValue || '' ).length <= maxlength;\n    };\n\n    function renderCharCount(value) {\n      charCountEl.text( element.val().length + '/' + maxlength );\n      return value;\n    }\n  }\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/list/bower.json",
    "content": "{\n  \"name\": \"angular-material-list\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/list/list.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-list {\n  padding: 8px 0px 8px 0px; }\n\nmd-item-content {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  box-sizing: border-box;\n  position: relative;\n  padding: 0px 0px 0px 0px; }\n\n/**\n * The left tile for a list item.\n */\n.md-tile-left {\n  min-width: 56px;\n  margin-right: -16px; }\n\n/**\n * The center content tile for a list item.\n */\n.md-tile-content {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  padding: 16px;\n  text-overflow: ellipsis; }\n  .md-tile-content h3 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 1.1em; }\n  .md-tile-content h4 {\n    margin: 0 0 3px 0;\n    font-weight: 400;\n    font-size: 0.9em; }\n  .md-tile-content p {\n    margin: 0 0 3px 0;\n    font-size: 0.75em; }\n\n/**\n * The right tile for a list item.\n */\n.md-tile-right {\n  padding-right: 0px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/list/list.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.list\n * @description\n * List module\n */\nangular.module('material.components.list', [\n  'material.core'\n])\n  .directive('mdList', mdListDirective)\n  .directive('mdItem', mdItemDirective);\n\n/**\n * @ngdoc directive\n * @name mdList\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-list>` directive is a list container for 1..n `<md-item>` tags.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-list>\n *   <md-item ng-repeat=\"item in todos\">\n *     <md-item-content>\n *       <div class=\"md-tile-left\">\n *         <img ng-src=\"{{item.face}}\" class=\"face\" alt=\"{{item.who}}\">\n *       </div>\n *       <div class=\"md-tile-content\">\n *         <h3>{{item.what}}</h3>\n *         <h4>{{item.who}}</h4>\n *         <p>\n *           {{item.notes}}\n *         </p>\n *       </div>\n *     </md-item-content>\n *   </md-item>\n * </md-list>\n * </hljs>\n *\n */\nfunction mdListDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'list'\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name mdItem\n * @module material.components.list\n *\n * @restrict E\n *\n * @description\n * The `<md-item>` directive is a container intended for row items in a `<md-list>` container.\n *\n * @usage\n * <hljs lang=\"html\">\n *  <md-list>\n *    <md-item>\n *            Item content in list\n *    </md-item>\n *  </md-list>\n * </hljs>\n *\n */\nfunction mdItemDirective() {\n  return {\n    restrict: 'E',\n    link: function($scope, $element, $attr) {\n      $element.attr({\n        'role' : 'listitem'\n      });\n    }\n  };\n}\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/menu/bower.json",
    "content": "{\n  \"name\": \"angular-material-menu\",\n  \"version\": \"0.6.0\",\n  \"dependencies\": {}\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/menu/menu.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.6.0\n */\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/menu/menu.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.6.0\n */\n\nangular.module('material.components.menu', [\n])\n\n.factory('$mdMenu', MenuProvider);\n\nfunction MenuProvider($$interimElementProvider) {\n  return $$interimElementProvider('$mdMenu')\n    .setDefaults({\n      methods: ['placement'],\n      options: menuDefaultOptions\n    });\n\n  /* @ngInject */\n  function menuDefaultOptions() {\n\n  }\n}\nMenuProvider.$inject = [\"$$interimElementProvider\"];\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressCircular/bower.json",
    "content": "{\n  \"name\": \"angular-material-progressCircular\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressCircular/progressCircular-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-progress-circular.md-THEME_NAME-theme {\n  background-color: transparent; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-gap {\n    border-top-color: '{{primary-color}}';\n    border-bottom-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-top-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-right .md-half-circle {\n    border-right-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme .md-inner .md-left .md-half-circle {\n    border-left-color: '{{primary-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-gap {\n    border-top-color: '{{warn-color}}';\n    border-bottom-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-top-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-right .md-half-circle {\n    border-right-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-warn .md-inner .md-left .md-half-circle {\n    border-left-color: '{{warn-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-gap {\n    border-top-color: '{{accent-color}}';\n    border-bottom-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle, md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-top-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-right .md-half-circle {\n    border-right-color: '{{accent-color}}'; }\n  md-progress-circular.md-THEME_NAME-theme.md-accent .md-inner .md-left .md-half-circle {\n    border-left-color: '{{accent-color}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressCircular/progressCircular.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n@-webkit-keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes outer-rotate {\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@-webkit-keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@keyframes left-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg); }\n\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg); } }\n\n@-webkit-keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@keyframes right-wobble {\n  0%, 100% {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg); }\n\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg); } }\n\n@-webkit-keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\n@keyframes sporadic-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg); }\n\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg); }\n\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg); }\n\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg); }\n\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg); }\n\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg); }\n\n  100% {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg); } }\n\nmd-progress-circular {\n  width: 50px;\n  height: 50px;\n  display: block;\n  position: relative;\n  padding-top: 0 !important;\n  margin-bottom: 0 !important;\n  overflow: hidden; }\n  md-progress-circular .md-inner {\n    width: 50px;\n    height: 50px;\n    position: relative; }\n    md-progress-circular .md-inner .md-gap {\n      position: absolute;\n      left: 24px;\n      right: 24px;\n      top: 0;\n      bottom: 0;\n      border-top: 5px solid black;\n      box-sizing: border-box; }\n    md-progress-circular .md-inner .md-left, md-progress-circular .md-inner .md-right {\n      position: absolute;\n      top: 0;\n      height: 50px;\n      width: 25px;\n      overflow: hidden; }\n      md-progress-circular .md-inner .md-left .md-half-circle, md-progress-circular .md-inner .md-right .md-half-circle {\n        position: absolute;\n        top: 0;\n        width: 50px;\n        height: 50px;\n        box-sizing: border-box;\n        border-width: 5px;\n        border-style: solid;\n        border-color: black black transparent;\n        border-radius: 50%; }\n    md-progress-circular .md-inner .md-left {\n      left: 0; }\n      md-progress-circular .md-inner .md-left .md-half-circle {\n        left: 0;\n        border-right-color: transparent; }\n    md-progress-circular .md-inner .md-right {\n      right: 0; }\n      md-progress-circular .md-inner .md-right .md-half-circle {\n        right: 0;\n        border-left-color: transparent; }\n  md-progress-circular[value=\"0\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-135deg);\n            transform: rotate(-135deg); }\n  md-progress-circular[value=\"0\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"1\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-131.4deg);\n            transform: rotate(-131.4deg); }\n  md-progress-circular[value=\"1\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"2\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-127.8deg);\n            transform: rotate(-127.8deg); }\n  md-progress-circular[value=\"2\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"3\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-124.2deg);\n            transform: rotate(-124.2deg); }\n  md-progress-circular[value=\"3\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"4\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-120.6deg);\n            transform: rotate(-120.6deg); }\n  md-progress-circular[value=\"4\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"5\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-117deg);\n            transform: rotate(-117deg); }\n  md-progress-circular[value=\"5\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"6\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-113.4deg);\n            transform: rotate(-113.4deg); }\n  md-progress-circular[value=\"6\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"7\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-109.8deg);\n            transform: rotate(-109.8deg); }\n  md-progress-circular[value=\"7\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"8\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-106.2deg);\n            transform: rotate(-106.2deg); }\n  md-progress-circular[value=\"8\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"9\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-102.6deg);\n            transform: rotate(-102.6deg); }\n  md-progress-circular[value=\"9\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"10\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-99deg);\n            transform: rotate(-99deg); }\n  md-progress-circular[value=\"10\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"11\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-95.4deg);\n            transform: rotate(-95.4deg); }\n  md-progress-circular[value=\"11\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"12\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-91.8deg);\n            transform: rotate(-91.8deg); }\n  md-progress-circular[value=\"12\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"13\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-88.2deg);\n            transform: rotate(-88.2deg); }\n  md-progress-circular[value=\"13\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"14\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-84.6deg);\n            transform: rotate(-84.6deg); }\n  md-progress-circular[value=\"14\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"15\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-81deg);\n            transform: rotate(-81deg); }\n  md-progress-circular[value=\"15\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"16\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-77.4deg);\n            transform: rotate(-77.4deg); }\n  md-progress-circular[value=\"16\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"17\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-73.8deg);\n            transform: rotate(-73.8deg); }\n  md-progress-circular[value=\"17\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"18\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-70.2deg);\n            transform: rotate(-70.2deg); }\n  md-progress-circular[value=\"18\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"19\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-66.6deg);\n            transform: rotate(-66.6deg); }\n  md-progress-circular[value=\"19\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"20\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-63deg);\n            transform: rotate(-63deg); }\n  md-progress-circular[value=\"20\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"21\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-59.4deg);\n            transform: rotate(-59.4deg); }\n  md-progress-circular[value=\"21\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"22\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-55.8deg);\n            transform: rotate(-55.8deg); }\n  md-progress-circular[value=\"22\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"23\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-52.2deg);\n            transform: rotate(-52.2deg); }\n  md-progress-circular[value=\"23\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"24\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-48.6deg);\n            transform: rotate(-48.6deg); }\n  md-progress-circular[value=\"24\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"25\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-45deg);\n            transform: rotate(-45deg); }\n  md-progress-circular[value=\"25\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"26\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-41.4deg);\n            transform: rotate(-41.4deg); }\n  md-progress-circular[value=\"26\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"27\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-37.8deg);\n            transform: rotate(-37.8deg); }\n  md-progress-circular[value=\"27\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"28\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-34.2deg);\n            transform: rotate(-34.2deg); }\n  md-progress-circular[value=\"28\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"29\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-30.6deg);\n            transform: rotate(-30.6deg); }\n  md-progress-circular[value=\"29\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"30\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-27deg);\n            transform: rotate(-27deg); }\n  md-progress-circular[value=\"30\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"31\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-23.4deg);\n            transform: rotate(-23.4deg); }\n  md-progress-circular[value=\"31\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"32\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-19.8deg);\n            transform: rotate(-19.8deg); }\n  md-progress-circular[value=\"32\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"33\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-16.2deg);\n            transform: rotate(-16.2deg); }\n  md-progress-circular[value=\"33\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"34\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-12.6deg);\n            transform: rotate(-12.6deg); }\n  md-progress-circular[value=\"34\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"35\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-9deg);\n            transform: rotate(-9deg); }\n  md-progress-circular[value=\"35\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"36\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-5.4deg);\n            transform: rotate(-5.4deg); }\n  md-progress-circular[value=\"36\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"37\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(-1.8deg);\n            transform: rotate(-1.8deg); }\n  md-progress-circular[value=\"37\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"38\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(1.8deg);\n            transform: rotate(1.8deg); }\n  md-progress-circular[value=\"38\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"39\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(5.4deg);\n            transform: rotate(5.4deg); }\n  md-progress-circular[value=\"39\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"40\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(9deg);\n            transform: rotate(9deg); }\n  md-progress-circular[value=\"40\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"41\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(12.6deg);\n            transform: rotate(12.6deg); }\n  md-progress-circular[value=\"41\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"42\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(16.2deg);\n            transform: rotate(16.2deg); }\n  md-progress-circular[value=\"42\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"43\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(19.8deg);\n            transform: rotate(19.8deg); }\n  md-progress-circular[value=\"43\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"44\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(23.4deg);\n            transform: rotate(23.4deg); }\n  md-progress-circular[value=\"44\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"45\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(27deg);\n            transform: rotate(27deg); }\n  md-progress-circular[value=\"45\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"46\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(30.6deg);\n            transform: rotate(30.6deg); }\n  md-progress-circular[value=\"46\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"47\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(34.2deg);\n            transform: rotate(34.2deg); }\n  md-progress-circular[value=\"47\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"48\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(37.8deg);\n            transform: rotate(37.8deg); }\n  md-progress-circular[value=\"48\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"49\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(41.4deg);\n            transform: rotate(41.4deg); }\n  md-progress-circular[value=\"49\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"50\"] .md-inner .md-left .md-half-circle {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-right .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"50\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    border-bottom-color: transparent !important; }\n  md-progress-circular[value=\"51\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(138.6deg);\n            transform: rotate(138.6deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"51\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"52\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(142.2deg);\n            transform: rotate(142.2deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"52\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"53\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(145.8deg);\n            transform: rotate(145.8deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"53\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"54\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(149.4deg);\n            transform: rotate(149.4deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"54\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"55\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(153deg);\n            transform: rotate(153deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"55\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"56\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(156.6deg);\n            transform: rotate(156.6deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"56\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"57\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(160.2deg);\n            transform: rotate(160.2deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"57\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"58\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(163.8deg);\n            transform: rotate(163.8deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"58\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"59\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(167.4deg);\n            transform: rotate(167.4deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"59\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"60\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(171deg);\n            transform: rotate(171deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"60\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"61\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(174.6deg);\n            transform: rotate(174.6deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"61\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"62\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(178.2deg);\n            transform: rotate(178.2deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"62\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"63\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(181.8deg);\n            transform: rotate(181.8deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"63\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"64\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(185.4deg);\n            transform: rotate(185.4deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"64\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"65\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(189deg);\n            transform: rotate(189deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"65\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"66\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(192.6deg);\n            transform: rotate(192.6deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"66\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"67\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(196.2deg);\n            transform: rotate(196.2deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"67\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"68\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(199.8deg);\n            transform: rotate(199.8deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"68\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"69\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(203.4deg);\n            transform: rotate(203.4deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"69\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"70\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(207deg);\n            transform: rotate(207deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"70\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"71\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(210.6deg);\n            transform: rotate(210.6deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"71\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"72\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(214.2deg);\n            transform: rotate(214.2deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"72\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"73\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(217.8deg);\n            transform: rotate(217.8deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"73\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"74\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(221.4deg);\n            transform: rotate(221.4deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"74\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"75\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(225deg);\n            transform: rotate(225deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"75\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"76\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(228.6deg);\n            transform: rotate(228.6deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"76\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"77\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(232.2deg);\n            transform: rotate(232.2deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"77\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"78\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(235.8deg);\n            transform: rotate(235.8deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"78\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"79\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(239.4deg);\n            transform: rotate(239.4deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"79\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"80\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(243deg);\n            transform: rotate(243deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"80\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"81\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(246.6deg);\n            transform: rotate(246.6deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"81\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"82\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(250.2deg);\n            transform: rotate(250.2deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"82\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"83\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(253.8deg);\n            transform: rotate(253.8deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"83\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"84\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(257.4deg);\n            transform: rotate(257.4deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"84\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"85\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(261deg);\n            transform: rotate(261deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"85\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"86\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(264.6deg);\n            transform: rotate(264.6deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"86\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"87\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(268.2deg);\n            transform: rotate(268.2deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"87\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"88\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(271.8deg);\n            transform: rotate(271.8deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"88\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"89\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(275.4deg);\n            transform: rotate(275.4deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"89\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"90\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(279deg);\n            transform: rotate(279deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"90\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"91\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(282.6deg);\n            transform: rotate(282.6deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"91\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"92\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(286.2deg);\n            transform: rotate(286.2deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"92\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"93\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(289.8deg);\n            transform: rotate(289.8deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"93\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"94\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(293.4deg);\n            transform: rotate(293.4deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"94\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"95\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(297deg);\n            transform: rotate(297deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"95\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"96\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(300.6deg);\n            transform: rotate(300.6deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"96\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"97\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(304.2deg);\n            transform: rotate(304.2deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"97\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"98\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(307.8deg);\n            transform: rotate(307.8deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"98\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"99\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(311.4deg);\n            transform: rotate(311.4deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"99\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[value=\"100\"] .md-inner .md-left .md-half-circle {\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear;\n    -webkit-transform: rotate(315deg);\n            transform: rotate(315deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-right .md-half-circle {\n    -webkit-transform: rotate(45deg);\n            transform: rotate(45deg); }\n  md-progress-circular[value=\"100\"] .md-inner .md-gap {\n    border-bottom-width: 5px;\n    border-bottom-style: solid;\n    -webkit-transition: border-bottom-color 0.1s linear;\n            transition: border-bottom-color 0.1s linear; }\n  md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper {\n    -webkit-animation: outer-rotate 2.91667s linear infinite;\n            animation: outer-rotate 2.91667s linear infinite; }\n    md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner {\n      -webkit-animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite;\n              animation: sporadic-rotate 5.25s cubic-bezier(0.35, 0, 0.25, 1) infinite; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle, md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-iteration-count: infinite;\n                animation-iteration-count: infinite;\n        -webkit-animation-duration: 1.3125s;\n                animation-duration: 1.3125s;\n        -webkit-animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1);\n                animation-timing-function: cubic-bezier(0.35, 0, 0.25, 1); }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-left .md-half-circle {\n        -webkit-animation-name: left-wobble;\n                animation-name: left-wobble; }\n      md-progress-circular[md-mode=indeterminate] .md-spinner-wrapper .md-inner .md-right .md-half-circle {\n        -webkit-animation-name: right-wobble;\n                animation-name: right-wobble; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressCircular/progressCircular.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.progressCircular\n * @description Circular Progress module!\n */\nangular.module('material.components.progressCircular', [\n  'material.core'\n])\n  .directive('mdProgressCircular', MdProgressCircularDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressCircular\n * @module material.components.progressCircular\n * @restrict E\n *\n* @description\n * The circular progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of two modes: determinate and indeterminate.\n * @param {number=} value In determinate mode, this number represents the percentage of the circular progress. Default: 0\n * @param {number=} md-diameter This specifies the diamter of the circular progress. Default: 48\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-circular md-mode=\"determinate\" value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" ng-value=\"...\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"determinate\" value=\"...\" md-diameter=\"100\"></md-progress-circular>\n *\n * <md-progress-circular md-mode=\"indeterminate\"></md-progress-circular>\n * </hljs>\n */\nfunction MdProgressCircularDirective($$rAF, $mdConstant, $mdTheming) {\n  var fillRotations = new Array(101),\n    fixRotations = new Array(101);\n\n  for (var i = 0; i < 101; i++) {\n    var percent = i / 100;\n    var rotation = Math.floor(percent * 180);\n\n    fillRotations[i] = 'rotate(' + rotation.toString() + 'deg)';\n    fixRotations[i] = 'rotate(' + (rotation * 2).toString() + 'deg)';\n  }\n\n  return {\n    restrict: 'E',\n    template:\n        '<div class=\"md-spinner-wrapper\">' +\n          '<div class=\"md-inner\">' +\n            '<div class=\"md-gap\"></div>' +\n            '<div class=\"md-left\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n            '<div class=\"md-right\">' +\n              '<div class=\"md-half-circle\"></div>' +\n            '</div>' +\n          '</div>' +\n        '</div>',\n    compile: compile\n  };\n\n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var circle = element[0],\n      fill = circle.querySelectorAll('.md-fill, .md-mask.md-full'),\n      fix = circle.querySelectorAll('.md-fill.md-fix'),\n      i, clamped, fillRotation, fixRotation;\n\n    var diameter = attr.mdDiameter || 48;\n    var scale = diameter/48;\n\n    circle.style[$mdConstant.CSS.TRANSFORM] = 'scale(' + scale.toString() + ')';\n\n    attr.$observe('value', function(value) {\n      clamped = clamp(value);\n      fillRotation = fillRotations[clamped];\n      fixRotation = fixRotations[clamped];\n\n      element.attr('aria-valuenow', clamped);\n\n      for (i = 0; i < fill.length; i++) {\n        fill[i].style[$mdConstant.CSS.TRANSFORM] = fillRotation;\n      }\n\n      for (i = 0; i < fix.length; i++) {\n        fix[i].style[$mdConstant.CSS.TRANSFORM] = fixRotation;\n      }\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressCircularDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressLinear/bower.json",
    "content": "{\n  \"name\": \"angular-material-progressLinear\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressLinear/progressLinear-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-progress-linear.md-THEME_NAME-theme .md-container {\n  background-color: '{{primary-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme .md-bar {\n  background-color: '{{primary-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-container {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-warn .md-bar {\n  background-color: '{{warn-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-container {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme.md-accent .md-bar {\n  background-color: '{{accent-color}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-bar1 {\n  background-color: '{{warn-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-warn .md-dashed:before {\n  background: -webkit-radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%);\n  background: radial-gradient('{{warn-100}}' 0%, '{{warn-100}}' 16%, transparent 42%); }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-bar1 {\n  background-color: '{{accent-100}}'; }\nmd-progress-linear.md-THEME_NAME-theme[md-mode=buffer].md-accent .md-dashed:before {\n  background: -webkit-radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%);\n  background: radial-gradient('{{accent-100}}' 0%, '{{accent-100}}' 16%, transparent 42%); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressLinear/progressLinear.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-progress-linear {\n  display: block;\n  width: 100%;\n  height: 5px; }\n  md-progress-linear .md-container {\n    overflow: hidden;\n    position: relative;\n    height: 5px;\n    top: 5px;\n    -webkit-transform: translate(0, 5px) scale(1, 0);\n            transform: translate(0, 5px) scale(1, 0);\n    -webkit-transition: all 0.3s linear;\n            transition: all 0.3s linear; }\n  md-progress-linear .md-container.md-ready {\n    -webkit-transform: translate(0, 0) scale(1, 1);\n            transform: translate(0, 0) scale(1, 1); }\n  md-progress-linear .md-bar {\n    height: 5px;\n    position: absolute;\n    width: 100%; }\n  md-progress-linear .md-bar1, md-progress-linear .md-bar2 {\n    -webkit-transition: all 0.2s linear;\n            transition: all 0.2s linear; }\n  md-progress-linear[md-mode=determinate] .md-bar1 {\n    display: none; }\n  md-progress-linear[md-mode=indeterminate] .md-bar1 {\n    -webkit-animation: indeterminate1 4s infinite linear;\n            animation: indeterminate1 4s infinite linear; }\n  md-progress-linear[md-mode=indeterminate] .md-bar2 {\n    -webkit-animation: indeterminate2 4s infinite linear;\n            animation: indeterminate2 4s infinite linear; }\n  md-progress-linear[md-mode=buffer] .md-container {\n    background-color: transparent !important; }\n  md-progress-linear[md-mode=buffer] .md-dashed:before {\n    content: \"\";\n    display: block;\n    height: 5px;\n    width: 100%;\n    margin-top: 0px;\n    position: absolute;\n    background-color: transparent;\n    background-size: 10px 10px !important;\n    background-position: 0px -23px;\n    -webkit-animation: buffer 3s infinite linear;\n            animation: buffer 3s infinite linear; }\n  md-progress-linear[md-mode=query] .md-bar2 {\n    -webkit-animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1);\n            animation: query 0.8s infinite cubic-bezier(0.39, 0.575, 0.565, 1); }\n\n@-webkit-keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@keyframes indeterminate1 {\n  0% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  10% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  19.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  20% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  30% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  34.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  36.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  37% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  47% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  52% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  55% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  58% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  61.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  69.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  70% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  80% {\n    -webkit-transform: translateX(20%) scale(0.25, 1);\n            transform: translateX(20%) scale(0.25, 1); }\n\n  85% {\n    -webkit-transform: translateX(35%) scale(0.05, 1);\n            transform: translateX(35%) scale(0.05, 1); }\n\n  88% {\n    -webkit-transform: translateX(35%) scale(0.1, 1);\n            transform: translateX(35%) scale(0.1, 1); }\n\n  91% {\n    -webkit-transform: translateX(50%) scale(0.1, 1);\n            transform: translateX(50%) scale(0.1, 1); }\n\n  92.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  93% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  100% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); } }\n\n@-webkit-keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@keyframes indeterminate2 {\n  0% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  25.99% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  28% {\n    -webkit-transform: translateX(-37.5%) scale(0.25, 1);\n            transform: translateX(-37.5%) scale(0.25, 1); }\n\n  38% {\n    -webkit-transform: translateX(37.5%) scale(0.25, 1);\n            transform: translateX(37.5%) scale(0.25, 1); }\n\n  42.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  46.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  49.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); }\n\n  50% {\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); }\n\n  60% {\n    -webkit-transform: translateX(-25%) scale(0.5, 1);\n            transform: translateX(-25%) scale(0.5, 1); }\n\n  70% {\n    -webkit-transform: translateX(25%) scale(0.5, 1);\n            transform: translateX(25%) scale(0.5, 1); }\n\n  79.99% {\n    -webkit-transform: translateX(50%) scale(0, 1);\n            transform: translateX(50%) scale(0, 1); } }\n\n@-webkit-keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@keyframes query {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(35%) scale(0.3, 1);\n            transform: translateX(35%) scale(0.3, 1); }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-50%) scale(0, 1);\n            transform: translateX(-50%) scale(0, 1); } }\n\n@-webkit-keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n\n@keyframes buffer {\n  0% {\n    opacity: 1;\n    background-position: 0px -23px; }\n\n  50% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1;\n    background-position: -200px -23px; } }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/progressLinear/progressLinear.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.progressLinear\n * @description Linear Progress module!\n */\nangular.module('material.components.progressLinear', [\n  'material.core'\n])\n  .directive('mdProgressLinear', MdProgressLinearDirective);\n\n/**\n * @ngdoc directive\n * @name mdProgressLinear\n * @module material.components.progressLinear\n * @restrict E\n *\n * @description\n * The linear progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content. Each operation should only be represented by one activity indicator—for example, one refresh operation should not display both a refresh bar and an activity circle.\n *\n * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take.\n *\n * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator.\n *\n * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query.\n * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0\n * @param {number=} md-buffer-value In the buffer mode, this number represents the precentage of the secondary progress bar. Default: 0\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-progress-linear md-mode=\"determinate\" value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"determinate\" ng-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"indeterminate\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"buffer\" value=\"...\" md-buffer-value=\"...\"></md-progress-linear>\n *\n * <md-progress-linear md-mode=\"query\"></md-progress-linear>\n * </hljs>\n */\nfunction MdProgressLinearDirective($$rAF, $mdConstant, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    template: '<div class=\"md-container\">' +\n      '<div class=\"md-dashed\"></div>' +\n      '<div class=\"md-bar md-bar1\"></div>' +\n      '<div class=\"md-bar md-bar2\"></div>' +\n      '</div>',\n    compile: compile\n  };\n  \n  function compile(tElement, tAttrs, transclude) {\n    tElement.attr('aria-valuemin', 0);\n    tElement.attr('aria-valuemax', 100);\n    tElement.attr('role', 'progressbar');\n\n    return postLink;\n  }\n  function postLink(scope, element, attr) {\n    $mdTheming(element);\n    var bar1Style = element[0].querySelector('.md-bar1').style,\n      bar2Style = element[0].querySelector('.md-bar2').style,\n      container = angular.element(element[0].querySelector('.md-container'));\n\n    attr.$observe('value', function(value) {\n      if (attr.mdMode == 'query') {\n        return;\n      }\n\n      var clamped = clamp(value);\n      element.attr('aria-valuenow', clamped);\n      bar2Style[$mdConstant.CSS.TRANSFORM] = transforms[clamped];\n    });\n\n    attr.$observe('mdBufferValue', function(value) {\n      bar1Style[$mdConstant.CSS.TRANSFORM] = transforms[clamp(value)];\n    });\n\n    $$rAF(function() {\n      container.addClass('md-ready');\n    });\n  }\n\n  function clamp(value) {\n    if (value > 100) {\n      return 100;\n    }\n\n    if (value < 0) {\n      return 0;\n    }\n\n    return Math.ceil(value || 0);\n  }\n}\nMdProgressLinearDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdTheming\"];\n\n\n// **********************************************************\n// Private Methods\n// **********************************************************\nvar transforms = (function() {\n  var values = new Array(101);\n  for(var i = 0; i < 101; i++){\n    values[i] = makeTransform(i);\n  }\n\n  return values;\n\n  function makeTransform(value){\n    var scale = value/100;\n    var translateX = (value-100)/2;\n    return 'translateX(' + translateX.toString() + '%) scale(' + scale.toString() + ', 1)';\n  }\n})();\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/radioButton/bower.json",
    "content": "{\n  \"name\": \"angular-material-radioButton\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/radioButton/radioButton-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-radio-button.md-THEME_NAME-theme .md-off {\n  border-color: '{{foreground-2}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-on {\n  background-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-off {\n  border-color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme.md-checked .md-ink-ripple {\n  color: '{{primary-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme .md-container .md-ripple {\n  color: '{{primary-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-accent .md-on {\n  background-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-accent.md-checked .md-off {\n  border-color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-accent.md-checked .md-ink-ripple {\n  color: '{{accent-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-accent .md-container .md-ripple {\n  color: '{{accent-600}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-on {\n  background-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-off {\n  border-color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn.md-checked .md-ink-ripple {\n  color: '{{warn-color-0.87}}'; }\nmd-radio-button.md-THEME_NAME-theme:not([disabled]).md-warn .md-container .md-ripple {\n  color: '{{warn-600}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-off {\n  border-color: '{{foreground-3}}'; }\nmd-radio-button.md-THEME_NAME-theme[disabled] .md-container .md-on {\n  border-color: '{{foreground-3}}'; }\n\nmd-radio-group.md-THEME_NAME-theme:focus:not(:empty) {\n  border-color: '{{foreground-1}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/radioButton/radioButton.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-radio-button, .md-switch-thumb {\n  display: block;\n  margin: 15px;\n  white-space: nowrap;\n  cursor: pointer; }\n  md-radio-button input, .md-switch-thumb input {\n    display: none; }\n  md-radio-button .md-container, .md-switch-thumb .md-container {\n    position: relative;\n    top: 4px;\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    cursor: pointer; }\n    md-radio-button .md-container .md-ripple-container, .md-switch-thumb .md-container .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: 48px;\n      height: 48px;\n      left: -16px;\n      top: -16px; }\n  md-radio-button .md-off, .md-switch-thumb .md-off {\n    position: absolute;\n    top: 0px;\n    left: 0px;\n    width: 16px;\n    height: 16px;\n    border: solid 2px;\n    border-radius: 50%;\n    -webkit-transition: border-color ease 0.28s;\n            transition: border-color ease 0.28s; }\n  md-radio-button .md-on, .md-switch-thumb .md-on {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 16px;\n    height: 16px;\n    border-radius: 50%;\n    -webkit-transition: -webkit-transform ease 0.28s;\n            transition: transform ease 0.28s;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n  md-radio-button.md-checked .md-on, .md-switch-thumb.md-checked .md-on {\n    -webkit-transform: scale(0.55);\n            transform: scale(0.55); }\n  md-radio-button .md-label, .md-switch-thumb .md-label {\n    position: relative;\n    display: inline-block;\n    margin-left: 10px;\n    margin-right: 10px;\n    vertical-align: middle;\n    white-space: normal;\n    pointer-events: none;\n    width: auto; }\n  md-radio-button .circle, .md-switch-thumb .circle {\n    border-radius: 50%; }\n\nmd-radio-group {\n  border: 1px dotted transparent;\n  display: block;\n  outline: none; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/radioButton/radioButton.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.radioButton\n * @description radioButton module!\n */\nangular.module('material.components.radioButton', [\n  'material.core'\n])\n  .directive('mdRadioGroup', mdRadioGroupDirective)\n  .directive('mdRadioButton', mdRadioButtonDirective);\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioGroup\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-group>` directive identifies a grouping\n * container for the 1..n grouped radio buttons; specified using nested\n * `<md-radio-button>` tags.\n *\n * Note: `<md-radio-group>` and `<md-radio-button>` handle tabindex differently\n * than the native `<input type='radio'>` controls. Whereas the native controls\n * force the user to tab through all the radio buttons, `<md-radio-group>`\n * is focusable, and by default the `<md-radio-button>`s are not.\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {boolean=} md-no-ink Use of attribute indicates flag to disable ink ripple effects.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-radio-group ng-model=\"selected\">\n *\n *   <md-radio-button\n *        ng-repeat=\"d in colorOptions\"\n *        ng-value=\"d.value\" aria-label=\"{{ d.label }}\">\n *\n *          {{ d.label }}\n *\n *   </md-radio-button>\n *\n * </md-radio-group>\n * </hljs>\n *\n */\nfunction mdRadioGroupDirective($mdUtil, $mdConstant, $mdTheming) {\n  RadioGroupController.prototype = createRadioGroupControllerProto();\n\n  return {\n    restrict: 'E',\n    controller: ['$element', RadioGroupController],\n    require: ['mdRadioGroup', '?ngModel'],\n    link: { pre: linkRadioGroup }\n  };\n\n  function linkRadioGroup(scope, element, attr, ctrls) {\n    $mdTheming(element);\n    var rgCtrl = ctrls[0];\n    var ngModelCtrl = ctrls[1] || $mdUtil.fakeNgModel();\n\n    function keydownListener(ev) {\n      switch(ev.keyCode) {\n        case $mdConstant.KEY_CODE.LEFT_ARROW:\n        case $mdConstant.KEY_CODE.UP_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectPrevious();\n          break;\n\n        case $mdConstant.KEY_CODE.RIGHT_ARROW:\n        case $mdConstant.KEY_CODE.DOWN_ARROW:\n          ev.preventDefault();\n          rgCtrl.selectNext();\n          break;\n\n        case $mdConstant.KEY_CODE.ENTER:\n          var form = angular.element($mdUtil.getClosest(element[0], 'form'));\n          if (form.length > 0) {\n            form.triggerHandler('submit');\n          }\n          break;\n      }\n    }\n\n    rgCtrl.init(ngModelCtrl);\n\n    element.attr({\n              'role': 'radiogroup',\n              'tabIndex': element.attr('tabindex') || '0'\n            })\n            .on('keydown', keydownListener);\n\n  }\n\n  function RadioGroupController($element) {\n    this._radioButtonRenderFns = [];\n    this.$element = $element;\n  }\n\n  function createRadioGroupControllerProto() {\n    return {\n      init: function(ngModelCtrl) {\n        this._ngModelCtrl = ngModelCtrl;\n        this._ngModelCtrl.$render = angular.bind(this, this.render);\n      },\n      add: function(rbRender) {\n        this._radioButtonRenderFns.push(rbRender);\n      },\n      remove: function(rbRender) {\n        var index = this._radioButtonRenderFns.indexOf(rbRender);\n        if (index !== -1) {\n          this._radioButtonRenderFns.splice(index, 1);\n        }\n      },\n      render: function() {\n        this._radioButtonRenderFns.forEach(function(rbRender) {\n          rbRender();\n        });\n      },\n      setViewValue: function(value, eventType) {\n        this._ngModelCtrl.$setViewValue(value, eventType);\n        // update the other radio buttons as well\n        this.render();\n      },\n      getViewValue: function() {\n        return this._ngModelCtrl.$viewValue;\n      },\n      selectNext: function() {\n        return changeSelectedButton(this.$element, 1);\n      },\n      selectPrevious : function() {\n        return changeSelectedButton(this.$element, -1);\n      },\n      setActiveDescendant: function (radioId) {\n        this.$element.attr('aria-activedescendant', radioId);\n      }\n    };\n  }\n  /**\n   * Change the radio group's selected button by a given increment.\n   * If no button is selected, select the first button.\n   */\n  function changeSelectedButton(parent, increment) {\n    // Coerce all child radio buttons into an array, then wrap then in an iterator\n    var buttons = $mdUtil.iterator(\n      Array.prototype.slice.call(parent[0].querySelectorAll('md-radio-button')),\n      true\n    );\n\n    if (buttons.count()) {\n      var validate = function (button) {\n        // If disabled, then NOT valid\n        return !angular.element(button).attr(\"disabled\");\n      };\n      var selected = parent[0].querySelector('md-radio-button.md-checked');\n      var target = buttons[increment < 0 ? 'previous' : 'next'](selected, validate) || buttons.first();\n      // Activate radioButton's click listener (triggerHandler won't create a real click event)\n      angular.element(target).triggerHandler('click');\n\n\n    }\n  }\n\n}\nmdRadioGroupDirective.$inject = [\"$mdUtil\", \"$mdConstant\", \"$mdTheming\"];\n\n/**\n * @ngdoc directive\n * @module material.components.radioButton\n * @name mdRadioButton\n *\n * @restrict E\n *\n * @description\n * The `<md-radio-button>`directive is the child directive required to be used within `<md-radio-group>` elements.\n *\n * While similar to the `<input type=\"radio\" ng-model=\"\" value=\"\">` directive,\n * the `<md-radio-button>` directive provides ink effects, ARIA support, and\n * supports use within named radio groups.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {string} ngValue Angular expression which sets the value to which the expression should\n *    be set when selected.*\n * @param {string} value The value to which the expression should be set when selected.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} ariaLabel Adds label to radio button for accessibility.\n * Defaults to radio button's text. If no default text is found, a warning will be logged.\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <md-radio-button value=\"1\" aria-label=\"Label 1\">\n *   Label 1\n * </md-radio-button>\n *\n * <md-radio-button ng-model=\"color\" ng-value=\"specialValue\" aria-label=\"Green\">\n *   Green\n * </md-radio-button>\n *\n * </hljs>\n *\n */\nfunction mdRadioButtonDirective($mdAria, $mdUtil, $mdTheming) {\n\n  var CHECKED_CSS = 'md-checked';\n\n  return {\n    restrict: 'E',\n    require: '^mdRadioGroup',\n    transclude: true,\n    template: '<div class=\"md-container\" md-ink-ripple md-ink-ripple-checkbox>' +\n                '<div class=\"md-off\"></div>' +\n                '<div class=\"md-on\"></div>' +\n              '</div>' +\n              '<div ng-transclude class=\"md-label\"></div>',\n    link: link\n  };\n\n  function link(scope, element, attr, rgCtrl) {\n    var lastChecked;\n\n    $mdTheming(element);\n    configureAria(element, scope);\n\n    rgCtrl.add(render);\n    attr.$observe('value', render);\n\n    element\n      .on('click', listener)\n      .on('$destroy', function() {\n        rgCtrl.remove(render);\n      });\n\n    function listener(ev) {\n      if (element[0].hasAttribute('disabled')) return;\n\n      scope.$apply(function() {\n        rgCtrl.setViewValue(attr.value, ev && ev.type);\n      });\n    }\n\n    function render() {\n      var checked = (rgCtrl.getViewValue() == attr.value);\n      if (checked === lastChecked) {\n        return;\n      }\n      lastChecked = checked;\n      element.attr('aria-checked', checked);\n      if (checked) {\n        element.addClass(CHECKED_CSS);\n        rgCtrl.setActiveDescendant(element.attr('id'));\n      } else {\n        element.removeClass(CHECKED_CSS);\n      }\n    }\n    /**\n     * Inject ARIA-specific attributes appropriate for each radio button\n     */\n    function configureAria( element, scope ){\n      scope.ariaId = buildAriaID();\n\n      element.attr({\n        'id' :  scope.ariaId,\n        'role' : 'radio',\n        'aria-checked' : 'false'\n      });\n\n      $mdAria.expectWithText(element, 'aria-label');\n\n      /**\n       * Build a unique ID for each radio button that will be used with aria-activedescendant.\n       * Preserve existing ID if already specified.\n       * @returns {*|string}\n       */\n      function buildAriaID() {\n        return attr.id || ( 'radio' + \"_\" + $mdUtil.nextUid() );\n      }\n    }\n  }\n}\nmdRadioButtonDirective.$inject = [\"$mdAria\", \"$mdUtil\", \"$mdTheming\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sidenav/bower.json",
    "content": "{\n  \"name\": \"angular-material-sidenav\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-backdrop\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sidenav/sidenav-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-sidenav.md-THEME_NAME-theme {\n  background-color: '{{background-hue-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sidenav/sidenav.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-sidenav {\n  position: absolute;\n  width: 304px;\n  min-width: 304px;\n  bottom: 0;\n  z-index: 60;\n  background-color: white;\n  overflow: auto;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column; }\n  md-sidenav.md-closed {\n    display: none; }\n  md-sidenav.md-closed-add, md-sidenav.md-closed-remove {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    /* this is required as of 1.3x to properly\n       apply all styling in a show/hide animation */\n    -webkit-transition: 0s all;\n            transition: 0s all; }\n  md-sidenav.md-closed-add.md-closed-add-active, md-sidenav.md-closed-remove.md-closed-remove-active {\n    -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-sidenav.md-locked-open-add, md-sidenav.md-locked-open-remove {\n    position: static;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open {\n    width: 304px;\n    min-width: 304px; }\n  md-sidenav.md-locked-open, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-left, md-sidenav.md-locked-open.md-closed, md-sidenav.md-locked-open.md-closed.md-sidenav-right, md-sidenav.md-locked-open-remove.md-closed {\n    position: static;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n  md-sidenav.md-locked-open-remove-active {\n    -webkit-transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n            transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 0;\n    min-width: 0; }\n  md-sidenav.md-closed.md-locked-open-add {\n    width: 0;\n    min-width: 0;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n  md-sidenav.md-closed.md-locked-open-add-active {\n    -webkit-transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n            transition: width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2), min-width 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n    width: 304px;\n    min-width: 304px;\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n\n.md-sidenav-backdrop.md-locked-open {\n  display: none; }\n\n.md-sidenav-left, md-sidenav {\n  left: 0;\n  top: 0;\n  -webkit-transform: translate3d(0%, 0, 0);\n          transform: translate3d(0%, 0, 0); }\n  .md-sidenav-left.md-closed, md-sidenav.md-closed {\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0); }\n\n.md-sidenav-right {\n  left: 100%;\n  top: 0;\n  -webkit-transform: translate3d(-100%, 0, 0);\n          transform: translate3d(-100%, 0, 0); }\n  .md-sidenav-right.md-closed {\n    -webkit-transform: translate3d(0%, 0, 0);\n            transform: translate3d(0%, 0, 0); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sidenav/sidenav.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.sidenav\n *\n * @description\n * A Sidenav QP component.\n */\nangular.module('material.components.sidenav', [\n    'material.core',\n    'material.components.backdrop'\n  ])\n  .factory('$mdSidenav', SidenavService )\n  .directive('mdSidenav', SidenavDirective)\n  .controller('$mdSidenavController', SidenavController);\n\n\n/**\n * @private\n * @ngdoc service\n * @name $mdSidenav\n * @module material.components.sidenav\n *\n * @description\n * $mdSidenav makes it easy to interact with multiple sidenavs\n * in an app.\n *\n * @usage\n *\n * ```javascript\n * // Toggle the given sidenav\n * $mdSidenav(componentId).toggle();\n *\n * // Open the given sidenav\n * $mdSidenav(componentId).open();\n *\n * // Close the given sidenav\n * $mdSidenav(componentId).close();\n * ```\n */\nfunction SidenavService($mdComponentRegistry, $q) {\n  return function(handle) {\n    var errorMsg = \"SideNav '\" + handle + \"' is not available!\";\n\n    // Lookup the controller instance for the specified sidNav instance\n    var instance = $mdComponentRegistry.get(handle);\n    if(!instance) {\n      $mdComponentRegistry.notFoundError(handle);\n    }\n\n    return {\n      isOpen: function() {\n        return instance && instance.isOpen();\n      },\n      toggle: function() {\n        return instance ? instance.toggle() : $q.reject(errorMsg);\n      },\n      open: function() {\n        return instance ? instance.open() : $q.reject(errorMsg);\n      },\n      close: function() {\n        return instance ? instance.close() : $q.reject(errorMsg);\n      }\n    };\n  };\n}\nSidenavService.$inject = [\"$mdComponentRegistry\", \"$q\"];\n\n/**\n * @ngdoc directive\n * @name mdSidenav\n * @module material.components.sidenav\n * @restrict E\n *\n * @description\n *\n * A Sidenav component that can be opened and closed programatically.\n *\n * By default, upon opening it will slide out on top of the main content area.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"row\" ng-controller=\"MyController\">\n *   <md-sidenav md-component-id=\"left\" class=\"md-sidenav-left\">\n *     Left Nav!\n *   </md-sidenav>\n *\n *   <md-content>\n *     Center Content\n *     <md-button ng-click=\"openLeftMenu()\">\n *       Open Left Menu\n *     </md-button>\n *   </md-content>\n *\n *   <md-sidenav md-component-id=\"right\"\n *     md-is-locked-open=\"$media('min-width: 333px')\"\n *     class=\"md-sidenav-right\">\n *     Right Nav!\n *   </md-sidenav>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('myApp', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdSidenav) {\n *   $scope.openLeftMenu = function() {\n *     $mdSidenav('left').toggle();\n *   };\n * });\n * </hljs>\n *\n * @param {expression=} md-is-open A model bound to whether the sidenav is opened.\n * @param {string=} md-component-id componentId to use with $mdSidenav service.\n * @param {expression=} md-is-locked-open When this expression evalutes to true,\n * the sidenav 'locks open': it falls into the content's flow instead\n * of appearing over it. This overrides the `is-open` attribute.\n *\n * A $media() function is exposed to the is-locked-open attribute, which\n * can be given a media query or one of the `sm`, `gt-sm`, `md`, `gt-md`, `lg` or `gt-lg` presets.\n * Examples:\n *\n *   - `<md-sidenav md-is-locked-open=\"shouldLockOpen\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('min-width: 1000px')\"></md-sidenav>`\n *   - `<md-sidenav md-is-locked-open=\"$media('sm')\"></md-sidenav>` (locks open on small screens)\n */\nfunction SidenavDirective($timeout, $animate, $parse, $mdMedia, $mdConstant, $compile, $mdTheming, $q, $document) {\n  return {\n    restrict: 'E',\n    scope: {\n      isOpen: '=?mdIsOpen'\n    },\n    controller: '$mdSidenavController',\n    compile: function(element) {\n      element.addClass('md-closed');\n      element.attr('tabIndex', '-1');\n      return postLink;\n    }\n  };\n\n  /**\n   * Directive Post Link function...\n   */\n  function postLink(scope, element, attr, sidenavCtrl) {\n    var triggeringElement = null;\n    var promise = $q.when(true);\n\n    var isLockedOpenParsed = $parse(attr.mdIsLockedOpen);\n    var isLocked = function() {\n      return isLockedOpenParsed(scope.$parent, {\n        $media: $mdMedia\n      });\n    };\n    var backdrop = $compile(\n      '<md-backdrop class=\"md-sidenav-backdrop md-opaque ng-enter\">'\n    )(scope);\n\n    element.on('$destroy', sidenavCtrl.destroy);\n    $mdTheming.inherit(backdrop, element);\n\n    scope.$watch(isLocked, updateIsLocked);\n    scope.$watch('isOpen', updateIsOpen);\n\n\n    // Publish special accessor for the Controller instance\n    sidenavCtrl.$toggleOpen = toggleOpen;\n\n    /**\n     * Toggle the DOM classes to indicate `locked`\n     * @param isLocked\n     */\n    function updateIsLocked(isLocked, oldValue) {\n      if (isLocked === oldValue) {\n        element.toggleClass('md-locked-open', !!isLocked);\n      } else {\n        $animate[isLocked ? 'addClass' : 'removeClass'](element, 'md-locked-open');\n      }\n      backdrop.toggleClass('md-locked-open', !!isLocked);\n    }\n\n    /**\n     * Toggle the SideNav view and attach/detach listeners\n     * @param isOpen\n     */\n    function updateIsOpen(isOpen) {\n      var parent = element.parent();\n\n      parent[isOpen ? 'on' : 'off']('keydown', onKeyDown);\n      backdrop[isOpen ? 'on' : 'off']('click', close);\n\n      if ( isOpen ) {\n        // Capture upon opening..\n        triggeringElement = $document[0].activeElement;\n      }\n\n      return promise = $q.all([\n        $animate[isOpen ? 'enter' : 'leave'](backdrop, parent),\n        $animate[isOpen ? 'removeClass' : 'addClass'](element, 'md-closed').then(function() {\n          // If we opened, and haven't closed again before the animation finished\n          if (scope.isOpen) {\n            element.focus();\n          }\n        })\n      ]);\n    }\n\n    /**\n     * Toggle the sideNav view and publish a promise to be resolved when\n     * the view animation finishes.\n     *\n     * @param isOpen\n     * @returns {*}\n     */\n    function toggleOpen( isOpen ) {\n      if (scope.isOpen == isOpen ) {\n\n        return $q.when(true);\n\n      } else {\n        var deferred = $q.defer();\n\n        // Toggle value to force an async `updateIsOpen()` to run\n        scope.isOpen = isOpen;\n\n        $timeout(function() {\n\n          // When the current `updateIsOpen()` animation finishes\n          promise.then(function(result){\n\n            if ( !scope.isOpen ) {\n              // reset focus to originating element (if available) upon close\n              triggeringElement && triggeringElement.focus();\n              triggeringElement = null;\n            }\n\n            deferred.resolve(result);\n          });\n\n        },0,false);\n\n        return deferred.promise;\n      }\n    }\n\n    /**\n     * Auto-close sideNav when the `escape` key is pressed.\n     * @param evt\n     */\n    function onKeyDown(ev) {\n      var isEscape = (ev.keyCode === $mdConstant.KEY_CODE.ESCAPE);\n      return isEscape ? close(ev) : $q.when(true);\n    }\n\n    /**\n     * With backdrop `clicks` or `escape` key-press, immediately\n     * apply the CSS close transition... Then notify the controller\n     * to close() and perform its own actions.\n     */\n    function close(ev) {\n      ev.preventDefault();\n      ev.stopPropagation();\n\n      return sidenavCtrl.close();\n    }\n\n  }\n}\nSidenavDirective.$inject = [\"$timeout\", \"$animate\", \"$parse\", \"$mdMedia\", \"$mdConstant\", \"$compile\", \"$mdTheming\", \"$q\", \"$document\"];\n\n/*\n * @private\n * @ngdoc controller\n * @name SidenavController\n * @module material.components.sidenav\n *\n */\nfunction SidenavController($scope, $element, $attrs, $mdComponentRegistry, $q) {\n\n  var self = this;\n\n  // Use Default internal method until overridden by directive postLink\n\n  self.$toggleOpen = function() { return $q.when($scope.isOpen); };\n  self.isOpen = function() { return !!$scope.isOpen; };\n  self.open   = function() { return self.$toggleOpen( true );  };\n  self.close  = function() { return self.$toggleOpen( false ); };\n  self.toggle = function() { return self.$toggleOpen( !$scope.isOpen );  };\n\n  self.destroy = $mdComponentRegistry.register(self, $attrs.mdComponentId);\n}\nSidenavController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$mdComponentRegistry\", \"$q\"];\n\n\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/slider/bower.json",
    "content": "{\n  \"name\": \"angular-material-slider\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/slider/slider-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-slider.md-THEME_NAME-theme .md-track {\n  background-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track-ticks {\n  background-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-thumb {\n  background-color: '{{foreground-2}}'; }\nmd-slider.md-THEME_NAME-theme .md-focus-ring {\n  border-color: '{{foreground-4}}'; }\nmd-slider.md-THEME_NAME-theme .md-disabled-thumb {\n  border-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme.md-min .md-thumb:after {\n  background-color: '{{background-hue-3}}'; }\nmd-slider.md-THEME_NAME-theme .md-track.md-track-fill {\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb:after {\n  border-color: '{{primary-color}}';\n  background-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-sign {\n  background-color: '{{primary-color}}'; }\n  md-slider.md-THEME_NAME-theme .md-sign:after {\n    border-top-color: '{{primary-color}}'; }\nmd-slider.md-THEME_NAME-theme .md-thumb-text {\n  color: '{{primary-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-track-fill {\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb:after {\n  border-color: '{{warn-color}}';\n  background-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-sign {\n  background-color: '{{warn-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-warn .md-sign:after {\n    border-top-color: '{{warn-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-warn .md-thumb-text {\n  color: '{{warn-contrast}}'; }\nmd-slider.md-THEME_NAME-theme.md-accent .md-track-fill {\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-accent .md-thumb:after {\n  border-color: '{{accent-color}}';\n  background-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-accent .md-sign {\n  background-color: '{{accent-color}}'; }\n  md-slider.md-THEME_NAME-theme.md-accent .md-sign:after {\n    border-top-color: '{{accent-color}}'; }\nmd-slider.md-THEME_NAME-theme.md-accent .md-thumb-text {\n  color: '{{accent-contrast}}'; }\nmd-slider.md-THEME_NAME-theme[disabled] .md-thumb:after {\n  border-color: '{{foreground-3}}'; }\nmd-slider.md-THEME_NAME-theme[disabled]:not(.md-min) .md-thumb:after {\n  background-color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/slider/slider.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n@-webkit-keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@keyframes sliderFocusThumb {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0);\n            transform: scale(0); }\n\n  50% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\nmd-slider {\n  height: 48px;\n  position: relative;\n  display: block;\n  margin-left: 4px;\n  margin-right: 4px;\n  /**\n   * Track\n   */\n  /**\n   * Slider thumb\n   */\n  /* The sign that's focused in discrete mode */\n  /**\n   * The border/background that comes in when focused in non-discrete mode\n   */\n  /* Don't animate left/right while panning */ }\n  md-slider .md-track-container {\n    width: 100%;\n    position: absolute;\n    top: 23px;\n    height: 2px; }\n  md-slider .md-track {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-track-fill {\n    -webkit-transition: width 0.05s linear;\n            transition: width 0.05s linear; }\n  md-slider .md-track-ticks {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 100%; }\n  md-slider .md-thumb-container {\n    position: absolute;\n    left: 0;\n    top: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    -webkit-transition: -webkit-transform 0.1s linear;\n            transition: transform 0.1s linear; }\n  md-slider .md-thumb {\n    z-index: 1;\n    position: absolute;\n    left: -19px;\n    top: 5px;\n    width: 38px;\n    height: 38px;\n    border-radius: 38px;\n    -webkit-transform: scale(0.5);\n            transform: scale(0.5);\n    -webkit-transition: all 0.1s linear;\n            transition: all 0.1s linear; }\n    md-slider .md-thumb:after {\n      content: '';\n      position: absolute;\n      left: 3px;\n      top: 3px;\n      width: 32px;\n      height: 32px;\n      border-radius: 32px;\n      border: 3px solid; }\n  md-slider .md-sign {\n    /* Center the children (slider-thumb-text) */\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center;\n    -webkit-box-pack: center;\n    -webkit-justify-content: center;\n        -ms-flex-pack: center;\n            justify-content: center;\n    position: absolute;\n    left: -14px;\n    top: -20px;\n    width: 28px;\n    height: 28px;\n    border-radius: 28px;\n    -webkit-transform: scale(0.4) translate3d(0, 70px, 0);\n            transform: scale(0.4) translate3d(0, 70px, 0);\n    -webkit-transition: all 0.2s ease-in-out;\n            transition: all 0.2s ease-in-out;\n    /* The arrow pointing down under the sign */ }\n    md-slider .md-sign:after {\n      position: absolute;\n      content: '';\n      left: 0px;\n      border-radius: 16px;\n      top: 19px;\n      border-left: 14px solid transparent;\n      border-right: 14px solid transparent;\n      border-top: 16px solid;\n      opacity: 0;\n      -webkit-transform: translate3d(0, -8px, 0);\n              transform: translate3d(0, -8px, 0);\n      -webkit-transition: all 0.2s ease-in-out;\n              transition: all 0.2s ease-in-out; }\n    md-slider .md-sign .md-thumb-text {\n      z-index: 1;\n      font-size: 12px;\n      font-weight: bold; }\n  md-slider .md-focus-thumb {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    display: none;\n    opacity: 0;\n    background-color: #C0C0C0;\n    -webkit-animation: sliderFocusThumb 0.4s linear;\n            animation: sliderFocusThumb 0.4s linear; }\n  md-slider .md-focus-ring {\n    position: absolute;\n    left: -24px;\n    top: 0px;\n    width: 48px;\n    height: 48px;\n    border-radius: 48px;\n    border: 2px solid #D6D6D6;\n    background-color: transparent;\n    -webkit-transform: scale(0);\n            transform: scale(0);\n    -webkit-transition: all 0.2s linear;\n            transition: all 0.2s linear; }\n  md-slider .md-disabled-thumb {\n    position: absolute;\n    left: -22px;\n    top: 2px;\n    width: 44px;\n    height: 44px;\n    border-radius: 44px;\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    border: 6px solid;\n    display: none; }\n  md-slider.md-min .md-thumb:after {\n    background-color: white; }\n  md-slider.md-min .md-sign {\n    opacity: 0; }\n  md-slider:focus {\n    outline: none; }\n  md-slider.panning .md-thumb-container, md-slider.panning .md-track-fill {\n    -webkit-transition: none;\n            transition: none; }\n  md-slider:not([md-discrete]) {\n    /* Hide the sign and ticks in non-discrete mode */ }\n    md-slider:not([md-discrete]) .md-track-ticks, md-slider:not([md-discrete]) .md-sign {\n      display: none; }\n    md-slider:not([md-discrete]):not([disabled]):hover .md-thumb {\n      -webkit-transform: scale(0.6);\n              transform: scale(0.6); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-focus-thumb {\n      display: block; }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-focus-ring, md-slider:not([md-discrete]):not([disabled]).active .md-focus-ring {\n      -webkit-transform: scale(1);\n              transform: scale(1); }\n    md-slider:not([md-discrete]):not([disabled]):focus .md-thumb, md-slider:not([md-discrete]):not([disabled]).active .md-thumb {\n      -webkit-transform: scale(0.85);\n              transform: scale(0.85); }\n  md-slider[md-discrete] {\n    /* Hide the focus thumb in discrete mode */ }\n    md-slider[md-discrete] .md-focus-thumb, md-slider[md-discrete] .md-focus-ring {\n      display: none; }\n    md-slider[md-discrete]:not([disabled]):focus .md-sign, md-slider[md-discrete]:not([disabled]):focus .md-sign:after, md-slider[md-discrete]:not([disabled]).active .md-sign, md-slider[md-discrete]:not([disabled]).active .md-sign:after {\n      opacity: 1;\n      -webkit-transform: translate3d(0, 0, 0) scale(1);\n              transform: translate3d(0, 0, 0) scale(1); }\n  md-slider[disabled] .md-track-fill {\n    display: none; }\n  md-slider[disabled] .md-sign {\n    display: none; }\n  md-slider[disabled] .md-thumb {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35); }\n  md-slider[disabled] .md-disabled-thumb {\n    display: block; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/slider/slider.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.slider\n */\nangular.module('material.components.slider', [\n  'material.core'\n])\n  .directive('mdSlider', SliderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSlider\n * @module material.components.slider\n * @restrict E\n * @description\n * The `<md-slider>` component allows the user to choose from a range of\n * values.\n *\n * It has two modes: 'normal' mode, where the user slides between a wide range\n * of values, and 'discrete' mode, where the user slides between only a few\n * select values.\n *\n * To enable discrete mode, add the `md-discrete` attribute to a slider,\n * and use the `step` attribute to change the distance between\n * values the user is allowed to pick.\n *\n * @usage\n * <h4>Normal Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider ng-model=\"myValue\" min=\"5\" max=\"500\">\n * </md-slider>\n * </hljs>\n * <h4>Discrete Mode</h4>\n * <hljs lang=\"html\">\n * <md-slider md-discrete ng-model=\"myDiscreteValue\" step=\"10\" min=\"10\" max=\"130\">\n * </md-slider>\n * </hljs>\n *\n * @param {boolean=} md-discrete Whether to enable discrete mode.\n * @param {number=} step The distance between values the user is allowed to pick. Default 1.\n * @param {number=} min The minimum value the user is allowed to pick. Default 0.\n * @param {number=} max The maximum value the user is allowed to pick. Default 100.\n */\nfunction SliderDirective($mdTheming) {\n  return {\n    scope: {},\n    require: ['?ngModel', 'mdSlider'],\n    controller: SliderController,\n    template:\n      '<div class=\"md-track-container\">' +\n        '<div class=\"md-track\"></div>' +\n        '<div class=\"md-track md-track-fill\"></div>' +\n        '<div class=\"md-track-ticks\"></div>' +\n      '</div>' +\n      '<div class=\"md-thumb-container\">' +\n        '<div class=\"md-thumb\"></div>' +\n        '<div class=\"md-focus-thumb\"></div>' +\n        '<div class=\"md-focus-ring\"></div>' +\n        '<div class=\"md-sign\">' +\n          '<span class=\"md-thumb-text\"></span>' +\n        '</div>' +\n        '<div class=\"md-disabled-thumb\"></div>' +\n      '</div>',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    $mdTheming(element);\n    var ngModelCtrl = ctrls[0] || {\n      // Mock ngModelController if it doesn't exist to give us\n      // the minimum functionality needed\n      $setViewValue: function(val) {\n        this.$viewValue = val;\n        this.$viewChangeListeners.forEach(function(cb) { cb(); });\n      },\n      $parsers: [],\n      $formatters: [],\n      $viewChangeListeners: []\n    };\n\n    var sliderCtrl = ctrls[1];\n    sliderCtrl.init(ngModelCtrl);\n  }\n}\nSliderDirective.$inject = [\"$mdTheming\"];\n\n/**\n * We use a controller for all the logic so that we can expose a few\n * things to unit tests\n */\nfunction SliderController($scope, $element, $attrs, $$rAF, $window, $mdAria, $mdUtil, $mdConstant) {\n\n  this.init = function init(ngModelCtrl) {\n    var thumb = angular.element($element[0].querySelector('.md-thumb'));\n    var thumbText = angular.element($element[0].querySelector('.md-thumb-text'));\n    var thumbContainer = thumb.parent();\n    var trackContainer = angular.element($element[0].querySelector('.md-track-container'));\n    var activeTrack = angular.element($element[0].querySelector('.md-track-fill'));\n    var tickContainer = angular.element($element[0].querySelector('.md-track-ticks'));\n    var throttledRefreshDimensions = $mdUtil.throttle(refreshSliderDimensions, 5000);\n\n    // Default values, overridable by $attrss\n    $attrs.min ? $attrs.$observe('min', updateMin) : updateMin(0);\n    $attrs.max ? $attrs.$observe('max', updateMax) : updateMax(100);\n    $attrs.step ? $attrs.$observe('step', updateStep) : updateStep(1);\n\n    // We have to manually stop the $watch on ngDisabled because it exists\n    // on the parent $scope, and won't be automatically destroyed when\n    // the component is destroyed.\n    var stopDisabledWatch = angular.noop;\n    if ($attrs.ngDisabled) {\n      stopDisabledWatch = $scope.$parent.$watch($attrs.ngDisabled, updateAriaDisabled);\n    }\n\n    $mdAria.expect($element, 'aria-label');\n\n    $element.attr('tabIndex', 0);\n    $element.attr('role', 'slider');\n    $element.on('keydown', keydownListener);\n\n    var hammertime = new Hammer($element[0], {\n      recognizers: [\n        [Hammer.Pan, { direction: Hammer.DIRECTION_HORIZONTAL }]\n      ]\n    });\n    hammertime.on('hammer.input', onInput);\n    hammertime.on('panstart', onPanStart);\n    hammertime.on('pan', onPan);\n    hammertime.on('panend', onPanEnd);\n\n    // On resize, recalculate the slider's dimensions and re-render\n    function updateAll() {\n      refreshSliderDimensions();\n      ngModelRender();\n      redrawTicks();\n    }\n    setTimeout(updateAll);\n\n    var debouncedUpdateAll = $$rAF.debounce(updateAll);\n    angular.element($window).on('resize', debouncedUpdateAll);\n\n    $scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdateAll);\n      hammertime.destroy();\n      stopDisabledWatch();\n    });\n\n    ngModelCtrl.$render = ngModelRender;\n    ngModelCtrl.$viewChangeListeners.push(ngModelRender);\n    ngModelCtrl.$formatters.push(minMaxValidator);\n    ngModelCtrl.$formatters.push(stepValidator);\n\n    /**\n     * Attributes\n     */\n    var min;\n    var max;\n    var step;\n    function updateMin(value) {\n      min = parseFloat(value);\n      $element.attr('aria-valuemin', value);\n      updateAll();\n    }\n    function updateMax(value) {\n      max = parseFloat(value);\n      $element.attr('aria-valuemax', value);\n      updateAll();\n    }\n    function updateStep(value) {\n      step = parseFloat(value);\n      redrawTicks();\n    }\n    function updateAriaDisabled(isDisabled) {\n      $element.attr('aria-disabled', !!isDisabled);\n    }\n\n    // Draw the ticks with canvas.\n    // The alternative to drawing ticks with canvas is to draw one $element for each tick,\n    // which could quickly become a performance bottleneck.\n    var tickCanvas, tickCtx;\n    function redrawTicks() {\n      if (!angular.isDefined($attrs.mdDiscrete)) return;\n\n      var numSteps = Math.floor( (max - min) / step );\n      if (!tickCanvas) {\n        var trackTicksStyle = $window.getComputedStyle(tickContainer[0]);\n        tickCanvas = angular.element('<canvas style=\"position:absolute;\">');\n        tickCtx = tickCanvas[0].getContext('2d');\n        tickCtx.fillStyle = trackTicksStyle.backgroundColor || 'black';\n        tickContainer.append(tickCanvas);\n      }\n      var dimensions = getSliderDimensions();\n      tickCanvas[0].width = dimensions.width;\n      tickCanvas[0].height = dimensions.height;\n\n      var distance;\n      for (var i = 0; i <= numSteps; i++) {\n        distance = Math.floor(dimensions.width * (i / numSteps));\n        tickCtx.fillRect(distance - 1, 0, 2, dimensions.height);\n      }\n    }\n\n\n    /**\n     * Refreshing Dimensions\n     */\n    var sliderDimensions = {};\n    refreshSliderDimensions();\n    function refreshSliderDimensions() {\n      sliderDimensions = trackContainer[0].getBoundingClientRect();\n    }\n    function getSliderDimensions() {\n      throttledRefreshDimensions();\n      return sliderDimensions;\n    }\n\n    /**\n     * left/right arrow listener\n     */\n    function keydownListener(ev) {\n      if($element[0].hasAttribute('disabled')) {\n        return;\n      }\n\n      var changeAmount;\n      if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n        changeAmount = -step;\n      } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n        changeAmount = step;\n      }\n      if (changeAmount) {\n        if (ev.metaKey || ev.ctrlKey || ev.altKey) {\n          changeAmount *= 4;\n        }\n        ev.preventDefault();\n        ev.stopPropagation();\n        $scope.$evalAsync(function() {\n          setModelValue(ngModelCtrl.$viewValue + changeAmount);\n        });\n      }\n    }\n\n    /**\n     * ngModel setters and validators\n     */\n    function setModelValue(value) {\n      ngModelCtrl.$setViewValue( minMaxValidator(stepValidator(value)) );\n    }\n    function ngModelRender() {\n\n      if (isNaN(ngModelCtrl.$viewValue)) {\n        ngModelCtrl.$viewValue = ngModelCtrl.$modelValue;\n      }\n\n      var percent = (ngModelCtrl.$viewValue - min) / (max - min);\n      $scope.modelValue = ngModelCtrl.$viewValue;\n      $element.attr('aria-valuenow', ngModelCtrl.$viewValue);\n      setSliderPercent(percent);\n      thumbText.text( ngModelCtrl.$viewValue );\n    }\n\n    function minMaxValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.max(min, Math.min(max, value));\n      }\n    }\n    function stepValidator(value) {\n      if (angular.isNumber(value)) {\n        return Math.round(value / step) * step;\n      }\n    }\n\n    /**\n     * @param percent 0-1\n     */\n    function setSliderPercent(percent) {\n      activeTrack.css('width', (percent * 100) + '%');\n      thumbContainer.css(\n        $mdConstant.CSS.TRANSFORM,\n        'translate3d(' + getSliderDimensions().width * percent + 'px,0,0)'\n      );\n      $element.toggleClass('md-min', percent === 0);\n    }\n\n\n    /**\n     * Slide listeners\n     */\n    var isSliding = false;\n    var isDiscrete = angular.isDefined($attrs.mdDiscrete);\n\n    function onInput(ev) {\n      if (!isSliding && ev.eventType === Hammer.INPUT_START &&\n          !$element[0].hasAttribute('disabled')) {\n\n        isSliding = true;\n\n        $element.addClass('active');\n        $element[0].focus();\n        refreshSliderDimensions();\n\n        onPan(ev);\n\n        ev.srcEvent.stopPropagation();\n\n      } else if (isSliding && ev.eventType === Hammer.INPUT_END) {\n\n        if ( isSliding && isDiscrete ) onPanEnd(ev);\n        isSliding = false;\n\n        $element.removeClass('panning active');\n      }\n    }\n    function onPanStart() {\n      if (!isSliding) return;\n      $element.addClass('panning');\n    }\n    function onPan(ev) {\n      if (!isSliding) return;\n\n      // While panning discrete, update only the\n      // visual positioning but not the model value.\n\n      if ( isDiscrete ) adjustThumbPosition( ev.center.x );\n      else              doSlide( ev.center.x );\n\n      ev.preventDefault();\n      ev.srcEvent.stopPropagation();\n    }\n\n    function onPanEnd(ev) {\n      if ( isDiscrete && !$element[0].hasAttribute('disabled') ) {\n        // Convert exact to closest discrete value.\n        // Slide animate the thumb... and then update the model value.\n\n        var exactVal = percentToValue( positionToPercent( ev.center.x ));\n        var closestVal = minMaxValidator( stepValidator(exactVal) );\n\n        setSliderPercent( valueToPercent(closestVal));\n        $$rAF(function(){\n          setModelValue( closestVal );\n        });\n\n        ev.preventDefault();\n        ev.srcEvent.stopPropagation();\n      }\n    }\n\n    /**\n     * Expose for testing\n     */\n    this._onInput = onInput;\n    this._onPanStart = onPanStart;\n    this._onPan = onPan;\n\n    /**\n     * Slide the UI by changing the model value\n     * @param x\n     */\n    function doSlide( x ) {\n      $scope.$evalAsync( function() {\n        setModelValue( percentToValue( positionToPercent(x) ));\n      });\n    }\n\n    /**\n     * Slide the UI without changing the model (while dragging/panning)\n     * @param x\n     */\n    function adjustThumbPosition( x ) {\n      var exactVal = percentToValue( positionToPercent( x ));\n      var closestVal = minMaxValidator( stepValidator(exactVal) );\n      setSliderPercent( positionToPercent(x) );\n      thumbText.text( closestVal );\n    }\n\n    /**\n     * Convert horizontal position on slider to percentage value of offset from beginning...\n     * @param x\n     * @returns {number}\n     */\n    function positionToPercent( x ) {\n      return Math.max(0, Math.min(1, (x - sliderDimensions.left) / (sliderDimensions.width)));\n    }\n\n    /**\n     * Convert percentage offset on slide to equivalent model value\n     * @param percent\n     * @returns {*}\n     */\n    function percentToValue( percent ) {\n      return (min + percent * (max - min));\n    }\n\n    function valueToPercent( val ) {\n      return (val - min)/(max - min);\n    }\n\n  };\n}\nSliderController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$$rAF\", \"$window\", \"$mdAria\", \"$mdUtil\", \"$mdConstant\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sticky/bower.json",
    "content": "{\n  \"name\": \"angular-material-sticky\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-content\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sticky/sticky.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n.md-sticky-clone {\n  z-index: 1;\n  top: 0;\n  left: 0;\n  right: 0;\n  position: absolute !important;\n  -webkit-transform: translate3d(-9999px, -9999px, 0);\n          transform: translate3d(-9999px, -9999px, 0); }\n  .md-sticky-clone[sticky-state=\"active\"] {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n    .md-sticky-clone[sticky-state=\"active\"]:not(.md-sticky-no-effect):after {\n      -webkit-animation: subheaderStickyHoverIn 0.3s ease-out both;\n              animation: subheaderStickyHoverIn 0.3s ease-out both; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/sticky/sticky.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/*\n * @ngdoc module\n * @name material.components.sticky\n * @description\n *\n * Sticky effects for md\n */\n\nangular.module('material.components.sticky', [\n  'material.core',\n  'material.components.content'\n])\n  .factory('$mdSticky', MdSticky);\n\n/*\n * @ngdoc service\n * @name $mdSticky\n * @module material.components.sticky\n *\n * @description\n * The `$mdSticky`service provides a mixin to make elements sticky.\n *\n * @returns A `$mdSticky` function that takes three arguments:\n *   - `scope`\n *   - `element`: The element that will be 'sticky'\n *   - `elementClone`: A clone of the element, that will be shown\n *     when the user starts scrolling past the original element.\n *     If not provided, it will use the result of `element.clone()`.\n */\n\nfunction MdSticky($document, $mdConstant, $compile, $$rAF, $mdUtil) {\n\n  var browserStickySupport = checkStickySupport();\n\n  /**\n   * Registers an element as sticky, used internally by directives to register themselves\n   */\n  return function registerStickyElement(scope, element, stickyClone) {\n    var contentCtrl = element.controller('mdContent');\n    if (!contentCtrl) return;\n\n    if (browserStickySupport) {\n      element.css({\n        position: browserStickySupport,\n        top: 0,\n        'z-index': 2\n      });\n    } else {\n      var $$sticky = contentCtrl.$element.data('$$sticky');\n      if (!$$sticky) {\n        $$sticky = setupSticky(contentCtrl);\n        contentCtrl.$element.data('$$sticky', $$sticky);\n      }\n\n      var deregister = $$sticky.add(element, stickyClone || element.clone());\n      scope.$on('$destroy', deregister);\n    }\n  };\n\n  function setupSticky(contentCtrl) {\n    var contentEl = contentCtrl.$element;\n\n    // Refresh elements is very expensive, so we use the debounced\n    // version when possible.\n    var debouncedRefreshElements = $$rAF.debounce(refreshElements);\n\n    // setupAugmentedScrollEvents gives us `$scrollstart` and `$scroll`,\n    // more reliable than `scroll` on android.\n    setupAugmentedScrollEvents(contentEl);\n    contentEl.on('$scrollstart', debouncedRefreshElements);\n    contentEl.on('$scroll', onScroll);\n\n    var self;\n    return self = {\n      prev: null,\n      current: null, //the currently stickied item\n      next: null,\n      items: [],\n      add: add,\n      refreshElements: refreshElements\n    };\n\n    /***************\n     * Public\n     ***************/\n    // Add an element and its sticky clone to this content's sticky collection\n    function add(element, stickyClone) {\n      stickyClone.addClass('md-sticky-clone');\n\n      var item = {\n        element: element,\n        clone: stickyClone\n      };\n      self.items.push(item);\n\n      contentEl.parent().prepend(item.clone);\n\n      debouncedRefreshElements();\n\n      return function remove() {\n        self.items.forEach(function(item, index) {\n          if (item.element[0] === element[0]) {\n            self.items.splice(index, 1);\n            item.clone.remove();\n          }\n        });\n        debouncedRefreshElements();\n      };\n    }\n\n    function refreshElements() {\n      // Sort our collection of elements by their current position in the DOM.\n      // We need to do this because our elements' order of being added may not\n      // be the same as their order of display.\n      self.items.forEach(refreshPosition);\n      self.items = self.items.sort(function(a, b) {\n        return a.top < b.top ? -1 : 1;\n      });\n\n      // Find which item in the list should be active, \n      // based upon the content's current scroll position\n      var item;\n      var currentScrollTop = contentEl.prop('scrollTop');\n      for (var i = self.items.length - 1; i >= 0; i--) {\n        if (currentScrollTop > self.items[i].top) {\n          item = self.items[i];\n          break;\n        }\n      }\n      setCurrentItem(item);\n    }\n\n\n    /***************\n     * Private\n     ***************/\n\n    // Find the `top` of an item relative to the content element,\n    // and also the height.\n    function refreshPosition(item) {\n      // Find the top of an item by adding to the offsetHeight until we reach the \n      // content element.\n      var current = item.element[0];\n      item.top = 0;\n      item.left = 0;\n      while (current && current !== contentEl[0]) {\n        item.top += current.offsetTop;\n        item.left += current.offsetLeft;\n        current = current.offsetParent;\n      }\n      item.height = item.element.prop('offsetHeight');\n      item.clone.css('margin-left', item.left + 'px');\n    }\n\n\n    // As we scroll, push in and select the correct sticky element.\n    function onScroll() {\n      var scrollTop = contentEl.prop('scrollTop');\n      var isScrollingDown = scrollTop > (onScroll.prevScrollTop || 0);\n      onScroll.prevScrollTop = scrollTop;\n\n      // At the top?\n      if (scrollTop === 0) {\n        setCurrentItem(null);\n\n      // Going to next item?\n      } else if (isScrollingDown && self.next) {\n        if (self.next.top - scrollTop <= 0) {\n          // Sticky the next item if we've scrolled past its position.\n          setCurrentItem(self.next);\n        } else if (self.current) {\n          // Push the current item up when we're almost at the next item.\n          if (self.next.top - scrollTop <= self.next.height) {\n            translate(self.current, self.next.top - self.next.height - scrollTop);\n          } else {\n            translate(self.current, null);\n          }\n        }\n        \n      // Scrolling up with a current sticky item?\n      } else if (!isScrollingDown && self.current) {\n        if (scrollTop < self.current.top) {\n          // Sticky the previous item if we've scrolled up past\n          // the original position of the currently stickied item.\n          setCurrentItem(self.prev);\n        }\n        // Scrolling up, and just bumping into the item above (just set to current)?\n        // If we have a next item bumping into the current item, translate\n        // the current item up from the top as it scrolls into view.\n        if (self.current && self.next) {\n          if (scrollTop >= self.next.top - self.current.height) {\n            translate(self.current, self.next.top - scrollTop - self.current.height);\n          } else {\n            translate(self.current, null);\n          }\n        }\n      }\n    }\n     \n   function setCurrentItem(item) {\n     if (self.current === item) return;\n     // Deactivate currently active item\n     if (self.current) {\n       translate(self.current, null);\n       setStickyState(self.current, null);\n     }\n\n     // Activate new item if given\n     if (item) {\n       setStickyState(item, 'active');\n     }\n\n     self.current = item;\n     var index = self.items.indexOf(item);\n     // If index === -1, index + 1 = 0. It works out.\n     self.next = self.items[index + 1];\n     self.prev = self.items[index - 1];\n     setStickyState(self.next, 'next');\n     setStickyState(self.prev, 'prev');\n   }\n\n   function setStickyState(item, state) {\n     if (!item || item.state === state) return;\n     if (item.state) {\n       item.clone.attr('sticky-prev-state', item.state);\n       item.element.attr('sticky-prev-state', item.state);\n     }\n     item.clone.attr('sticky-state', state);\n     item.element.attr('sticky-state', state);\n     item.state = state;\n   }\n\n   function translate(item, amount) {\n     if (!item) return;\n     if (amount === null || amount === undefined) {\n       if (item.translateY) {\n         item.translateY = null;\n         item.clone.css($mdConstant.CSS.TRANSFORM, '');\n       }\n     } else {\n       item.translateY = amount;\n       item.clone.css(\n         $mdConstant.CSS.TRANSFORM, \n         'translate3d(' + item.left + 'px,' + amount + 'px,0)'\n       );\n     }\n   }\n  }\n\n  // Function to check for browser sticky support\n  function checkStickySupport($el) {\n    var stickyProp;\n    var testEl = angular.element('<div>');\n    $document[0].body.appendChild(testEl[0]);\n\n    var stickyProps = ['sticky', '-webkit-sticky'];\n    for (var i = 0; i < stickyProps.length; ++i) {\n      testEl.css({position: stickyProps[i], top: 0, 'z-index': 2});\n      if (testEl.css('position') == stickyProps[i]) {\n        stickyProp = stickyProps[i];\n        break;\n      }\n    }\n    testEl.remove();\n    return stickyProp;\n  }\n\n  // Android 4.4 don't accurately give scroll events.\n  // To fix this problem, we setup a fake scroll event. We say:\n  // > If a scroll or touchmove event has happened in the last DELAY milliseconds, \n  //   then send a `$scroll` event every animationFrame.\n  // Additionally, we add $scrollstart and $scrollend events.\n  function setupAugmentedScrollEvents(element) {\n    var SCROLL_END_DELAY = 200;\n    var isScrolling;\n    var lastScrollTime;\n    element.on('scroll touchmove', function() {\n      if (!isScrolling) {\n        isScrolling = true;\n        $$rAF(loopScrollEvent);\n        element.triggerHandler('$scrollstart');\n      }\n      element.triggerHandler('$scroll');\n      lastScrollTime = +$mdUtil.now();\n    });\n\n    function loopScrollEvent() {\n      if (+$mdUtil.now() - lastScrollTime > SCROLL_END_DELAY) {\n        isScrolling = false;\n        element.triggerHandler('$scrollend');\n      } else {\n        element.triggerHandler('$scroll');\n        $$rAF(loopScrollEvent);\n      }\n    }\n  }\n\n}\nMdSticky.$inject = [\"$document\", \"$mdConstant\", \"$compile\", \"$$rAF\", \"$mdUtil\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/subheader/bower.json",
    "content": "{\n  \"name\": \"angular-material-subheader\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-sticky\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/subheader/subheader-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n.md-subheader.md-THEME_NAME-theme {\n  color: '{{ foreground-2-0.23 }}';\n  background-color: '{{background-hue-3}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-primary {\n    color: '{{primary-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-accent {\n    color: '{{accent-color}}'; }\n  .md-subheader.md-THEME_NAME-theme.md-warn {\n    color: '{{warn-color}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/subheader/subheader.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n@-webkit-keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@keyframes subheaderStickyHoverIn {\n  0% {\n    box-shadow: 0 0 0 0 transparent; }\n\n  100% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); } }\n\n@-webkit-keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n@keyframes subheaderStickyHoverOut {\n  0% {\n    box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.16); }\n\n  100% {\n    box-shadow: 0 0 0 0 transparent; } }\n\n.md-subheader {\n  display: block;\n  font-size: 0.9em;\n  font-weight: 400;\n  line-height: 1em;\n  padding: 16px 0px 16px 16px;\n  margin: 0 0 0 0;\n  margin-right: 16px;\n  position: relative; }\n  .md-subheader:not(.md-sticky-no-effect) {\n    -webkit-transition: 0.2s ease-out margin;\n            transition: 0.2s ease-out margin; }\n    .md-subheader:not(.md-sticky-no-effect):after {\n      position: absolute;\n      left: 0;\n      bottom: 0;\n      top: 0;\n      right: -16px;\n      content: ''; }\n    .md-subheader:not(.md-sticky-no-effect)[sticky-state=\"active\"] {\n      margin-top: -2px; }\n    .md-subheader:not(.md-sticky-no-effect):not(.md-sticky-clone)[sticky-prev-state=\"active\"]:after {\n      -webkit-animation: subheaderStickyHoverOut 0.3s ease-out both;\n              animation: subheaderStickyHoverOut 0.3s ease-out both; }\n  .md-subheader .md-subheader-content {\n    z-index: 1;\n    position: relative; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/subheader/subheader.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.subheader\n * @description\n * SubHeader module\n *\n *  Subheaders are special list tiles that delineate distinct sections of a\n *  list or grid list and are typically related to the current filtering or\n *  sorting criteria. Subheader tiles are either displayed inline with tiles or\n *  can be associated with content, for example, in an adjacent column.\n *\n *  Upon scrolling, subheaders remain pinned to the top of the screen and remain\n *  pinned until pushed on or off screen by the next subheader. @see [Material\n *  Design Specifications](https://www.google.com/design/spec/components/subheaders.html)\n *\n *  > To improve the visual grouping of content, use the system color for your subheaders.\n *\n */\nangular.module('material.components.subheader', [\n  'material.core',\n  'material.components.sticky'\n])\n  .directive('mdSubheader', MdSubheaderDirective);\n\n/**\n * @ngdoc directive\n * @name mdSubheader\n * @module material.components.subheader\n *\n * @restrict E\n *\n * @description\n * The `<md-subheader>` directive is a subheader for a section\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-subheader>Online Friends</md-subheader>\n * </hljs>\n */\n\nfunction MdSubheaderDirective($mdSticky, $compile, $mdTheming) {\n  return {\n    restrict: 'E',\n    replace: true,\n    transclude: true,\n    template: \n      '<h2 class=\"md-subheader\">' +\n        '<span class=\"md-subheader-content\"></span>' +\n      '</h2>',\n    compile: function(element, attr, transclude) {\n      var outerHTML = element[0].outerHTML;\n      return function postLink(scope, element, attr) {\n        $mdTheming(element);\n        function getContent(el) {\n          return angular.element(el[0].querySelector('.md-subheader-content'));\n        }\n\n        // Transclude the user-given contents of the subheader\n        // the conventional way.\n        transclude(scope, function(clone) {\n          getContent(element).append(clone);\n        });\n\n        // Create another clone, that uses the outer and inner contents\n        // of the element, that will be 'stickied' as the user scrolls.\n        transclude(scope, function(clone) {\n          var stickyClone = $compile(angular.element(outerHTML))(scope);\n          $mdTheming(stickyClone);\n          getContent(stickyClone).append(clone);\n          $mdSticky(scope, element, stickyClone);\n        });\n      };\n    }\n  };\n}\nMdSubheaderDirective.$inject = [\"$mdSticky\", \"$compile\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/swipe/bower.json",
    "content": "{\n  \"name\": \"angular-material-swipe\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {}\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/swipe/swipe.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n\n/**\n * @ngdoc module\n * @name material.components.swipe\n * @description Swipe module!\n */\nangular.module('material.components.swipe',[])\n  .factory('$mdSwipe', MdSwipeFactory)\n  .directive('mdSwipeLeft', MdSwipeLeftDirective)\n  .directive('mdSwipeRight', MdSwipeRightDirective);\n\n/*\n * @ngdoc service\n * @module material.components.swipe\n * @name $mdSwipe\n * @description\n * This service allows directives to easily attach swipe and pan listeners to\n * the specified element.\n */\n\nfunction MdSwipeFactory() {\n  // match expected API functionality\n  var attachNoop = function(){ return angular.noop; };\n\n  /**\n   * SwipeService constructor pre-captures scope and customized event types\n   *\n   * @param scope\n   * @param eventTypes\n   * @returns {*}\n   * @constructor\n   */\n  return function SwipeService(scope, eventTypes) {\n    if ( !eventTypes ) eventTypes = \"swipeleft swiperight\";\n\n    // publish configureFor() method for specific element instance\n    return function configureFor(element, onSwipeCallback, attachLater ) {\n      var hammertime = new Hammer(element[0], {\n        recognizers : addRecognizers([], eventTypes )\n      });\n\n      // Attach swipe listeners now\n      if ( !attachLater ) attachSwipe();\n\n      // auto-disconnect during destroy\n      scope.$on('$destroy', function() {\n        hammertime.destroy();\n      });\n\n      return attachSwipe;\n\n      // **********************\n      // Internal methods\n      // **********************\n\n      /**\n       * Delegate swipe event to callback function\n       * and ensure $digest is triggered.\n       *\n       * @param ev HammerEvent\n       */\n      function swipeHandler(ev) {\n\n        // Prevent triggering parent hammer listeners\n        ev.srcEvent.stopPropagation();\n\n        if ( angular.isFunction(onSwipeCallback) ) {\n          scope.$apply(function() {\n            onSwipeCallback(ev);\n          });\n        }\n      }\n\n      /**\n       * Enable listeners and return detach() fn\n       */\n      function attachSwipe() {\n        hammertime.on(eventTypes, swipeHandler );\n\n        return function detachSwipe() {\n          hammertime.off( eventTypes );\n        };\n      }\n\n      /**\n       * Add optional recognizers such as panleft, panright\n       */\n      function addRecognizers(list, events) {\n        var hasPanning = (events.indexOf(\"pan\") > -1);\n        var hasSwipe   = (events.indexOf(\"swipe\") > -1);\n\n        if (hasPanning) {\n          list.push([ Hammer.Pan, { direction: Hammer.DIRECTION_HORIZONTAL } ]);\n        }\n        if (hasSwipe) {\n          list.push([ Hammer.Swipe, { direction: Hammer.DIRECTION_HORIZONTAL } ]);\n        }\n\n        return list;\n      }\n\n    };\n  };\n}\n\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeLeft\n *\n * @restrict A\n *\n * @description\n * The `<div  md-swipe-left=\"expression\">` directive identifies an element on which\n * HammerJS horizontal swipe left and pan left support will be active. The swipe/pan action\n * can result in custom activity trigger by evaluating `expression`.\n *\n * @param {boolean=} mdNoPan Use of attribute indicates flag to disable detection of `panleft` activity\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <div class=\"animate-switch-container\"\n *      ng-switch on=\"data.selectedIndex\"\n *      md-swipe-left=\"data.selectedIndex+=1;\"\n *      md-swipe-right=\"data.selectedIndex-=1;\" >\n *\n * </div>\n * </hljs>\n *\n */\nfunction MdSwipeLeftDirective($parse, $mdSwipe) {\n  return {\n    restrict: 'A',\n    link :  swipePostLink( $parse, $mdSwipe, \"SwipeLeft\" )\n  };\n}\nMdSwipeLeftDirective.$inject = [\"$parse\", \"$mdSwipe\"];\n\n/**\n * @ngdoc directive\n * @module material.components.swipe\n * @name mdSwipeRight\n *\n * @restrict A\n *\n * @description\n * The `<div  md-swipe-right=\"expression\">` directive identifies functionality\n * that attaches HammerJS horizontal swipe right and pan right support to an element. The swipe/pan action\n * can result in activity trigger by evaluating `expression`\n *\n * @param {boolean=} mdNoPan Use of attribute indicates flag to disable detection of `panright` activity\n *\n * @usage\n * <hljs lang=\"html\">\n *\n * <div class=\"animate-switch-container\"\n *      ng-switch on=\"data.selectedIndex\"\n *      md-swipe-left=\"data.selectedIndex+=1;\"\n *      md-swipe-right=\"data.selectedIndex-=1;\" >\n *\n * </div>\n * </hljs>\n *\n */\nfunction MdSwipeRightDirective($parse, $mdSwipe) {\n  return {\n    restrict: 'A',\n    link :  swipePostLink( $parse, $mdSwipe, \"SwipeRight\" )\n  };\n}\nMdSwipeRightDirective.$inject = [\"$parse\", \"$mdSwipe\"];\n\n/**\n * Factory to build PostLink function specific to Swipe or Pan direction\n *\n * @param $parse\n * @param $mdSwipe\n * @param name\n * @returns {Function}\n */\nfunction swipePostLink($parse, $mdSwipe, name ) {\n\n  return function(scope, element, attrs) {\n    var direction = name.toLowerCase();\n    var directiveName= \"md\" + name;\n\n    var parentGetter = $parse(attrs[directiveName]) || angular.noop;\n    var configureSwipe = $mdSwipe(scope, direction);\n    var requestSwipe = function(locals) {\n      // build function to request scope-specific swipe response\n      parentGetter(scope, locals);\n    };\n\n    configureSwipe( element, function onHandleSwipe(ev) {\n      if ( ev.type == direction ) {\n        requestSwipe();\n      }\n    });\n\n  };\n}\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/switch/bower.json",
    "content": "{\n  \"name\": \"angular-material-switch\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-checkbox\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/switch/switch-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-switch.md-THEME_NAME-theme .md-thumb {\n  background-color: '{{background-50}}'; }\nmd-switch.md-THEME_NAME-theme .md-bar {\n  background-color: '{{background-500}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-thumb {\n  background-color: '{{primary-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked .md-bar {\n  background-color: '{{primary-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-accent .md-thumb {\n  background-color: '{{accent-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-accent .md-bar {\n  background-color: '{{accent-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-thumb {\n  background-color: '{{warn-color}}'; }\nmd-switch.md-THEME_NAME-theme.md-checked.md-warn .md-bar {\n  background-color: '{{warn-color-0.5}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-thumb {\n  background-color: '{{background-400}}'; }\nmd-switch.md-THEME_NAME-theme[disabled] .md-bar {\n  background-color: '{{foreground-4}}'; }\nmd-switch.md-THEME_NAME-theme:focus .md-label:not(:empty) {\n  border-color: '{{foreground-1}}';\n  border-style: dotted; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/switch/switch.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-switch {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center; }\n  md-switch .md-container {\n    cursor: -webkit-grab;\n    cursor: grab;\n    width: 36px;\n    height: 24px;\n    position: relative;\n    -webkit-user-select: none;\n       -moz-user-select: none;\n        -ms-user-select: none;\n            user-select: none;\n    margin-right: 8px; }\n  md-switch:not([disabled]) .md-dragging, md-switch:not([disabled]).md-dragging .md-container {\n    cursor: -webkit-grabbing;\n    cursor: grabbing; }\n  md-switch .md-label {\n    border-color: transparent;\n    border-width: 1px; }\n  md-switch .md-bar {\n    left: 1px;\n    width: 34px;\n    top: 5px;\n    height: 14px;\n    border-radius: 8px;\n    position: absolute; }\n  md-switch .md-thumb-container {\n    top: 2px;\n    left: 0;\n    width: 16px;\n    position: absolute;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    z-index: 1; }\n  md-switch.md-checked .md-thumb-container {\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0); }\n  md-switch .md-thumb {\n    position: absolute;\n    margin: 0;\n    left: 0;\n    top: 0;\n    outline: none;\n    height: 20px;\n    width: 20px;\n    border-radius: 50%;\n    box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n    md-switch .md-thumb .md-ripple-container {\n      position: absolute;\n      display: block;\n      width: auto;\n      height: auto;\n      left: -20px;\n      top: -20px;\n      right: -20px;\n      bottom: -20px; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb-container, md-switch:not(.md-dragging) .md-thumb {\n    -webkit-transition: all 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: all 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    -webkit-transition-property: -webkit-transform, background-color;\n            transition-property: transform, background-color; }\n  md-switch:not(.md-dragging) .md-bar, md-switch:not(.md-dragging) .md-thumb {\n    -webkit-transition-delay: 0.05s;\n            transition-delay: 0.05s; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/switch/switch.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @private\n * @ngdoc module\n * @name material.components.switch\n */\n\nangular.module('material.components.switch', [\n  'material.core',\n  'material.components.checkbox'\n])\n  .directive('mdSwitch', MdSwitch);\n\n/**\n * @private\n * @ngdoc directive\n * @module material.components.switch\n * @name mdSwitch\n * @restrict E\n *\n * The switch directive is used very much like the normal [angular checkbox](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D).\n *\n * @param {string} ng-model Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {expression=} ng-true-value The value to which the expression should be set when selected.\n * @param {expression=} ng-false-value The value to which the expression should be set when not selected.\n * @param {string=} ng-change Angular expression to be executed when input changes due to user interaction with the input element.\n * @param {boolean=} md-no-ink Use of attribute indicates use of ripple ink effects.\n * @param {string=} aria-label Publish the button label used by screen-readers for accessibility. Defaults to the switch's text.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-switch ng-model=\"isActive\" aria-label=\"Finished?\">\n *   Finished ?\n * </md-switch>\n *\n * <md-switch md-no-ink ng-model=\"hasInk\" aria-label=\"No Ink Effects\">\n *   No Ink Effects\n * </md-switch>\n *\n * <md-switch ng-disabled=\"true\" ng-model=\"isDisabled\" aria-label=\"Disabled\">\n *   Disabled\n * </md-switch>\n *\n * </hljs>\n */\nfunction MdSwitch(mdCheckboxDirective, $mdTheming, $mdUtil, $document, $mdConstant, $parse, $$rAF) {\n  var checkboxDirective = mdCheckboxDirective[0];\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-container\">' +\n        '<div class=\"md-bar\"></div>' +\n        '<div class=\"md-thumb-container\">' +\n          '<div class=\"md-thumb\" md-ink-ripple md-ink-ripple-checkbox></div>' +\n        '</div>'+\n      '</div>' +\n      '<div ng-transclude class=\"md-label\">' +\n      '</div>',\n    require: '?ngModel',\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var checkboxLink = checkboxDirective.compile(element, attr);\n    // no transition on initial load\n    element.addClass('md-dragging');\n\n    return function (scope, element, attr, ngModel) {\n      ngModel = ngModel || $mdUtil.fakeNgModel();\n      var disabledGetter = $parse(attr.ngDisabled);\n      var thumbContainer = angular.element(element[0].querySelector('.md-thumb-container'));\n      var switchContainer = angular.element(element[0].querySelector('.md-container'));\n\n      // no transition on initial load\n      $$rAF(function() {\n        element.removeClass('md-dragging');\n      });\n\n      // Tell the checkbox we don't want a click listener.\n      // Our drag listener tells us everything, using more granular events.\n      attr.mdNoClick = true;\n      checkboxLink(scope, element, attr, ngModel);\n\n      $mdUtil.attachDragBehavior(scope, switchContainer);\n\n      // These events are triggered by setup drag\n      switchContainer.on('$md.dragstart', onDragStart)\n        .on('$md.drag', onDrag)\n        .on('$md.dragend', onDragEnd);\n\n      function onDragStart(ev, drag) {\n        // Don't go if ng-disabled===true\n        if (disabledGetter(scope)) return ev.preventDefault();\n\n        drag.width = thumbContainer.prop('offsetWidth');\n        element.addClass('md-dragging');\n      }\n      function onDrag(ev, drag) {\n        var percent = drag.distance / drag.width;\n\n        //if checked, start from right. else, start from left\n        var translate = ngModel.$viewValue ?  1 - percent : -percent;\n        // Make sure the switch stays inside its bounds, 0-1%\n        translate = Math.max(0, Math.min(1, translate));\n\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + (100*translate) + '%,0,0)');\n        drag.translate = translate;\n      }\n      function onDragEnd(ev, drag) {\n        if (disabledGetter(scope)) return false;\n\n        element.removeClass('md-dragging');\n        thumbContainer.css($mdConstant.CSS.TRANSFORM, '');\n\n        // We changed if there is no distance (this is a click a click),\n        // or if the drag distance is >50% of the total.\n        var isChanged = Math.abs(drag.distance || 0) < 2 ||\n          (ngModel.$viewValue ? drag.translate < 0.5 : drag.translate > 0.5);\n        if (isChanged) {\n          scope.$apply(function() {\n            ngModel.$setViewValue(!ngModel.$viewValue);\n            ngModel.$render();\n          });\n        }\n      }\n    };\n  }\n\n\n}\nMdSwitch.$inject = [\"mdCheckboxDirective\", \"$mdTheming\", \"$mdUtil\", \"$document\", \"$mdConstant\", \"$parse\", \"$$rAF\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tabs/bower.json",
    "content": "{\n  \"name\": \"angular-material-tabs\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tabs/tabs-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-tabs.md-THEME_NAME-theme .md-header {\n  background-color: '{{primary-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent .md-header {\n  background-color: '{{accent-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]) {\n  color: '{{accent-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-accent md-tab:not([disabled]).active {\n    color: '{{accent-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn .md-header {\n  background-color: '{{warn-color}}'; }\nmd-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]) {\n  color: '{{warn-100}}'; }\n  md-tabs.md-THEME_NAME-theme.md-warn md-tab:not([disabled]).active {\n    color: '{{warn-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme md-tabs-ink-bar {\n  color: '{{primary-contrast}}';\n  background: '{{primary-contrast}}'; }\nmd-tabs.md-THEME_NAME-theme md-tab {\n  color: '{{primary-100}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab.active {\n    color: '{{primary-contrast}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab[disabled] {\n    color: '{{foreground-4}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab:focus {\n    color: '{{primary-contrast}}';\n    background-color: '{{primary-contrast-0.1}}'; }\n  md-tabs.md-THEME_NAME-theme md-tab .md-ripple-container {\n    color: '{{primary-contrast}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tabs/tabs.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-tabs {\n  display: block;\n  width: 100%;\n  font-weight: 500;\n  overflow: auto; }\n\n.md-header {\n  width: 100%;\n  height: 48px;\n  box-sizing: border-box;\n  position: relative; }\n\n.md-paginator {\n  z-index: 1;\n  margin-right: -2px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  width: 32px;\n  min-height: 100%;\n  cursor: pointer;\n  border: none;\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: center center;\n  position: absolute;\n  /* TODO Once we have a better way to inline svg images, change this\n   to use svgs correctly */ }\n  .md-paginator.md-prev {\n    left: 0; }\n  .md-paginator.md-next {\n    right: 0; }\n  .md-paginator.md-prev {\n    background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE3LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPiA8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPiA8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8ZyBpZD0iSGVhZGVyIj4gPGc+IDxyZWN0IHg9Ii02MTgiIHk9Ii0xMjA4IiBmaWxsPSJub25lIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSIzNjAwIi8+IDwvZz4gPC9nPiA8ZyBpZD0iTGFiZWwiPiA8L2c+IDxnIGlkPSJJY29uIj4gPGc+IDxwb2x5Z29uIHBvaW50cz0iMTUuNCw3LjQgMTQsNiA4LDEyIDE0LDE4IDE1LjQsMTYuNiAxMC44LDEyIAkJIiBzdHlsZT0iZmlsbDp3aGl0ZTsiLz4gPHJlY3QgZmlsbD0ibm9uZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+IDwvZz4gPC9nPiA8ZyBpZD0iR3JpZCIgZGlzcGxheT0ibm9uZSI+IDxnIGRpc3BsYXk9ImlubGluZSI+IDwvZz4gPC9nPiA8L3N2Zz4NCg=='); }\n  .md-paginator.md-next {\n    background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE3LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPiA8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPiA8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8ZyBpZD0iSGVhZGVyIj4gPGc+IDxyZWN0IHg9Ii02MTgiIHk9Ii0xMzM2IiBmaWxsPSJub25lIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSIzNjAwIi8+IDwvZz4gPC9nPiA8ZyBpZD0iTGFiZWwiPiA8L2c+IDxnIGlkPSJJY29uIj4gPGc+IDxwb2x5Z29uIHBvaW50cz0iMTAsNiA4LjYsNy40IDEzLjIsMTIgOC42LDE2LjYgMTAsMTggMTYsMTIgCQkiIHN0eWxlPSJmaWxsOndoaXRlOyIvPiA8cmVjdCBmaWxsPSJub25lIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiLz4gPC9nPiA8L2c+IDxnIGlkPSJHcmlkIiBkaXNwbGF5PSJub25lIj4gPGcgZGlzcGxheT0iaW5saW5lIj4gPC9nPiA8L2c+IDwvc3ZnPg0K'); }\n\n/* If `center` justified, change to left-justify if paginating */\nmd-tabs[center] .md-header:not(.md-paginating) .md-header-items {\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center; }\n\n.md-paginating .md-header-items-container {\n  left: 32px;\n  right: 32px; }\n\n.md-header-items-container {\n  overflow: hidden;\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 100%;\n  white-space: nowrap;\n  font-size: 14px;\n  font-weight: 500;\n  text-transform: uppercase;\n  margin: auto; }\n  .md-header-items-container .md-header-items {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    box-sizing: border-box;\n    -webkit-transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    height: 100%;\n    width: 99999px; }\n\n.md-tabs-content {\n  overflow: hidden;\n  width: 100%;\n  position: relative; }\n  .md-tabs-content .md-tab-content {\n    height: 100%; }\n    .md-tabs-content .md-tab-content.ng-hide.ng-animate {\n      display: block !important; }\n    .md-tabs-content .md-tab-content.ng-animate {\n      -webkit-transition: -webkit-transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n              transition: transform 0.5s cubic-bezier(0.35, 0, 0.25, 1);\n      -webkit-transform: translateX(0);\n              transform: translateX(0); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-add {\n        -webkit-transform: translateX(-100%);\n                transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-add.md-transition-rtl {\n          -webkit-transform: translateX(100%);\n                  transform: translateX(100%); }\n      .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove {\n        position: absolute;\n        -webkit-transform: translateX(100%);\n                transform: translateX(100%);\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0; }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.md-transition-rtl {\n          -webkit-transform: translateX(-100%);\n                  transform: translateX(-100%); }\n        .md-tabs-content .md-tab-content.ng-animate.ng-hide-remove.ng-hide-remove-active {\n          -webkit-transform: translateX(0);\n                  transform: translateX(0); }\n\nmd-tabs-ink-bar {\n  z-index: 1;\n  display: none;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  box-sizing: border-box;\n  height: 2px;\n  margin-top: -2px;\n  -webkit-transform: scaleX(1);\n          transform: scaleX(1);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0; }\n  md-tabs-ink-bar.md-transition-right {\n    -webkit-transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1), left 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s;\n            transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1), left 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s; }\n  md-tabs-ink-bar.md-transition-left {\n    -webkit-transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s, left 0.25s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: right 0.25s cubic-bezier(0.35, 0, 0.25, 1) 0.075s, left 0.25s cubic-bezier(0.35, 0, 0.25, 1); }\n\nmd-tab {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  position: relative;\n  z-index: 0;\n  overflow: hidden;\n  height: 100%;\n  text-align: center;\n  cursor: pointer;\n  padding: 20px 24px;\n  box-sizing: border-box;\n  -webkit-transition: background 0.35s cubic-bezier(0.35, 0, 0.25, 1), color 0.35s cubic-bezier(0.35, 0, 0.25, 1);\n          transition: background 0.35s cubic-bezier(0.35, 0, 0.25, 1), color 0.35s cubic-bezier(0.35, 0, 0.25, 1);\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none; }\n  md-tab[disabled] {\n    pointer-events: none;\n    cursor: default; }\n  md-tab:focus {\n    outline: none; }\n  md-tab md-tab-label {\n    -webkit-box-flex: 1;\n    -webkit-flex: 1 1 auto;\n        -ms-flex: 1 1 auto;\n            flex: 1 1 auto;\n    z-index: 100;\n    opacity: 1;\n    overflow: hidden; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tabs/tabs.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tabs\n * @description\n *\n *  Tabs, created with the `<md-tabs>` directive provide *tabbed* navigation with different styles.\n *  The Tabs component consists of clickable tabs that are aligned horizontally side-by-side.\n *\n *  Features include support for:\n *\n *  - static or dynamic tabs,\n *  - responsive designs,\n *  - accessibility support (ARIA),\n *  - tab pagination,\n *  - external or internal tab content,\n *  - focus indicators and arrow-key navigations,\n *  - programmatic lookup and access to tab controllers, and\n *  - dynamic transitions through different tab contents.\n *\n */\n/*\n * @see js folder for tabs implementation\n */\nangular.module('material.components.tabs', [\n  'material.core'\n]);\n})();\n\n(function() {\n'use strict';\n\n/**\n * Conditionally configure ink bar animations when the\n * tab selection changes. If `mdNoBar` then do not show the\n * bar nor animate.\n */\nangular.module('material.components.tabs')\n  .directive('mdTabsInkBar', MdTabInkDirective);\n\nfunction MdTabInkDirective($$rAF) {\n\n  var lastIndex = 0;\n\n  return {\n    restrict: 'E',\n    require: ['^?mdNoBar', '^mdTabs'],\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, ctrls) {\n    if (ctrls[0]) return;\n\n    var tabsCtrl = ctrls[1],\n        debouncedUpdateBar = $$rAF.debounce(updateBar);\n\n    tabsCtrl.inkBarElement = element;\n\n    scope.$on('$mdTabsPaginationChanged', debouncedUpdateBar);\n\n    function updateBar() {\n      var selected = tabsCtrl.getSelectedItem();\n      var hideInkBar = !selected || tabsCtrl.count() < 2;\n\n      element.css('display', hideInkBar ? 'none' : 'block');\n\n      if (hideInkBar) return;\n\n      if (scope.pagination && scope.pagination.tabData) {\n        var index = tabsCtrl.getSelectedIndex();\n        var data = scope.pagination.tabData.tabs[index] || { left: 0, right: 0, width: 0 };\n        var right = element.parent().prop('offsetWidth') - data.right;\n        var classNames = ['md-transition-left', 'md-transition-right', 'md-no-transition'];\n        var classIndex = lastIndex > index ? 0 : lastIndex < index ? 1 : 2;\n\n        element\n            .removeClass(classNames.join(' '))\n            .addClass(classNames[classIndex])\n            .css({ left: (data.left + 1) + 'px', right: right + 'px' });\n\n        lastIndex = index;\n      }\n    }\n  }\n}\nMdTabInkDirective.$inject = [\"$$rAF\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n    .directive('mdTabsPagination', TabPaginationDirective);\n\nfunction TabPaginationDirective($mdConstant, $window, $$rAF, $$q, $timeout, $mdMedia) {\n\n  // Must match (2 * width of paginators) in scss\n  var PAGINATORS_WIDTH = (8 * 4) * 2;\n\n  return {\n    restrict: 'A',\n    require: '^mdTabs',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl) {\n\n    var tabs = element[0].getElementsByTagName('md-tab');\n    var debouncedUpdatePagination = $$rAF.debounce(updatePagination);\n    var tabsParent = element.children();\n    var state = scope.pagination = {\n      page: -1,\n      active: false,\n      clickNext: function() { userChangePage(+1); },\n      clickPrevious: function() { userChangePage(-1); }\n    };\n\n    scope.$on('$mdTabsChanged', debouncedUpdatePagination);\n    angular.element($window).on('resize', debouncedUpdatePagination);\n\n    scope.$on('$destroy', function() {\n      angular.element($window).off('resize', debouncedUpdatePagination);\n    });\n\n    scope.$watch(function() { return tabsCtrl.tabToFocus; }, onTabFocus);\n\n    // Make sure we don't focus an element on the next page\n    // before it's in view\n    function onTabFocus(tab, oldTab) {\n      if (!tab) return;\n\n      var pageIndex = getPageForTab(tab);\n      if (!state.active || pageIndex === state.page) {\n        tab.element.focus();\n      } else {\n        // Go to the new page, wait for the page transition to end, then focus.\n        oldTab && oldTab.element.blur();\n        setPage(pageIndex).then(function() { tab.element.focus(); });\n      }\n    }\n\n    // Called when page is changed by a user action (click)\n    function userChangePage(increment) {\n      var sizeData = state.tabData;\n      var newPage = Math.max(0, Math.min(sizeData.pages.length - 1, state.page + increment));\n      var newTabIndex = sizeData.pages[newPage][ increment > 0 ? 'firstTabIndex' : 'lastTabIndex' ];\n      var newTab = tabsCtrl.itemAt(newTabIndex);\n      onTabFocus(newTab);\n    }\n\n    function updatePagination() {\n      if (!element.prop('offsetParent')) {\n        var watcher = waitForVisible();\n        return;\n      }\n\n      var tabs = element.find('md-tab');\n\n      disablePagination();\n\n      var sizeData = state.tabData = calculateTabData();\n      var needPagination = state.active = sizeData.pages.length > 1;\n\n      if (needPagination) { enablePagination(); }\n\n      scope.$evalAsync(function () { scope.$broadcast('$mdTabsPaginationChanged'); });\n\n      function enablePagination() {\n        tabsParent.css('width', '9999px');\n\n        //-- apply filler margins\n        angular.forEach(sizeData.tabs, function (tab) {\n          angular.element(tab.element).css('margin-left', tab.filler + 'px');\n        });\n\n        setPage(getPageForTab(tabsCtrl.getSelectedItem()));\n      }\n\n      function disablePagination() {\n        slideTabButtons(0);\n        tabsParent.css('width', '');\n        tabs.css('width', '');\n        tabs.css('margin-left', '');\n        state.page = null;\n        state.active = false;\n      }\n\n      function waitForVisible() {\n        return watcher || scope.$watch(\n            function () {\n              $timeout(function () {\n                if (element[0].offsetParent) {\n                  if (angular.isFunction(watcher)) {\n                    watcher();\n                  }\n                  debouncedUpdatePagination();\n                  watcher = null;\n                }\n              }, 0, false);\n            }\n        );\n      }\n    }\n\n    function slideTabButtons(x) {\n      if (tabsCtrl.pagingOffset === x) {\n        // Resolve instantly if no change\n        return $$q.when();\n      }\n\n      var deferred = $$q.defer();\n\n      tabsCtrl.$$pagingOffset = x;\n      tabsParent.css($mdConstant.CSS.TRANSFORM, 'translate3d(' + x + 'px,0,0)');\n      tabsParent.on($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n\n      return deferred.promise;\n\n      function onTabsParentTransitionEnd(ev) {\n        // Make sure this event didn't bubble up from an animation in a child element.\n        if (ev.target === tabsParent[0]) {\n          tabsParent.off($mdConstant.CSS.TRANSITIONEND, onTabsParentTransitionEnd);\n          deferred.resolve();\n        }\n      }\n    }\n\n    function shouldStretchTabs() {\n      switch (scope.stretchTabs) {\n        case 'never':  return false;\n        case 'always': return true;\n        default:       return $mdMedia('sm');\n      }\n    }\n\n    function calculateTabData(noAdjust) {\n      var clientWidth = element.parent().prop('offsetWidth');\n      var tabsWidth = clientWidth - PAGINATORS_WIDTH - 1;\n      var $tabs = angular.element(tabs);\n      var totalWidth = 0;\n      var max = 0;\n      var tabData = [];\n      var pages = [];\n      var currentPage;\n\n      $tabs.css('max-width', '');\n      angular.forEach(tabs, function (tab, index) {\n        var tabWidth = Math.min(tabsWidth, tab.offsetWidth);\n        var data = {\n          element: tab,\n          left: totalWidth,\n          width: tabWidth,\n          right: totalWidth + tabWidth,\n          filler: 0\n        };\n\n        //-- This calculates the page for each tab.  The first page will use the clientWidth, which\n        //   does not factor in the pagination items.  After the first page, tabsWidth is used\n        //   because at this point, we know that the pagination buttons will be shown.\n        data.page = Math.ceil(data.right / ( pages.length === 1 && index === tabs.length - 1 ? clientWidth : tabsWidth )) - 1;\n\n        if (data.page >= pages.length) {\n          data.filler = (tabsWidth * data.page) - data.left;\n          data.right += data.filler;\n          data.left += data.filler;\n          currentPage = {\n            left: data.left,\n            firstTabIndex: index,\n            lastTabIndex: index,\n            tabs: [ data ]\n          };\n          pages.push(currentPage);\n        } else {\n          currentPage.lastTabIndex = index;\n          currentPage.tabs.push(data);\n        }\n        totalWidth = data.right;\n        max = Math.max(max, tabWidth);\n        tabData.push(data);\n      });\n      $tabs.css('max-width', tabsWidth + 'px');\n\n      if (!noAdjust && shouldStretchTabs()) {\n        return adjustForStretchedTabs();\n      } else {\n        return {\n          width: totalWidth,\n          max: max,\n          tabs: tabData,\n          pages: pages,\n          tabElements: tabs\n        };\n      }\n\n\n      function adjustForStretchedTabs() {\n        var canvasWidth = pages.length === 1 ? clientWidth : tabsWidth;\n        var tabsPerPage = Math.min(Math.floor(canvasWidth / max), tabs.length);\n        var tabWidth    = Math.floor(canvasWidth / tabsPerPage);\n        $tabs.css('width', tabWidth + 'px');\n        return calculateTabData(true);\n      }\n    }\n\n    function getPageForTab(tab) {\n      var tabIndex = tabsCtrl.indexOf(tab);\n      if (tabIndex === -1) return 0;\n\n      var sizeData = state.tabData;\n\n      return sizeData ? sizeData.tabs[tabIndex].page : 0;\n    }\n\n    function setPage(page) {\n      if (page === state.page) return;\n\n      var lastPage = state.tabData.pages.length - 1;\n\n      if (page < 0) page = 0;\n      if (page > lastPage) page = lastPage;\n\n      state.hasPrev = page > 0;\n      state.hasNext = page < lastPage;\n\n      state.page = page;\n\n      scope.$broadcast('$mdTabsPaginationChanged');\n\n      return slideTabButtons(-state.tabData.pages[page].left);\n    }\n  }\n\n}\nTabPaginationDirective.$inject = [\"$mdConstant\", \"$window\", \"$$rAF\", \"$$q\", \"$timeout\", \"$mdMedia\"];\n})();\n\n(function() {\n'use strict';\n\n\nangular.module('material.components.tabs')\n  .controller('$mdTab', TabItemController);\n\nfunction TabItemController($scope, $element, $attrs, $compile, $animate, $mdUtil, $parse, $timeout) {\n  var self = this;\n\n  // Properties\n  self.contentContainer = angular.element('<div class=\"md-tab-content ng-hide\">');\n  self.hammertime = new Hammer(self.contentContainer[0]);\n  self.element = $element;\n\n  // Methods\n  self.isDisabled = isDisabled;\n  self.onAdd = onAdd;\n  self.onRemove = onRemove;\n  self.onSelect = onSelect;\n  self.onDeselect = onDeselect;\n\n  var disabledParsed = $parse($attrs.ngDisabled);\n  function isDisabled() {\n    return disabledParsed($scope.$parent);\n  }\n  \n  /**\n   * Add the tab's content to the DOM container area in the tabs,\n   * @param contentArea the contentArea to add the content of the tab to\n   */\n  function onAdd(contentArea, shouldDisconnectScope) {\n    if (self.content.length) {\n      self.contentContainer.append(self.content);\n      self.contentScope = $scope.$parent.$new();\n      contentArea.append(self.contentContainer);\n\n      $compile(self.contentContainer)(self.contentScope);\n      if (shouldDisconnectScope === true) {\n        $timeout(function () {\n          $mdUtil.disconnectScope(self.contentScope);\n        }, 0, false);\n      }\n    }\n  }\n\n  function onRemove() {\n    self.hammertime.destroy();\n    $animate.leave(self.contentContainer).then(function() {\n      self.contentScope && self.contentScope.$destroy();\n      self.contentScope = null;\n    });\n  }\n\n  function toggleAnimationClass(rightToLeft) {\n    self.contentContainer[rightToLeft ? 'addClass' : 'removeClass']('md-transition-rtl');\n  }\n\n  function onSelect(rightToLeft) {\n    // Resume watchers and events firing when tab is selected\n    $mdUtil.reconnectScope(self.contentScope);\n    self.hammertime.on('swipeleft swiperight', $scope.onSwipe);\n\n    $element.addClass('active');\n    $element.attr('aria-selected', true);\n    $element.attr('tabIndex', 0);\n    toggleAnimationClass(rightToLeft);\n    $animate.removeClass(self.contentContainer, 'ng-hide');\n\n    $scope.onSelect();\n  }\n\n  function onDeselect(rightToLeft) {\n    // Stop watchers & events from firing while tab is deselected\n    $mdUtil.disconnectScope(self.contentScope);\n    self.hammertime.off('swipeleft swiperight', $scope.onSwipe);\n\n    $element.removeClass('active');\n    $element.attr('aria-selected', false);\n    // Only allow tabbing to the active tab\n    $element.attr('tabIndex', -1);\n    toggleAnimationClass(rightToLeft);\n    $animate.addClass(self.contentContainer, 'ng-hide');\n\n    $scope.onDeselect();\n  }\n\n}\nTabItemController.$inject = [\"$scope\", \"$element\", \"$attrs\", \"$compile\", \"$animate\", \"$mdUtil\", \"$parse\", \"$timeout\"];\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTab', MdTabDirective);\n\n/**\n * @ngdoc directive\n * @name mdTab\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * `<md-tab>` is the nested directive used [within `<md-tabs>`] to specify each tab with a **label** and optional *view content*.\n *\n * If the `label` attribute is not specified, then an optional `<md-tab-label>` tag can be used to specify more\n * complex tab header markup. If neither the **label** nor the **md-tab-label** are specified, then the nested\n * markup of the `<md-tab>` is used as the tab header markup.\n *\n * If a tab **label** has been identified, then any **non-**`<md-tab-label>` markup\n * will be considered tab content and will be transcluded to the internal `<div class=\"md-tabs-content\">` container.\n *\n * This container is used by the TabsController to show/hide the active tab's content view. This synchronization is\n * automatically managed by the internal TabsController whenever the tab selection changes. Selection changes can\n * be initiated via data binding changes, programmatic invocation, or user gestures.\n *\n * @param {string=} label Optional attribute to specify a simple string as the tab label\n * @param {boolean=} md-active When evaluteing to true, selects the tab.\n * @param {boolean=} disabled If present, disabled tab selection.\n * @param {expression=} md-on-deselect Expression to be evaluated after the tab has been de-selected.\n * @param {expression=} md-on-select Expression to be evaluated after the tab has been selected.\n *\n *\n * @usage\n *\n * <hljs lang=\"html\">\n * <md-tab label=\"\" disabled=\"\" md-on-select=\"\" md-on-deselect=\"\" >\n *   <h3>My Tab content</h3>\n * </md-tab>\n *\n * <md-tab >\n *   <md-tab-label>\n *     <h3>My Tab content</h3>\n *   </md-tab-label>\n *   <p>\n *     Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,\n *     totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae\n *     dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,\n *     sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n *   </p>\n * </md-tab>\n * </hljs>\n *\n */\nfunction MdTabDirective($mdInkRipple, $compile, $mdUtil, $mdConstant, $timeout) {\n  return {\n    restrict: 'E',\n    require: ['mdTab', '^mdTabs'],\n    controller: '$mdTab',\n    scope: {\n      onSelect: '&mdOnSelect',\n      onDeselect: '&mdOnDeselect',\n      label: '@'\n    },\n    compile: compile\n  };\n\n  function compile(element, attr) {\n    var tabLabel = element.find('md-tab-label');\n\n    if (tabLabel.length) {\n      // If a tab label element is found, remove it for later re-use.\n      tabLabel.remove();\n\n    } else if (angular.isDefined(attr.label)) {\n      // Otherwise, try to use attr.label as the label\n      tabLabel = angular.element('<md-tab-label>').html(attr.label);\n\n    } else {\n      // If nothing is found, use the tab's content as the label\n      tabLabel = angular.element('<md-tab-label>')\n                        .append(element.contents().remove());\n    }\n\n    // Everything that's left as a child is the tab's content.\n    var tabContent = element.contents().remove();\n\n    return function postLink(scope, element, attr, ctrls) {\n\n      var tabItemCtrl = ctrls[0]; // Controller for THIS tabItemCtrl\n      var tabsCtrl = ctrls[1]; // Controller for ALL tabs\n\n      scope.$watch(\n          function () { return attr.label; },\n          function () { $timeout(function () { tabsCtrl.scope.$broadcast('$mdTabsChanged'); }, 0, false); }\n      );\n\n      transcludeTabContent();\n      configureAria();\n\n      var detachRippleFn = $mdInkRipple.attachTabBehavior(scope, element, {\n        colorElement: tabsCtrl.inkBarElement\n      });\n      tabsCtrl.add(tabItemCtrl);\n      scope.$on('$destroy', function() {\n        detachRippleFn();\n        tabsCtrl.remove(tabItemCtrl);\n      });\n      element.on('$destroy', function () {\n        //-- wait for item to be removed from the dom\n        $timeout(function () {\n          tabsCtrl.scope.$broadcast('$mdTabsChanged');\n        }, 0, false);\n      });\n\n      if (!angular.isDefined(attr.ngClick)) {\n        element.on('click', defaultClickListener);\n      }\n      element.on('keydown', keydownListener);\n      scope.onSwipe = onSwipe;\n\n      if (angular.isNumber(scope.$parent.$index)) {\n        watchNgRepeatIndex();\n      }\n      if (angular.isDefined(attr.mdActive)) {\n        watchActiveAttribute();\n      }\n      watchDisabled();\n\n      function transcludeTabContent() {\n        // Clone the label we found earlier, and $compile and append it\n        var label = tabLabel.clone();\n        element.append(label);\n        $compile(label)(scope.$parent);\n\n        // Clone the content we found earlier, and mark it for later placement into\n        // the proper content area.\n        tabItemCtrl.content = tabContent.clone();\n      }\n\n      //defaultClickListener isn't applied if the user provides an ngClick expression.\n      function defaultClickListener() {\n        scope.$apply(function() {\n          tabsCtrl.select(tabItemCtrl);\n          tabsCtrl.focus(tabItemCtrl);\n        });\n      }\n      function keydownListener(ev) {\n        if (ev.keyCode == $mdConstant.KEY_CODE.SPACE || ev.keyCode == $mdConstant.KEY_CODE.ENTER ) {\n          // Fire the click handler to do normal selection if space is pressed\n          element.triggerHandler('click');\n          ev.preventDefault();\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.LEFT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.previous(tabItemCtrl));\n          });\n        } else if (ev.keyCode === $mdConstant.KEY_CODE.RIGHT_ARROW) {\n          scope.$evalAsync(function() {\n            tabsCtrl.focus(tabsCtrl.next(tabItemCtrl));\n          });\n        }\n      }\n\n      function onSwipe(ev) {\n        scope.$apply(function() {\n          if (ev.type === 'swipeleft') {\n            tabsCtrl.select(tabsCtrl.next());\n          } else {\n            tabsCtrl.select(tabsCtrl.previous());\n          }\n        });\n      }\n\n      // If tabItemCtrl is part of an ngRepeat, move the tabItemCtrl in our internal array\n      // when its $index changes\n      function watchNgRepeatIndex() {\n        // The tabItemCtrl has an isolate scope, so we watch the $index on the parent.\n        scope.$watch('$parent.$index', function $indexWatchAction(newIndex) {\n          tabsCtrl.move(tabItemCtrl, newIndex);\n        });\n      }\n\n      function watchActiveAttribute() {\n        var unwatch = scope.$parent.$watch('!!(' + attr.mdActive + ')', activeWatchAction);\n        scope.$on('$destroy', unwatch);\n\n        function activeWatchAction(isActive) {\n          var isSelected = tabsCtrl.getSelectedItem() === tabItemCtrl;\n\n          if (isActive && !isSelected) {\n            tabsCtrl.select(tabItemCtrl);\n          } else if (!isActive && isSelected) {\n            tabsCtrl.deselect(tabItemCtrl);\n          }\n        }\n      }\n\n      function watchDisabled() {\n        scope.$watch(tabItemCtrl.isDisabled, disabledWatchAction);\n\n        function disabledWatchAction(isDisabled) {\n          element.attr('aria-disabled', isDisabled);\n\n          // Auto select `next` tab when disabled\n          var isSelected = (tabsCtrl.getSelectedItem() === tabItemCtrl);\n          if (isSelected && isDisabled) {\n            tabsCtrl.select(tabsCtrl.next() || tabsCtrl.previous());\n          }\n\n        }\n      }\n\n      function configureAria() {\n        // Link together the content area and tabItemCtrl with an id\n        var tabId = attr.id || ('tab_' + $mdUtil.nextUid());\n\n        element.attr({\n          id: tabId,\n          role: 'tab',\n          tabIndex: -1 //this is also set on select/deselect in tabItemCtrl\n        });\n\n        // Only setup the contentContainer's aria attributes if tab content is provided\n        if (tabContent.length) {\n          var tabContentId = 'content_' + tabId;\n          if (!element.attr('aria-controls')) {\n            element.attr('aria-controls', tabContentId);\n          }\n          tabItemCtrl.contentContainer.attr({\n            id: tabContentId,\n            role: 'tabpanel',\n            'aria-labelledby': tabId\n          });\n        }\n      }\n\n    };\n\n  }\n\n}\nMdTabDirective.$inject = [\"$mdInkRipple\", \"$compile\", \"$mdUtil\", \"$mdConstant\", \"$timeout\"];\n\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .controller('$mdTabs', MdTabsController);\n\nfunction MdTabsController($scope, $element, $mdUtil, $timeout) {\n\n  var tabsList = $mdUtil.iterator([], false);\n  var self = this;\n\n  // Properties\n  self.$element = $element;\n  self.scope = $scope;\n  // The section containing the tab content $elements\n  var contentArea = self.contentArea = angular.element($element[0].querySelector('.md-tabs-content'));\n\n  // Methods from iterator\n  var inRange = self.inRange = tabsList.inRange;\n  var indexOf = self.indexOf = tabsList.indexOf;\n  var itemAt = self.itemAt = tabsList.itemAt;\n  self.count = tabsList.count;\n\n  self.getSelectedItem = getSelectedItem;\n  self.getSelectedIndex = getSelectedIndex;\n  self.add = add;\n  self.remove = remove;\n  self.move = move;\n  self.select = select;\n  self.focus = focus;\n  self.deselect = deselect;\n\n  self.next = next;\n  self.previous = previous;\n\n  $scope.$on('$destroy', function() {\n    deselect(getSelectedItem());\n    for (var i = tabsList.count() - 1; i >= 0; i--) {\n      remove(tabsList[i], true);\n    }\n  });\n\n  // Get the selected tab\n  function getSelectedItem() {\n    return itemAt($scope.selectedIndex);\n  }\n\n  function getSelectedIndex() {\n    return $scope.selectedIndex;\n  }\n\n  // Add a new tab.\n  // Returns a method to remove the tab from the list.\n  function add(tab, index) {\n    tabsList.add(tab, index);\n\n    // Select the new tab if we don't have a selectedIndex, or if the\n    // selectedIndex we've been waiting for is this tab\n    if (!angular.isDefined(tab.element.attr('md-active')) && ($scope.selectedIndex === -1 || !angular.isNumber($scope.selectedIndex) ||\n        $scope.selectedIndex === self.indexOf(tab))) {\n      tab.onAdd(self.contentArea, false);\n      self.select(tab);\n    } else {\n      tab.onAdd(self.contentArea, true);\n    }\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function remove(tab, noReselect) {\n    if (!tabsList.contains(tab)) return;\n    if (noReselect) return;\n    var isSelectedItem = getSelectedItem() === tab,\n        newTab = previous() || next();\n\n    deselect(tab);\n    tabsList.remove(tab);\n    tab.onRemove();\n\n    $scope.$broadcast('$mdTabsChanged');\n\n    if (isSelectedItem) { select(newTab); }\n  }\n\n  // Move a tab (used when ng-repeat order changes)\n  function move(tab, toIndex) {\n    var isSelected = getSelectedItem() === tab;\n\n    tabsList.remove(tab);\n    tabsList.add(tab, toIndex);\n    if (isSelected) select(tab);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function select(tab, rightToLeft) {\n    if (!tab || tab.isSelected || tab.isDisabled()) return;\n    if (!tabsList.contains(tab)) return;\n\n    if (!angular.isDefined(rightToLeft)) {\n      rightToLeft = indexOf(tab) < $scope.selectedIndex;\n    }\n    deselect(getSelectedItem(), rightToLeft);\n\n    $scope.selectedIndex = indexOf(tab);\n    tab.isSelected = true;\n    tab.onSelect(rightToLeft);\n\n    $scope.$broadcast('$mdTabsChanged');\n  }\n\n  function focus(tab) {\n    // this variable is watched by pagination\n    self.tabToFocus = tab;\n  }\n\n  function deselect(tab, rightToLeft) {\n    if (!tab || !tab.isSelected) return;\n    if (!tabsList.contains(tab)) return;\n\n    $scope.selectedIndex = -1;\n    tab.isSelected = false;\n    tab.onDeselect(rightToLeft);\n  }\n\n  function next(tab, filterFn) {\n    return tabsList.next(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n  function previous(tab, filterFn) {\n    return tabsList.previous(tab || getSelectedItem(), filterFn || isTabEnabled);\n  }\n\n  function isTabEnabled(tab) {\n    return tab && !tab.isDisabled();\n  }\n\n}\nMdTabsController.$inject = [\"$scope\", \"$element\", \"$mdUtil\", \"$timeout\"];\n})();\n\n(function() {\n'use strict';\n\nangular.module('material.components.tabs')\n  .directive('mdTabs', TabsDirective);\n\n/**\n * @ngdoc directive\n * @name mdTabs\n * @module material.components.tabs\n *\n * @restrict E\n *\n * @description\n * The `<md-tabs>` directive serves as the container for 1..n `<md-tab>` child directives to produces a Tabs components.\n * In turn, the nested `<md-tab>` directive is used to specify a tab label for the **header button** and a [optional] tab view\n * content that will be associated with each tab button.\n *\n * Below is the markup for its simplest usage:\n *\n *  <hljs lang=\"html\">\n *  <md-tabs>\n *    <md-tab label=\"Tab #1\"></md-tab>\n *    <md-tab label=\"Tab #2\"></md-tab>\n *    <md-tab label=\"Tab #3\"></md-tab>\n *  <md-tabs>\n *  </hljs>\n *\n * Tabs supports three (3) usage scenarios:\n *\n *  1. Tabs (buttons only)\n *  2. Tabs with internal view content\n *  3. Tabs with external view content\n *\n * **Tab-only** support is useful when tab buttons are used for custom navigation regardless of any other components, content, or views.\n * **Tabs with internal views** are the traditional usages where each tab has associated view content and the view switching is managed internally by the Tabs component.\n * **Tabs with external view content** is often useful when content associated with each tab is independently managed and data-binding notifications announce tab selection changes.\n *\n * > As a performance bonus, if the tab content is managed internally then the non-active (non-visible) tab contents are temporarily disconnected from the `$scope.$digest()` processes; which restricts and optimizes DOM updates to only the currently active tab.\n *\n * Additional features also include:\n *\n * *  Content can include any markup.\n * *  If a tab is disabled while active/selected, then the next tab will be auto-selected.\n * *  If the currently active tab is the last tab, then next() action will select the first tab.\n * *  Any markup (other than **`<md-tab>`** tags) will be transcluded into the tab header area BEFORE the tab buttons.\n *\n * ### Explanation of tab stretching\n *\n * Initially, tabs will have an inherent size.  This size will either be defined by how much space is needed to accommodate their text or set by the user through CSS.  Calculations will be based on this size.\n *\n * On mobile devices, tabs will be expanded to fill the available horizontal space.  When this happens, all tabs will become the same size.\n *\n * On desktops, by default, stretching will never occur.\n *\n * This default behavior can be overridden through the `md-stretch-tabs` attribute.  Here is a table showing when stretching will occur:\n *\n * `md-stretch-tabs` | mobile    | desktop\n * ------------------|-----------|--------\n * `auto`            | stretched | ---\n * `always`          | stretched | stretched\n * `never`           | ---       | ---\n *\n * @param {integer=} md-selected Index of the active/selected tab\n * @param {boolean=} md-no-ink If present, disables ink ripple effects.\n * @param {boolean=} md-no-bar If present, disables the selection ink bar.\n * @param {string=}  md-align-tabs Attribute to indicate position of tab buttons: `bottom` or `top`; default is `top`\n * @param {string=} md-stretch-tabs Attribute to indicate whether or not to stretch tabs: `auto`, `always`, or `never`; default is `auto`\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-tabs md-selected=\"selectedIndex\" >\n *   <img ng-src=\"img/angular.png\" class=\"centered\">\n *\n *   <md-tab\n *      ng-repeat=\"tab in tabs | orderBy:predicate:reversed\"\n *      md-on-select=\"onTabSelected(tab)\"\n *      md-on-deselect=\"announceDeselected(tab)\"\n *      disabled=\"tab.disabled\" >\n *\n *       <md-tab-label>\n *           {{tab.title}}\n *           <img src=\"img/removeTab.png\"\n *                ng-click=\"removeTab(tab)\"\n *                class=\"delete\" >\n *       </md-tab-label>\n *\n *       {{tab.content}}\n *\n *   </md-tab>\n *\n * </md-tabs>\n * </hljs>\n *\n */\nfunction TabsDirective($mdTheming) {\n  return {\n    restrict: 'E',\n    controller: '$mdTabs',\n    require: 'mdTabs',\n    transclude: true,\n    scope: {\n      selectedIndex: '=?mdSelected'\n    },\n    template:\n      '<section class=\"md-header\" ' +\n        'ng-class=\"{\\'md-paginating\\': pagination.active}\">' +\n\n        '<button class=\"md-paginator md-prev\" ' +\n          'ng-if=\"pagination.active && pagination.hasPrev\" ' +\n          'ng-click=\"pagination.clickPrevious()\" ' +\n          'aria-hidden=\"true\">' +\n        '</button>' +\n\n        // overflow: hidden container when paginating\n        '<div class=\"md-header-items-container\" md-tabs-pagination>' +\n          // flex container for <md-tab> elements\n          '<div class=\"md-header-items\">' +\n            '<md-tabs-ink-bar></md-tabs-ink-bar>' +\n          '</div>' +\n        '</div>' +\n\n        '<button class=\"md-paginator md-next\" ' +\n          'ng-if=\"pagination.active && pagination.hasNext\" ' +\n          'ng-click=\"pagination.clickNext()\" ' +\n          'aria-hidden=\"true\">' +\n        '</button>' +\n\n      '</section>' +\n      '<section class=\"md-tabs-content\"></section>',\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, tabsCtrl, transclude) {\n\n    scope.stretchTabs = attr.hasOwnProperty('mdStretchTabs') ? attr.mdStretchTabs || 'always' : 'auto';\n\n    $mdTheming(element);\n    configureAria();\n    watchSelected();\n\n    transclude(scope.$parent, function(clone) {\n      angular.element(element[0].querySelector('.md-header-items')).append(clone);\n    });\n\n    function configureAria() {\n      element.attr('role', 'tablist');\n    }\n\n    function watchSelected() {\n      scope.$watch('selectedIndex', function watchSelectedIndex(newIndex, oldIndex) {\n        if (oldIndex == newIndex) return;\n        var rightToLeft = oldIndex > newIndex;\n        tabsCtrl.deselect(tabsCtrl.itemAt(oldIndex), rightToLeft);\n\n        if (tabsCtrl.inRange(newIndex)) {\n          var newTab = tabsCtrl.itemAt(newIndex);\n          while (newTab && newTab.isDisabled()) {\n            newTab = newIndex > oldIndex \n                ? tabsCtrl.next(newTab)\n                : tabsCtrl.previous(newTab);\n          }\n          tabsCtrl.select(newTab, rightToLeft);\n        }\n      });\n    }\n  }\n}\nTabsDirective.$inject = [\"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/textField/bower.json",
    "content": "{\n  \"name\": \"angular-material-textField\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/textField/textField-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  text-shadow: '{{foreground-shadow}}'; }\n  md-input-group.md-THEME_NAME-theme input::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme input::-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-moz-placeholder, md-input-group.md-THEME_NAME-theme input:-ms-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-webkit-input-placeholder, md-input-group.md-THEME_NAME-theme textarea::-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-moz-placeholder, md-input-group.md-THEME_NAME-theme textarea:-ms-input-placeholder {\n    color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme label {\n  text-shadow: '{{foreground-shadow}}';\n  color: '{{foreground-3}}'; }\nmd-input-group.md-THEME_NAME-theme input, md-input-group.md-THEME_NAME-theme textarea {\n  color: '{{foreground-1}}';\n  border-color: '{{foreground-4}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused input, md-input-group.md-THEME_NAME-theme.md-input-focused textarea {\n  border-color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused label {\n  color: '{{primary-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent input, md-input-group.md-THEME_NAME-theme.md-input-focused.md-accent textarea {\n  border-color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-focused.md-accent label {\n  color: '{{accent-500}}'; }\nmd-input-group.md-THEME_NAME-theme.md-input-has-value:not(.md-input-focused) label {\n  color: '{{foreground-2}}'; }\nmd-input-group.md-THEME_NAME-theme .md-input[disabled] {\n  border-bottom-color: '{{foreground-4}}';\n  color: '{{foreground-3}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/textField/textField.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-input-group label, .md-input-group label {\n  display: block;\n  font-size: 0.75em; }\nmd-input-group textarea, md-input-group input[type=\"text\"], md-input-group input[type=\"password\"], md-input-group input[type=\"datetime\"], md-input-group input[type=\"datetime-local\"], md-input-group input[type=\"date\"], md-input-group input[type=\"month\"], md-input-group input[type=\"time\"], md-input-group input[type=\"week\"], md-input-group input[type=\"number\"], md-input-group input[type=\"email\"], md-input-group input[type=\"url\"], md-input-group input[type=\"search\"], md-input-group input[type=\"tel\"], md-input-group input[type=\"color\"], .md-input-group textarea, .md-input-group input[type=\"text\"], .md-input-group input[type=\"password\"], .md-input-group input[type=\"datetime\"], .md-input-group input[type=\"datetime-local\"], .md-input-group input[type=\"date\"], .md-input-group input[type=\"month\"], .md-input-group input[type=\"time\"], .md-input-group input[type=\"week\"], .md-input-group input[type=\"number\"], .md-input-group input[type=\"email\"], .md-input-group input[type=\"url\"], .md-input-group input[type=\"search\"], .md-input-group input[type=\"tel\"], .md-input-group input[type=\"color\"] {\n  display: block;\n  border-width: 0 0 1px 0;\n  padding-top: 2px;\n  line-height: 26px;\n  padding-bottom: 1px; }\n  md-input-group textarea:focus, md-input-group input[type=\"text\"]:focus, md-input-group input[type=\"password\"]:focus, md-input-group input[type=\"datetime\"]:focus, md-input-group input[type=\"datetime-local\"]:focus, md-input-group input[type=\"date\"]:focus, md-input-group input[type=\"month\"]:focus, md-input-group input[type=\"time\"]:focus, md-input-group input[type=\"week\"]:focus, md-input-group input[type=\"number\"]:focus, md-input-group input[type=\"email\"]:focus, md-input-group input[type=\"url\"]:focus, md-input-group input[type=\"search\"]:focus, md-input-group input[type=\"tel\"]:focus, md-input-group input[type=\"color\"]:focus, .md-input-group textarea:focus, .md-input-group input[type=\"text\"]:focus, .md-input-group input[type=\"password\"]:focus, .md-input-group input[type=\"datetime\"]:focus, .md-input-group input[type=\"datetime-local\"]:focus, .md-input-group input[type=\"date\"]:focus, .md-input-group input[type=\"month\"]:focus, .md-input-group input[type=\"time\"]:focus, .md-input-group input[type=\"week\"]:focus, .md-input-group input[type=\"number\"]:focus, .md-input-group input[type=\"email\"]:focus, .md-input-group input[type=\"url\"]:focus, .md-input-group input[type=\"search\"]:focus, .md-input-group input[type=\"tel\"]:focus, .md-input-group input[type=\"color\"]:focus {\n    outline: 0; }\nmd-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n  background: none; }\n\nmd-input-group, .md-input-group {\n  padding-bottom: 2px;\n  margin: 10px 0 8px 0;\n  position: relative;\n  display: block; }\n  md-input-group label, .md-input-group label {\n    font-size: 1em;\n    z-index: 1;\n    pointer-events: none;\n    -webkit-font-smoothing: antialiased; }\n    md-input-group label:hover, .md-input-group label:hover {\n      cursor: text; }\n  md-input-group label, .md-input-group label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    -webkit-transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n    -webkit-transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group input, md-input-group textarea, .md-input-group input, .md-input-group textarea {\n    border-bottom-width: 1px;\n    -webkit-transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n  md-input-group.md-input-focused label, .md-input-group.md-input-focused label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-focused input, md-input-group.md-input-focused textarea, .md-input-group.md-input-focused input, .md-input-group.md-input-focused textarea {\n    border-bottom-width: 2px; }\n  md-input-group.md-input-focused input, .md-input-group.md-input-focused input {\n    padding-bottom: 0px; }\n  md-input-group.md-input-has-value label, .md-input-group.md-input-has-value label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group.md-input-has-value:not(.md-input-focused) label, .md-input-group.md-input-has-value:not(.md-input-focused) label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    border-bottom-width: 0px; }\n  md-input-group[disabled] input, md-input-group[disabled] textarea, .md-input-group[disabled] input, .md-input-group[disabled] textarea {\n    background-size: 3px 1px;\n    background-position: 0 bottom;\n    background-size: 2px 1px;\n    background-repeat: repeat-x;\n    pointer-events: none; }\n  md-input-group[disabled] label, .md-input-group[disabled] label {\n    -webkit-transform: translate3d(0, 4px, 0) scale(0.75);\n            transform: translate3d(0, 4px, 0) scale(0.75); }\n  md-input-group[disabled] *:not(.md-input-has-value) label, .md-input-group[disabled] *:not(.md-input-has-value) label {\n    -webkit-transform: translate3d(0, 22px, 0);\n            transform: translate3d(0, 22px, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n    -webkit-transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);\n            transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/textField/textField.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.textField\n * @description\n * Form\n */\nangular.module('material.components.textField', [\n  'material.core'\n])\n  .directive('mdInputGroup', mdInputGroupDirective)\n  .directive('mdInput', mdInputDirective)\n  .directive('mdTextFloat', mdTextFloatDirective);\n\n\nfunction mdTextFloatDirective($mdTheming, $mdUtil, $parse, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    scope : {\n      fid : '@?mdFid',\n      label : '@?',\n      value : '=ngModel'\n    },\n    compile : function(element, attr) {\n\n      $log.warn('<md-text-float> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      if ( angular.isUndefined(attr.mdFid) ) {\n        attr.mdFid = $mdUtil.nextUid();\n      }\n\n      return {\n        pre : function(scope, element, attrs) {\n          var disabledParsed = $parse(attrs.ngDisabled);\n          scope.isDisabled = function() {\n            return disabledParsed(scope.$parent);\n          };\n\n          scope.inputType = attrs.type || \"text\";\n        },\n        post: $mdTheming\n      };\n    },\n    template:\n    '<md-input-group tabindex=\"-1\">' +\n    ' <label for=\"{{fid}}\" >{{label}}</label>' +\n    ' <md-input id=\"{{fid}}\" ng-disabled=\"isDisabled()\" ng-model=\"value\" type=\"{{inputType}}\"></md-input>' +\n    '</md-input-group>'\n  };\n}\nmdTextFloatDirective.$inject = [\"$mdTheming\", \"$mdUtil\", \"$parse\", \"$log\"];\n\nfunction mdInputGroupDirective($log) {\n  return {\n    restrict: 'CE',\n    controller: ['$element', function($element) {\n\n      $log.warn('<md-input-group> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n      this.setFocused = function(isFocused) {\n        $element.toggleClass('md-input-focused', !!isFocused);\n      };\n      this.setHasValue = function(hasValue) {\n        $element.toggleClass('md-input-has-value', hasValue );\n      };\n    }]\n  };\n\n}\nmdInputGroupDirective.$inject = [\"$log\"];\n\nfunction mdInputDirective($mdUtil, $log) {\n  return {\n    restrict: 'E',\n    replace: true,\n    template: '<input >',\n    require: ['^?mdInputGroup', '?ngModel'],\n    link: function(scope, element, attr, ctrls) {\n      if ( !ctrls[0] ) return;\n\n      $log.warn('<md-input> is deprecated. Please use `<md-input-container>` and `<input>`.' + \n                'More information at http://material.angularjs.org/#/api/material.components.input/directive/mdInputContainer');\n\n      var inputGroupCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n\n      scope.$watch(scope.isDisabled, function(isDisabled) {\n        element.attr('aria-disabled', !!isDisabled);\n        element.attr('tabindex', !!isDisabled);\n      });\n      element.attr('type', attr.type || element.parent().attr('type') || \"text\");\n\n      // When the input value changes, check if it \"has\" a value, and\n      // set the appropriate class on the input group\n      if (ngModelCtrl) {\n        //Add a $formatter so we don't use up the render function\n        ngModelCtrl.$formatters.push(function(value) {\n          inputGroupCtrl.setHasValue( isNotEmpty(value) );\n          return value;\n        });\n      }\n\n      element\n        .on('input', function() {\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        })\n        .on('focus', function(e) {\n          // When the input focuses, add the focused class to the group\n          inputGroupCtrl.setFocused(true);\n        })\n        .on('blur', function(e) {\n          // When the input blurs, remove the focused class from the group\n          inputGroupCtrl.setFocused(false);\n          inputGroupCtrl.setHasValue( isNotEmpty() );\n        });\n\n      scope.$on('$destroy', function() {\n        inputGroupCtrl.setFocused(false);\n        inputGroupCtrl.setHasValue(false);\n      });\n\n\n      function isNotEmpty(value) {\n        value = angular.isUndefined(value) ? element.val() : value;\n        return (angular.isDefined(value) && (value!==null) &&\n               (value.toString().trim() !== \"\"));\n      }\n    }\n  };\n}\nmdInputDirective.$inject = [\"$mdUtil\", \"$log\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toast/bower.json",
    "content": "{\n  \"name\": \"angular-material-toast\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-swipe\": \"0.7.0-rc3\",\n    \"angular-material-button\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toast/toast-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-toast.md-THEME_NAME-theme {\n  background-color: '{{foreground-1}}';\n  color: '{{background-50}}'; }\n  md-toast.md-THEME_NAME-theme .md-button {\n    color: '{{background-50}}'; }\n  md-toast.md-THEME_NAME-theme .md-action {\n    color: '{{primary-A200}}'; }\n    md-toast.md-THEME_NAME-theme .md-action.md-accent {\n      color: '{{accent-A200}}'; }\n    md-toast.md-THEME_NAME-theme .md-action.md-warn {\n      color: '{{warn-A200}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toast/toast.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-toast {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  position: absolute;\n  box-sizing: border-box;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  min-height: 48px;\n  padding-left: 24px;\n  padding-right: 24px;\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n  border-radius: 2px;\n  font-size: 14px;\n  cursor: default;\n  max-width: 879px;\n  max-height: 40px;\n  height: 24px;\n  z-index: 90;\n  opacity: 1;\n  -webkit-transform: translate3d(0, 0, 0) rotateZ(0deg);\n          transform: translate3d(0, 0, 0) rotateZ(0deg);\n  -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n          transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n  /* Transition differently when swiping */ }\n  md-toast.md-capsule {\n    border-radius: 24px; }\n  md-toast.ng-leave-active {\n    -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n            transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-toast.md-swipeleft, md-toast.md-swiperight, md-toast.md-swipeup, md-toast.md-swipedown {\n    -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); }\n  md-toast.ng-enter {\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n    opacity: 0; }\n    md-toast.ng-enter.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-enter.ng-enter-active {\n      -webkit-transform: translate3d(0, 0, 0);\n              transform: translate3d(0, 0, 0);\n      opacity: 1; }\n  md-toast.ng-leave.ng-leave-active {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-top {\n      -webkit-transform: translate3d(0, -100%, 0);\n              transform: translate3d(0, -100%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0%, 0);\n              transform: translate3d(-100%, 0%, 0); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 0%, 0);\n              transform: translate3d(100%, 0%, 0); }\n  md-toast .md-action {\n    line-height: 19px;\n    padding-left: 24px;\n    cursor: pointer;\n    text-transform: uppercase;\n    float: right; }\n\n@media (max-width: 600px) {\n  md-toast {\n    left: 0;\n    right: 0;\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    border-radius: 0;\n    bottom: 0; }\n    md-toast.md-top {\n      bottom: auto;\n      top: 0; }\n }\n\n@media (min-width: 600px) {\n  md-toast {\n    min-width: 288px;\n    /* \n     * When the toast doesn't take up the whole screen,\n     * make it rotate when the user swipes it away\n     */ }\n    md-toast.md-bottom {\n      bottom: 8px; }\n    md-toast.md-left {\n      left: 8px; }\n    md-toast.md-right {\n      right: 8px; }\n    md-toast.md-top {\n      top: 8px; }\n    md-toast.ng-leave.ng-leave-active.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 25%, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 25%, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-swiperight {\n      -webkit-transform: translate3d(100%, 25%, 0) rotateZ(15deg);\n              transform: translate3d(100%, 25%, 0) rotateZ(15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swipeleft {\n      -webkit-transform: translate3d(-100%, 0, 0) rotateZ(-15deg);\n              transform: translate3d(-100%, 0, 0) rotateZ(-15deg); }\n    md-toast.ng-leave.ng-leave-active.md-top.md-swiperight {\n      -webkit-transform: translate3d(100%, 0, 0) rotateZ(15deg);\n              transform: translate3d(100%, 0, 0) rotateZ(15deg); }\n }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toast/toast.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toast\n * @description\n * Toast\n */\nangular.module('material.components.toast', [\n  'material.core',\n  'material.components.swipe',\n  'material.components.button'\n])\n  .directive('mdToast', MdToastDirective)\n  .provider('$mdToast', MdToastProvider);\n\nfunction MdToastDirective() {\n  return {\n    restrict: 'E'\n  };\n}\n\n/**\n * @ngdoc service\n * @name $mdToast\n * @module material.components.toast\n *\n * @description\n * `$mdToast` is a service to build a toast nofication on any position\n * on the screen with an optional duration, and provides a simple promise API.\n *\n *\n * ### Restrictions on custom toasts\n * - The toast's template must have an outer `<md-toast>` element.\n * - For a toast action, use element with class `md-action`.\n * - Add the class `md-capsule` for curved corners.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div ng-controller=\"MyController\">\n *   <md-button ng-click=\"openToast()\">\n *     Open a Toast!\n *   </md-button>\n * </div>\n * </hljs>\n *\n * <hljs lang=\"js\">\n * var app = angular.module('app', ['ngMaterial']);\n * app.controller('MyController', function($scope, $mdToast) {\n *   $scope.openToast = function($event) {\n *     $mdToast.show($mdToast.simple().content('Hello!'));\n *     // Could also do $mdtoast.showSimple('Hello');\n *   };\n * });\n * </hljs>\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#showSimple\n * \n * @description\n * Convenience method which builds and shows a simple toast.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n *\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#simple\n *\n * @description\n * Builds a preconfigured toast.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods:\n *\n * - $mdToastPreset#content(string) - sets toast content to string\n * - $mdToastPreset#action(string) - adds an action button, which resolves the promise returned from `show()` if clicked.\n * - $mdToastPreset#highlightAction(boolean) - sets action button to be highlighted\n * - $mdToastPreset#capsule(boolean) - adds 'md-capsule' class to the toast (curved corners)\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#build\n *\n * @description\n * Creates a custom `$mdToastPreset` that you can configure.\n *\n * @returns {obj} a `$mdToastPreset` with the chainable configuration methods for shows' options (see below).\n */\n\n /**\n * @ngdoc method\n * @name $mdToast#show\n *\n * @description Shows the toast.\n *\n * @param {object} optionsOrPreset Either provide an `$mdToastPreset` returned from `simple()`\n * and `build()`, or an options object with the following properties:\n *\n *   - `templateUrl` - `{string=}`: The url of an html template file that will\n *     be used as the content of the toast. Restrictions: the template must\n *     have an outer `md-toast` element.\n *   - `template` - `{string=}`: Same as templateUrl, except this is an actual\n *     template string.\n *   - `hideDelay` - `{number=}`: How many milliseconds the toast should stay\n *     active before automatically closing.  Set to 0 or false to have the toast stay open until\n *     closed manually. Default: 3000.\n *   - `position` - `{string=}`: Where to place the toast. Available: any combination\n *     of 'bottom', 'left', 'top', 'right', 'fit'. Default: 'bottom left'.\n *   - `controller` - `{string=}`: The controller to associate with this toast.\n *     The controller will be injected the local `$hideToast`, which is a function\n *     used to hide the toast.\n *   - `locals` - `{string=}`: An object containing key/value pairs. The keys will\n *     be used as names of values to inject into the controller. For example,\n *     `locals: {three: 3}` would inject `three` into the controller with the value\n *     of 3.\n *   - `resolve` - `{object=}`: Similar to locals, except it takes promises as values\n *     and the toast will not open until the promises resolve.\n *   - `controllerAs` - `{string=}`: An alias to assign the controller to on the scope.\n *   - `parent` - `{element=}`: The element to append the toast to. Defaults to appending\n *     to the root element of the application.\n *\n * @returns {promise} A promise that can be resolved with `$mdToast.hide()` or\n * rejected with `$mdToast.cancel()`.\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#hide\n *\n * @description\n * Hide an existing toast and resolve the promise returned from `$mdToast.show()`.\n *\n * @param {*=} response An argument for the resolved promise.\n *\n */\n\n/**\n * @ngdoc method\n * @name $mdToast#cancel\n *\n * @description\n * Hide the existing toast and reject the promise returned from\n * `$mdToast.show()`.\n *\n * @param {*=} response An argument for the rejected promise.\n *\n */\n\nfunction MdToastProvider($$interimElementProvider) {\n\n  toastDefaultOptions.$inject = [\"$timeout\", \"$animate\", \"$mdSwipe\", \"$mdTheming\", \"$mdToast\"];\n  return $$interimElementProvider('$mdToast')\n    .setDefaults({\n      methods: ['position', 'hideDelay', 'capsule'],\n      options: toastDefaultOptions\n    })\n    .addPreset('simple', {\n      argOption: 'content',\n      methods: ['content', 'action', 'highlightAction'],\n      options: /* @ngInject */ [\"$mdToast\", function($mdToast) {\n        return {\n          template: [\n            '<md-toast ng-class=\"{\\'md-capsule\\': toast.capsule}\">',\n              '<span flex>{{ toast.content }}</span>',\n              '<md-button ng-if=\"toast.action\" ng-click=\"toast.resolve()\" ng-class=\"{\\'md-action\\': toast.highlightAction}\">',\n                '{{ toast.action }}',\n              '</md-button>',\n            '</md-toast>'\n          ].join(''),\n          controller: function mdToastCtrl() {\n            this.resolve = function() {\n              $mdToast.hide();\n            };\n          },\n          controllerAs: 'toast',\n          bindToController: true\n        };\n      }]\n    });\n\n  /* @ngInject */\n  function toastDefaultOptions($timeout, $animate, $mdSwipe, $mdTheming, $mdToast) {\n    return {\n      onShow: onShow,\n      onRemove: onRemove,\n      position: 'bottom left',\n      themable: true,\n      hideDelay: 3000\n    };\n\n    function onShow(scope, element, options) {\n      // 'top left' -> 'md-top md-left'\n      element.addClass(options.position.split(' ').map(function(pos) {\n        return 'md-' + pos;\n      }).join(' '));\n      options.parent.addClass(toastOpenClass(options.position));\n\n      var configureSwipe = $mdSwipe(scope, 'swipeleft swiperight');\n      options.detachSwipe = configureSwipe(element, function(ev) {\n        //Add swipeleft/swiperight class to element so it can animate correctly\n        element.addClass('md-' + ev.type);\n        $timeout($mdToast.cancel);\n      });\n\n      return $animate.enter(element, options.parent);\n    }\n\n    function onRemove(scope, element, options) {\n      options.detachSwipe();\n      options.parent.removeClass(toastOpenClass(options.position));\n      return $animate.leave(element);\n    }\n\n    function toastOpenClass(position) {\n      return 'md-toast-open-' +\n        (position.indexOf('top') > -1 ? 'top' : 'bottom');\n    }\n  }\n\n}\nMdToastProvider.$inject = [\"$$interimElementProvider\"];\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toolbar/bower.json",
    "content": "{\n  \"name\": \"angular-material-toolbar\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\",\n    \"angular-material-content\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toolbar/toolbar-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-toolbar.md-THEME_NAME-theme {\n  background-color: '{{primary-color}}';\n  color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme .md-button {\n    color: '{{primary-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-accent {\n    background-color: '{{accent-color}}';\n    color: '{{accent-contrast}}'; }\n  md-toolbar.md-THEME_NAME-theme.md-warn {\n    background-color: '{{warn-color}}';\n    color: '{{warn-contrast}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toolbar/toolbar.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-toolbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  position: relative;\n  z-index: 2;\n  font-size: 1.3em;\n  min-height: 64px;\n  width: 100%; }\n  md-toolbar.md-tall {\n    height: 128px;\n    min-height: 128px;\n    max-height: 128px; }\n  md-toolbar.md-medium-tall {\n    height: 88px;\n    min-height: 88px;\n    max-height: 88px; }\n    md-toolbar.md-medium-tall .md-toolbar-tools {\n      height: 48px;\n      min-height: 48px;\n      max-height: 48px; }\n  md-toolbar .md-indent {\n    margin-left: 64px; }\n\n.md-toolbar-tools {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  width: 100%;\n  height: 64px;\n  min-height: 100%;\n  max-height: 64px;\n  font-size: inherit;\n  font-weight: normal;\n  padding: 0 16px;\n  margin: 0; }\n  .md-toolbar-tools > * {\n    font-size: inherit; }\n  .md-toolbar-tools h2, .md-toolbar-tools h3 {\n    font-weight: normal; }\n  .md-toolbar-tools a {\n    color: inherit;\n    text-decoration: none; }\n  .md-toolbar-tools .fill-height {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -webkit-align-items: center;\n        -ms-flex-align: center;\n            align-items: center; }\n  .md-toolbar-tools .md-tools {\n    margin-left: auto; }\n  .md-toolbar-tools .md-button {\n    font-size: 14px; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/toolbar/toolbar.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.toolbar\n */\nangular.module('material.components.toolbar', [\n  'material.core',\n  'material.components.content'\n])\n  .directive('mdToolbar', mdToolbarDirective);\n\n/**\n * @ngdoc directive\n * @name mdToolbar\n * @module material.components.toolbar\n * @restrict E\n * @description\n * `md-toolbar` is used to place a toolbar in your app.\n *\n * Toolbars are usually used above a content area to display the title of the\n * current page, and show relevant action buttons for that page.\n *\n * You can change the height of the toolbar by adding either the\n * `md-medium-tall` or `md-tall` class to the toolbar.\n *\n * @usage\n * <hljs lang=\"html\">\n * <div layout=\"column\" layout-fill>\n *   <md-toolbar>\n *\n *     <div class=\"md-toolbar-tools\">\n *       <span>My App's Title</span>\n *\n *       <!-- fill up the space between left and right area -->\n *       <span flex></span>\n *\n *       <md-button>\n *         Right Bar Button\n *       </md-button>\n *     </div>\n *\n *   </md-toolbar>\n *   <md-content>\n *     Hello!\n *   </md-content>\n * </div>\n * </hljs>\n *\n * @param {boolean=} md-scroll-shrink Whether the header should shrink away as\n * the user scrolls down, and reveal itself as the user scrolls up.\n * Note: for scrollShrink to work, the toolbar must be a sibling of a\n * `md-content` element, placed before it. See the scroll shrink demo.\n *\n *\n * @param {number=} md-shrink-speed-factor How much to change the speed of the toolbar's\n * shrinking by. For example, if 0.25 is given then the toolbar will shrink\n * at one fourth the rate at which the user scrolls down. Default 0.5.\n */\nfunction mdToolbarDirective($$rAF, $mdConstant, $mdUtil, $mdTheming) {\n\n  return {\n    restrict: 'E',\n    controller: angular.noop,\n    link: function(scope, element, attr) {\n      $mdTheming(element);\n\n      if (angular.isDefined(attr.mdScrollShrink)) {\n        setupScrollShrink();\n      }\n\n      function setupScrollShrink() {\n        // Current \"y\" position of scroll\n        var y = 0;\n        // Store the last scroll top position\n        var prevScrollTop = 0;\n\n        var shrinkSpeedFactor = attr.mdShrinkSpeedFactor || 0.5;\n\n        var toolbarHeight;\n        var contentElement;\n\n        var debouncedContentScroll = $$rAF.debounce(onContentScroll);\n        var debouncedUpdateHeight = $mdUtil.debounce(updateToolbarHeight, 5 * 1000);\n\n        // Wait for $mdContentLoaded event from mdContent directive.\n        // If the mdContent element is a sibling of our toolbar, hook it up\n        // to scroll events.\n        scope.$on('$mdContentLoaded', onMdContentLoad);\n\n        function onMdContentLoad($event, newContentEl) {\n          // Toolbar and content must be siblings\n          if (element.parent()[0] === newContentEl.parent()[0]) {\n            // unhook old content event listener if exists\n            if (contentElement) {\n              contentElement.off('scroll', debouncedContentScroll);\n            }\n\n            newContentEl.on('scroll', debouncedContentScroll);\n            newContentEl.attr('scroll-shrink', 'true');\n\n            contentElement = newContentEl;\n            $$rAF(updateToolbarHeight);\n          }\n        }\n\n        function updateToolbarHeight() {\n          toolbarHeight = element.prop('offsetHeight');\n          // Add a negative margin-top the size of the toolbar to the content el.\n          // The content will start transformed down the toolbarHeight amount,\n          // so everything looks normal.\n          //\n          // As the user scrolls down, the content will be transformed up slowly\n          // to put the content underneath where the toolbar was.\n          contentElement.css(\n            'margin-top',\n            (-toolbarHeight * shrinkSpeedFactor) + 'px'\n          );\n          onContentScroll();\n        }\n\n        function onContentScroll(e) {\n          var scrollTop = e ? e.target.scrollTop : prevScrollTop;\n\n          debouncedUpdateHeight();\n\n          y = Math.min(\n            toolbarHeight / shrinkSpeedFactor,\n            Math.max(0, y + scrollTop - prevScrollTop)\n          );\n\n          element.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + (-y * shrinkSpeedFactor) + 'px,0)'\n          );\n          contentElement.css(\n            $mdConstant.CSS.TRANSFORM,\n            'translate3d(0,' + ((toolbarHeight - y) * shrinkSpeedFactor) + 'px,0)'\n          );\n\n          prevScrollTop = scrollTop;\n        }\n\n      }\n\n    }\n  };\n\n}\nmdToolbarDirective.$inject = [\"$$rAF\", \"$mdConstant\", \"$mdUtil\", \"$mdTheming\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tooltip/bower.json",
    "content": "{\n  \"name\": \"angular-material-tooltip\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {\n    \"angular-material-core\": \"0.7.0-rc3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tooltip/tooltip-default-theme.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\nmd-tooltip.md-THEME_NAME-theme {\n  color: '{{background-A100}}'; }\n  md-tooltip.md-THEME_NAME-theme .md-background {\n    background-color: '{{foreground-2}}'; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tooltip/tooltip.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n@-webkit-keyframes tooltipBackgroundShow {\n  0% {\n    -webkit-transform: scale(0.2);\n            transform: scale(0.2);\n    opacity: 0.25; }\n\n  50% {\n    opacity: 1; }\n\n  100% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; } }\n\n@keyframes tooltipBackgroundShow {\n  0% {\n    -webkit-transform: scale(0.2);\n            transform: scale(0.2);\n    opacity: 0.25; }\n\n  50% {\n    opacity: 1; }\n\n  100% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 1; } }\n\n@-webkit-keyframes tooltipBackgroundHide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@keyframes tooltipBackgroundHide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\nmd-tooltip {\n  position: absolute;\n  font-size: 14px;\n  z-index: 100;\n  overflow: hidden;\n  pointer-events: none;\n  border-radius: 4px;\n  /**\n   * Depending on the tooltip's size as a multiple of 32 (set by JS),\n   * change the background's animation duration.\n   * The larger the tooltip, the less time the background should take to ripple outwards.\n   */ }\n  md-tooltip[md-direction=\"bottom\"] {\n    -webkit-transform: translate3d(0, -30%, 0);\n            transform: translate3d(0, -30%, 0);\n    margin-top: 8px; }\n  md-tooltip[md-direction=\"top\"] {\n    -webkit-transform: translate3d(0, 30%, 0);\n            transform: translate3d(0, 30%, 0);\n    margin-bottom: 8px; }\n  md-tooltip .md-background {\n    position: absolute;\n    left: 50%;\n    width: 256px;\n    height: 256px;\n    margin-left: -128px;\n    margin-top: -128px;\n    border-radius: 256px;\n    opacity: 0.25;\n    -webkit-transform: scale(0.2);\n            transform: scale(0.2); }\n  md-tooltip .md-content {\n    max-width: 240px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    padding: 8px;\n    background: transparent;\n    opacity: 0.3;\n    -webkit-transition: inherit;\n            transition: inherit; }\n  md-tooltip.md-hide {\n    -webkit-transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2);\n            transition: all 0.3s cubic-bezier(0.55, 0, 0.55, 0.2); }\n  md-tooltip.md-show {\n    -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n            transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n    pointer-events: auto;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0); }\n    md-tooltip.md-show .md-background {\n      -webkit-transform: scale(1);\n              transform: scale(1);\n      opacity: 1;\n      -webkit-animation: tooltipBackgroundShow linear;\n              animation: tooltipBackgroundShow linear; }\n    md-tooltip.md-show .md-content {\n      opacity: 0.99; }\n  md-tooltip.md-hide .md-background {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    opacity: 0;\n    -webkit-animation: tooltipBackgroundHide 0.2s linear;\n            animation: tooltipBackgroundHide 0.2s linear; }\n  md-tooltip[width-32=\"1\"].md-show .md-background {\n    -webkit-animation-duration: 900ms;\n            animation-duration: 900ms; }\n  md-tooltip[width-32=\"2\"].md-show .md-background {\n    -webkit-animation-duration: 800ms;\n            animation-duration: 800ms; }\n  md-tooltip[width-32=\"3\"].md-show .md-background {\n    -webkit-animation-duration: 700ms;\n            animation-duration: 700ms; }\n  md-tooltip[width-32=\"4\"].md-show .md-background {\n    -webkit-animation-duration: 600ms;\n            animation-duration: 600ms; }\n  md-tooltip[width-32=\"5\"].md-show .md-background {\n    -webkit-animation-duration: 500ms;\n            animation-duration: 500ms; }\n  md-tooltip[width-32=\"6\"].md-show .md-background {\n    -webkit-animation-duration: 400ms;\n            animation-duration: 400ms; }\n  md-tooltip[width-32=\"7\"].md-show .md-background {\n    -webkit-animation-duration: 300ms;\n            animation-duration: 300ms; }\n  md-tooltip[width-32=\"8\"].md-show .md-background {\n    -webkit-animation-duration: 200ms;\n            animation-duration: 200ms; }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/tooltip/tooltip.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.tooltip\n */\nangular.module('material.components.tooltip', [\n  'material.core'\n])\n  .directive('mdTooltip', MdTooltipDirective);\n\n/**\n * @ngdoc directive\n * @name mdTooltip\n * @module material.components.tooltip\n * @description\n * Tooltips are used to describe elements that are interactive and primarily graphical (not textual).\n *\n * Place a `<md-tooltip>` as a child of the element it describes.\n *\n * A tooltip will activate when the user focuses, hovers over, or touches the parent.\n *\n * @usage\n * <hljs lang=\"html\">\n * <md-icon icon=\"/img/icons/ic_play_arrow_24px.svg\">\n *   <md-tooltip>\n *     Play Music\n *   </md-tooltip>\n * </md-icon>\n * </hljs>\n *\n * @param {expression=} md-visible Boolean bound to whether the tooltip is\n * currently visible.\n * @param {number=} md-delay How many milliseconds to wait to show the tooltip after the user focuses, hovers, or touches the parent. Defaults to 400ms.\n */\nfunction MdTooltipDirective($timeout, $window, $$rAF, $document, $mdUtil, $mdTheming, $rootElement) {\n\n  var TOOLTIP_SHOW_DELAY = 400;\n  var TOOLTIP_WINDOW_EDGE_SPACE = 8;\n\n  return {\n    restrict: 'E',\n    transclude: true,\n    template:\n      '<div class=\"md-background\"></div>' +\n      '<div class=\"md-content\" ng-transclude></div>',\n    scope: {\n      visible: '=?mdVisible',\n      delay: '=?mdDelay'\n    },\n    link: postLink\n  };\n\n  function postLink(scope, element, attr, contentCtrl) {\n    $mdTheming(element);\n    var parent = element.parent();\n\n    // Look for the nearest parent md-content, stopping at the rootElement.\n    var current = element.parent()[0];\n    while (current && current !== $rootElement[0] && current !== document.body) {\n      if (current.tagName && current.tagName.toLowerCase() == 'md-content') break;\n      current = current.parentNode;\n    }\n    var tooltipParent = angular.element(current || document.body);\n\n    if (!angular.isDefined(attr.mdDelay)) {\n      scope.delay = TOOLTIP_SHOW_DELAY;\n    }\n\n    // We will re-attach tooltip when visible\n    element.detach();\n    element.attr('role', 'tooltip');\n    element.attr('id', attr.id || ('tooltip_' + $mdUtil.nextUid()));\n\n    parent.on('focus mouseenter touchstart', function() {\n      setVisible(true);\n    });\n    parent.on('blur mouseleave touchend touchcancel', function() {\n      // Don't hide the tooltip if the parent is still focused.\n      if ($document[0].activeElement === parent[0]) return;\n      setVisible(false);\n    });\n\n    scope.$watch('visible', function(isVisible) {\n      if (isVisible) showTooltip();\n      else hideTooltip();\n    });\n\n    var debouncedOnResize = $$rAF.debounce(function windowResize() {\n      // Reposition on resize\n      if (scope.visible) positionTooltip();\n    });\n    angular.element($window).on('resize', debouncedOnResize);\n\n    // Be sure to completely cleanup the element on destroy\n    scope.$on('$destroy', function() {\n      scope.visible = false;\n      element.remove();\n      angular.element($window).off('resize', debouncedOnResize);\n    });\n\n    // *******\n    // Methods\n    // *******\n\n    // If setting visible to true, debounce to scope.delay ms\n    // If setting visible to false and no timeout is active, instantly hide the tooltip.\n    function setVisible(value) {\n      setVisible.value = !!value;\n\n      if (!setVisible.queued) {\n        if (value) {\n          setVisible.queued = true;\n          $timeout(function() {\n            scope.visible = setVisible.value;\n            setVisible.queued = false;\n          }, scope.delay);\n\n        } else {\n          $timeout(function() { scope.visible = false; });\n        }\n      }\n    }\n\n    function showTooltip() {\n      // Insert the element before positioning it, so we can get position\n      // (tooltip is hidden by default)\n      element.removeClass('md-hide');\n      parent.attr('aria-describedby', element.attr('id'));\n      tooltipParent.append(element);\n\n      // Wait until the element has been in the dom for two frames before\n      // fading it in.\n      // Additionally, we position the tooltip twice to avoid positioning bugs\n      positionTooltip();\n      $$rAF(function() {\n\n        $$rAF(function() {\n          positionTooltip();\n          if (!scope.visible) return;\n          element.addClass('md-show');\n        });\n\n      });\n    }\n\n    function hideTooltip() {\n      element.removeClass('md-show').addClass('md-hide');\n      parent.removeAttr('aria-describedby');\n      $timeout(function() {\n        if (scope.visible) return;\n        element.detach();\n      }, 200, false);\n    }\n\n    function positionTooltip() {\n      var tipRect = $mdUtil.elementRect(element, tooltipParent);\n      var parentRect = $mdUtil.elementRect(parent, tooltipParent);\n\n      // Default to bottom position if possible\n      var tipDirection = 'bottom';\n      var newPosition = {\n        left: parentRect.left + parentRect.width / 2 - tipRect.width / 2,\n        top: parentRect.top + parentRect.height\n      };\n\n      // If element bleeds over left/right of the window, place it on the edge of the window.\n      newPosition.left = Math.min(\n        newPosition.left,\n        tooltipParent.prop('scrollWidth') - tipRect.width - TOOLTIP_WINDOW_EDGE_SPACE\n      );\n      newPosition.left = Math.max(newPosition.left, TOOLTIP_WINDOW_EDGE_SPACE);\n\n      // If element bleeds over the bottom of the window, place it above the parent.\n      if (newPosition.top + tipRect.height > tooltipParent.prop('scrollHeight')) {\n        newPosition.top = parentRect.top - tipRect.height;\n        tipDirection = 'top';\n      }\n\n      element.css({top: newPosition.top + 'px', left: newPosition.left + 'px'});\n      // Tell the CSS the size of this tooltip, as a multiple of 32.\n      element.attr('width-32', Math.ceil(tipRect.width / 32));\n      element.attr('md-direction', tipDirection);\n    }\n\n  }\n\n}\nMdTooltipDirective.$inject = [\"$timeout\", \"$window\", \"$$rAF\", \"$document\", \"$mdUtil\", \"$mdTheming\", \"$rootElement\"];\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/whiteframe/bower.json",
    "content": "{\n  \"name\": \"angular-material-whiteframe\",\n  \"version\": \"0.7.0-rc3\",\n  \"dependencies\": {}\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/whiteframe/whiteframe.css",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n.md-whiteframe-z1 {\n  box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); }\n\n.md-whiteframe-z2 {\n  box-shadow: 0px 8px 17px rgba(0, 0, 0, 0.2); }\n\n.md-whiteframe-z3 {\n  box-shadow: 0px 17px 50px rgba(0, 0, 0, 0.19); }\n\n.md-whiteframe-z4 {\n  box-shadow: 0px 16px 28px 0 rgba(0, 0, 0, 0.22); }\n\n.md-whiteframe-z5 {\n  box-shadow: 0px 27px 24px 0 rgba(0, 0, 0, 0.2); }\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/modules/js/whiteframe/whiteframe.js",
    "content": "/*!\n * Angular Material Design\n * https://github.com/angular/material\n * @license MIT\n * v0.7.0-rc3\n */\n(function() {\n'use strict';\n\n/**\n * @ngdoc module\n * @name material.components.whiteframe\n */\nangular.module('material.components.whiteframe', []);\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-material/package.json",
    "content": "{\n  \"name\": \"angular-material\",\n  \"version\": \"0.7.1\",\n  \"main\":\"\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/angular/material.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/angular/material/blob/master/LICENSE\"\n    }\n  ],\n  \"keywords\": [\n    \"angular\",\n    \"material\",\n    \"browser\",\n    \"client-side\"\n  ],\n  \"peerDependencies\": {\n      \"angular\": \"1.3.x\",\n      \"angular-animate\": \"1.3.x\",\n      \"angular-aria\": \"1.3.x\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/material/issues\"\n  },\n  \"homepage\": \"https://material.angularjs.org\",\n  \"main\": \"angular-material.js\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/.bower.json",
    "content": "{\n  \"name\": \"angular-mocks\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-mocks.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  },\n  \"homepage\": \"https://github.com/angular/bower-angular-mocks\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"1ffdfef850b10d40f2838c1bba41a95755c2d8da\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular-mocks.git\",\n  \"_target\": \"1.3.x\",\n  \"_originalSource\": \"angular-mocks\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/README.md",
    "content": "# packaged angular-mocks\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngMock).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-mocks\n```\n\nYou can `require` ngMock modules:\n\n```js\nvar angular = require('angular');\nangular.module('myMod', [\n  require('angular-animate'),\n  require('angular-mocks/ngMock')\n  require('angular-mocks/ngAnimateMock')\n]);\n```\n\n### bower\n\n```shell\nbower install angular-mocks\n```\n\nThe mocks are then available at `bower_components/angular-mocks/angular-mocks.js`.\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](https://docs.angularjs.org/guide/unit-testing).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/angular-mocks.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {\n\n'use strict';\n\n/**\n * @ngdoc object\n * @name angular.mock\n * @description\n *\n * Namespace from 'angular-mocks.js' which contains testing related code.\n */\nangular.mock = {};\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n *\n * @description\n * This service is a mock implementation of {@link ng.$browser}. It provides fake\n * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr,\n * cookies, etc...\n *\n * The api of this service is the same as that of the real {@link ng.$browser $browser}, except\n * that there are several helper methods available which can be used in tests.\n */\nangular.mock.$BrowserProvider = function() {\n  this.$get = function() {\n    return new angular.mock.$Browser();\n  };\n};\n\nangular.mock.$Browser = function() {\n  var self = this;\n\n  this.isMock = true;\n  self.$$url = \"http://server/\";\n  self.$$lastUrl = self.$$url; // used by url polling fn\n  self.pollFns = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = angular.noop;\n  self.$$incOutstandingRequestCount = angular.noop;\n\n\n  // register url polling fn\n\n  self.onUrlChange = function(listener) {\n    self.pollFns.push(\n      function() {\n        if (self.$$lastUrl !== self.$$url || self.$$state !== self.$$lastState) {\n          self.$$lastUrl = self.$$url;\n          self.$$lastState = self.$$state;\n          listener(self.$$url, self.$$state);\n        }\n      }\n    );\n\n    return listener;\n  };\n\n  self.$$checkUrlChange = angular.noop;\n\n  self.cookieHash = {};\n  self.lastCookieHash = {};\n  self.deferredFns = [];\n  self.deferredNextId = 0;\n\n  self.defer = function(fn, delay) {\n    delay = delay || 0;\n    self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId});\n    self.deferredFns.sort(function(a, b) { return a.time - b.time;});\n    return self.deferredNextId++;\n  };\n\n\n  /**\n   * @name $browser#defer.now\n   *\n   * @description\n   * Current milliseconds mock time.\n   */\n  self.defer.now = 0;\n\n\n  self.defer.cancel = function(deferId) {\n    var fnIndex;\n\n    angular.forEach(self.deferredFns, function(fn, index) {\n      if (fn.id === deferId) fnIndex = index;\n    });\n\n    if (fnIndex !== undefined) {\n      self.deferredFns.splice(fnIndex, 1);\n      return true;\n    }\n\n    return false;\n  };\n\n\n  /**\n   * @name $browser#defer.flush\n   *\n   * @description\n   * Flushes all pending requests and executes the defer callbacks.\n   *\n   * @param {number=} number of milliseconds to flush. See {@link #defer.now}\n   */\n  self.defer.flush = function(delay) {\n    if (angular.isDefined(delay)) {\n      self.defer.now += delay;\n    } else {\n      if (self.deferredFns.length) {\n        self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;\n      } else {\n        throw new Error('No deferred tasks to be flushed');\n      }\n    }\n\n    while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) {\n      self.deferredFns.shift().fn();\n    }\n  };\n\n  self.$$baseHref = '/';\n  self.baseHref = function() {\n    return this.$$baseHref;\n  };\n};\nangular.mock.$Browser.prototype = {\n\n/**\n  * @name $browser#poll\n  *\n  * @description\n  * run all fns in pollFns\n  */\n  poll: function poll() {\n    angular.forEach(this.pollFns, function(pollFn) {\n      pollFn();\n    });\n  },\n\n  addPollFn: function(pollFn) {\n    this.pollFns.push(pollFn);\n    return pollFn;\n  },\n\n  url: function(url, replace, state) {\n    if (angular.isUndefined(state)) {\n      state = null;\n    }\n    if (url) {\n      this.$$url = url;\n      // Native pushState serializes & copies the object; simulate it.\n      this.$$state = angular.copy(state);\n      return this;\n    }\n\n    return this.$$url;\n  },\n\n  state: function() {\n    return this.$$state;\n  },\n\n  cookies:  function(name, value) {\n    if (name) {\n      if (angular.isUndefined(value)) {\n        delete this.cookieHash[name];\n      } else {\n        if (angular.isString(value) &&       //strings only\n            value.length <= 4096) {          //strict cookie storage limits\n          this.cookieHash[name] = value;\n        }\n      }\n    } else {\n      if (!angular.equals(this.cookieHash, this.lastCookieHash)) {\n        this.lastCookieHash = angular.copy(this.cookieHash);\n        this.cookieHash = angular.copy(this.cookieHash);\n      }\n      return this.cookieHash;\n    }\n  },\n\n  notifyWhenNoOutstandingRequests: function(fn) {\n    fn();\n  }\n};\n\n\n/**\n * @ngdoc provider\n * @name $exceptionHandlerProvider\n *\n * @description\n * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors\n * passed to the `$exceptionHandler`.\n */\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n *\n * @description\n * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed\n * to it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration\n * information.\n *\n *\n * ```js\n *   describe('$exceptionHandlerProvider', function() {\n *\n *     it('should capture log messages and exceptions', function() {\n *\n *       module(function($exceptionHandlerProvider) {\n *         $exceptionHandlerProvider.mode('log');\n *       });\n *\n *       inject(function($log, $exceptionHandler, $timeout) {\n *         $timeout(function() { $log.log(1); });\n *         $timeout(function() { $log.log(2); throw 'banana peel'; });\n *         $timeout(function() { $log.log(3); });\n *         expect($exceptionHandler.errors).toEqual([]);\n *         expect($log.assertEmpty());\n *         $timeout.flush();\n *         expect($exceptionHandler.errors).toEqual(['banana peel']);\n *         expect($log.log.logs).toEqual([[1], [2], [3]]);\n *       });\n *     });\n *   });\n * ```\n */\n\nangular.mock.$ExceptionHandlerProvider = function() {\n  var handler;\n\n  /**\n   * @ngdoc method\n   * @name $exceptionHandlerProvider#mode\n   *\n   * @description\n   * Sets the logging mode.\n   *\n   * @param {string} mode Mode of operation, defaults to `rethrow`.\n   *\n   *   - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log`\n   *            mode stores an array of errors in `$exceptionHandler.errors`, to allow later\n   *            assertion of them. See {@link ngMock.$log#assertEmpty assertEmpty()} and\n   *            {@link ngMock.$log#reset reset()}\n   *   - `rethrow`: If any errors are passed to the handler in tests, it typically means that there\n   *                is a bug in the application or test, so this mock will make these tests fail.\n   *                For any implementations that expect exceptions to be thrown, the `rethrow` mode\n   *                will also maintain a log of thrown errors.\n   */\n  this.mode = function(mode) {\n\n    switch (mode) {\n      case 'log':\n      case 'rethrow':\n        var errors = [];\n        handler = function(e) {\n          if (arguments.length == 1) {\n            errors.push(e);\n          } else {\n            errors.push([].slice.call(arguments, 0));\n          }\n          if (mode === \"rethrow\") {\n            throw e;\n          }\n        };\n        handler.errors = errors;\n        break;\n      default:\n        throw new Error(\"Unknown mode '\" + mode + \"', only 'log'/'rethrow' modes are allowed!\");\n    }\n  };\n\n  this.$get = function() {\n    return handler;\n  };\n\n  this.mode('rethrow');\n};\n\n\n/**\n * @ngdoc service\n * @name $log\n *\n * @description\n * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays\n * (one array per logging level). These arrays are exposed as `logs` property of each of the\n * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.\n *\n */\nangular.mock.$LogProvider = function() {\n  var debug = true;\n\n  function concat(array1, array2, index) {\n    return array1.concat(Array.prototype.slice.call(array2, index));\n  }\n\n  this.debugEnabled = function(flag) {\n    if (angular.isDefined(flag)) {\n      debug = flag;\n      return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = function() {\n    var $log = {\n      log: function() { $log.log.logs.push(concat([], arguments, 0)); },\n      warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },\n      info: function() { $log.info.logs.push(concat([], arguments, 0)); },\n      error: function() { $log.error.logs.push(concat([], arguments, 0)); },\n      debug: function() {\n        if (debug) {\n          $log.debug.logs.push(concat([], arguments, 0));\n        }\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $log#reset\n     *\n     * @description\n     * Reset all of the logging arrays to empty.\n     */\n    $log.reset = function() {\n      /**\n       * @ngdoc property\n       * @name $log#log.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#log `log()`}.\n       *\n       * @example\n       * ```js\n       * $log.log('Some Log');\n       * var first = $log.log.logs.unshift();\n       * ```\n       */\n      $log.log.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#info.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#info `info()`}.\n       *\n       * @example\n       * ```js\n       * $log.info('Some Info');\n       * var first = $log.info.logs.unshift();\n       * ```\n       */\n      $log.info.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#warn.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#warn `warn()`}.\n       *\n       * @example\n       * ```js\n       * $log.warn('Some Warning');\n       * var first = $log.warn.logs.unshift();\n       * ```\n       */\n      $log.warn.logs = [];\n      /**\n       * @ngdoc property\n       * @name $log#error.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#error `error()`}.\n       *\n       * @example\n       * ```js\n       * $log.error('Some Error');\n       * var first = $log.error.logs.unshift();\n       * ```\n       */\n      $log.error.logs = [];\n        /**\n       * @ngdoc property\n       * @name $log#debug.logs\n       *\n       * @description\n       * Array of messages logged using {@link ng.$log#debug `debug()`}.\n       *\n       * @example\n       * ```js\n       * $log.debug('Some Error');\n       * var first = $log.debug.logs.unshift();\n       * ```\n       */\n      $log.debug.logs = [];\n    };\n\n    /**\n     * @ngdoc method\n     * @name $log#assertEmpty\n     *\n     * @description\n     * Assert that all of the logging methods have no logged messages. If any messages are present,\n     * an exception is thrown.\n     */\n    $log.assertEmpty = function() {\n      var errors = [];\n      angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) {\n        angular.forEach($log[logLevel].logs, function(log) {\n          angular.forEach(log, function(logItem) {\n            errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\\n' +\n                        (logItem.stack || ''));\n          });\n        });\n      });\n      if (errors.length) {\n        errors.unshift(\"Expected $log to be empty! Either a message was logged unexpectedly, or \" +\n          \"an expected log message was not checked and removed:\");\n        errors.push('');\n        throw new Error(errors.join('\\n---------\\n'));\n      }\n    };\n\n    $log.reset();\n    return $log;\n  };\n};\n\n\n/**\n * @ngdoc service\n * @name $interval\n *\n * @description\n * Mock implementation of the $interval service.\n *\n * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n * time.\n *\n * @param {function()} fn A function that should be called repeatedly.\n * @param {number} delay Number of milliseconds between each function call.\n * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n *   indefinitely.\n * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n * @returns {promise} A promise which will be notified on each iteration.\n */\nangular.mock.$IntervalProvider = function() {\n  this.$get = ['$browser', '$rootScope', '$q', '$$q',\n       function($browser,   $rootScope,   $q,   $$q) {\n    var repeatFns = [],\n        nextRepeatId = 0,\n        now = 0;\n\n    var $interval = function(fn, delay, count, invokeApply) {\n      var iteration = 0,\n          skipApply = (angular.isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise;\n\n      count = (angular.isDefined(count)) ? count : 0;\n      promise.then(null, null, fn);\n\n      promise.$$intervalId = nextRepeatId;\n\n      function tick() {\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          var fnIndex;\n          deferred.resolve(iteration);\n\n          angular.forEach(repeatFns, function(fn, index) {\n            if (fn.id === promise.$$intervalId) fnIndex = index;\n          });\n\n          if (fnIndex !== undefined) {\n            repeatFns.splice(fnIndex, 1);\n          }\n        }\n\n        if (skipApply) {\n          $browser.defer.flush();\n        } else {\n          $rootScope.$apply();\n        }\n      }\n\n      repeatFns.push({\n        nextTime:(now + delay),\n        delay: delay,\n        fn: tick,\n        id: nextRepeatId,\n        deferred: deferred\n      });\n      repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});\n\n      nextRepeatId++;\n      return promise;\n    };\n    /**\n     * @ngdoc method\n     * @name $interval#cancel\n     *\n     * @description\n     * Cancels a task associated with the `promise`.\n     *\n     * @param {promise} promise A promise from calling the `$interval` function.\n     * @returns {boolean} Returns `true` if the task was successfully cancelled.\n     */\n    $interval.cancel = function(promise) {\n      if (!promise) return false;\n      var fnIndex;\n\n      angular.forEach(repeatFns, function(fn, index) {\n        if (fn.id === promise.$$intervalId) fnIndex = index;\n      });\n\n      if (fnIndex !== undefined) {\n        repeatFns[fnIndex].deferred.reject('canceled');\n        repeatFns.splice(fnIndex, 1);\n        return true;\n      }\n\n      return false;\n    };\n\n    /**\n     * @ngdoc method\n     * @name $interval#flush\n     * @description\n     *\n     * Runs interval tasks scheduled to be run in the next `millis` milliseconds.\n     *\n     * @param {number=} millis maximum timeout amount to flush up until.\n     *\n     * @return {number} The amount of time moved forward.\n     */\n    $interval.flush = function(millis) {\n      now += millis;\n      while (repeatFns.length && repeatFns[0].nextTime <= now) {\n        var task = repeatFns[0];\n        task.fn();\n        task.nextTime += task.delay;\n        repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});\n      }\n      return millis;\n    };\n\n    return $interval;\n  }];\n};\n\n\n/* jshint -W101 */\n/* The R_ISO8061_STR regex is never going to fit into the 100 char limit!\n * This directive should go inside the anonymous function but a bug in JSHint means that it would\n * not be enacted early enough to prevent the warning.\n */\nvar R_ISO8061_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?:\\:?(\\d\\d)(?:\\:?(\\d\\d)(?:\\.(\\d{3}))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d)))?$/;\n\nfunction jsonStringToDate(string) {\n  var match;\n  if (match = string.match(R_ISO8061_STR)) {\n    var date = new Date(0),\n        tzHour = 0,\n        tzMin  = 0;\n    if (match[9]) {\n      tzHour = int(match[9] + match[10]);\n      tzMin = int(match[9] + match[11]);\n    }\n    date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));\n    date.setUTCHours(int(match[4] || 0) - tzHour,\n                     int(match[5] || 0) - tzMin,\n                     int(match[6] || 0),\n                     int(match[7] || 0));\n    return date;\n  }\n  return string;\n}\n\nfunction int(str) {\n  return parseInt(str, 10);\n}\n\nfunction padNumber(num, digits, trim) {\n  var neg = '';\n  if (num < 0) {\n    neg =  '-';\n    num = -num;\n  }\n  num = '' + num;\n  while (num.length < digits) num = '0' + num;\n  if (trim)\n    num = num.substr(num.length - digits);\n  return neg + num;\n}\n\n\n/**\n * @ngdoc type\n * @name angular.mock.TzDate\n * @description\n *\n * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.\n *\n * Mock of the Date type which has its timezone specified via constructor arg.\n *\n * The main purpose is to create Date-like instances with timezone fixed to the specified timezone\n * offset, so that we can test code that depends on local timezone settings without dependency on\n * the time zone settings of the machine where the code is running.\n *\n * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)\n * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*\n *\n * @example\n * !!!! WARNING !!!!!\n * This is not a complete Date object so only methods that were implemented can be called safely.\n * To make matters worse, TzDate instances inherit stuff from Date via a prototype.\n *\n * We do our best to intercept calls to \"unimplemented\" methods, but since the list of methods is\n * incomplete we might be missing some non-standard methods. This can result in errors like:\n * \"Date.prototype.foo called on incompatible Object\".\n *\n * ```js\n * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');\n * newYearInBratislava.getTimezoneOffset() => -60;\n * newYearInBratislava.getFullYear() => 2010;\n * newYearInBratislava.getMonth() => 0;\n * newYearInBratislava.getDate() => 1;\n * newYearInBratislava.getHours() => 0;\n * newYearInBratislava.getMinutes() => 0;\n * newYearInBratislava.getSeconds() => 0;\n * ```\n *\n */\nangular.mock.TzDate = function(offset, timestamp) {\n  var self = new Date(0);\n  if (angular.isString(timestamp)) {\n    var tsStr = timestamp;\n\n    self.origDate = jsonStringToDate(timestamp);\n\n    timestamp = self.origDate.getTime();\n    if (isNaN(timestamp))\n      throw {\n        name: \"Illegal Argument\",\n        message: \"Arg '\" + tsStr + \"' passed into TzDate constructor is not a valid date string\"\n      };\n  } else {\n    self.origDate = new Date(timestamp);\n  }\n\n  var localOffset = new Date(timestamp).getTimezoneOffset();\n  self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;\n  self.date = new Date(timestamp + self.offsetDiff);\n\n  self.getTime = function() {\n    return self.date.getTime() - self.offsetDiff;\n  };\n\n  self.toLocaleDateString = function() {\n    return self.date.toLocaleDateString();\n  };\n\n  self.getFullYear = function() {\n    return self.date.getFullYear();\n  };\n\n  self.getMonth = function() {\n    return self.date.getMonth();\n  };\n\n  self.getDate = function() {\n    return self.date.getDate();\n  };\n\n  self.getHours = function() {\n    return self.date.getHours();\n  };\n\n  self.getMinutes = function() {\n    return self.date.getMinutes();\n  };\n\n  self.getSeconds = function() {\n    return self.date.getSeconds();\n  };\n\n  self.getMilliseconds = function() {\n    return self.date.getMilliseconds();\n  };\n\n  self.getTimezoneOffset = function() {\n    return offset * 60;\n  };\n\n  self.getUTCFullYear = function() {\n    return self.origDate.getUTCFullYear();\n  };\n\n  self.getUTCMonth = function() {\n    return self.origDate.getUTCMonth();\n  };\n\n  self.getUTCDate = function() {\n    return self.origDate.getUTCDate();\n  };\n\n  self.getUTCHours = function() {\n    return self.origDate.getUTCHours();\n  };\n\n  self.getUTCMinutes = function() {\n    return self.origDate.getUTCMinutes();\n  };\n\n  self.getUTCSeconds = function() {\n    return self.origDate.getUTCSeconds();\n  };\n\n  self.getUTCMilliseconds = function() {\n    return self.origDate.getUTCMilliseconds();\n  };\n\n  self.getDay = function() {\n    return self.date.getDay();\n  };\n\n  // provide this method only on browsers that already have it\n  if (self.toISOString) {\n    self.toISOString = function() {\n      return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +\n            padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +\n            padNumber(self.origDate.getUTCDate(), 2) + 'T' +\n            padNumber(self.origDate.getUTCHours(), 2) + ':' +\n            padNumber(self.origDate.getUTCMinutes(), 2) + ':' +\n            padNumber(self.origDate.getUTCSeconds(), 2) + '.' +\n            padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z';\n    };\n  }\n\n  //hide all methods not implemented in this mock that the Date prototype exposes\n  var unimplementedMethods = ['getUTCDay',\n      'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',\n      'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',\n      'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',\n      'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',\n      'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];\n\n  angular.forEach(unimplementedMethods, function(methodName) {\n    self[methodName] = function() {\n      throw new Error(\"Method '\" + methodName + \"' is not implemented in the TzDate mock\");\n    };\n  });\n\n  return self;\n};\n\n//make \"tzDateInstance instanceof Date\" return true\nangular.mock.TzDate.prototype = Date.prototype;\n/* jshint +W101 */\n\nangular.mock.animate = angular.module('ngAnimateMock', ['ng'])\n\n  .config(['$provide', function($provide) {\n\n    var reflowQueue = [];\n    $provide.value('$$animateReflow', function(fn) {\n      var index = reflowQueue.length;\n      reflowQueue.push(fn);\n      return function cancel() {\n        reflowQueue.splice(index, 1);\n      };\n    });\n\n    $provide.decorator('$animate', ['$delegate', '$$asyncCallback', '$timeout', '$browser',\n                            function($delegate,   $$asyncCallback,   $timeout,   $browser) {\n      var animate = {\n        queue: [],\n        cancel: $delegate.cancel,\n        enabled: $delegate.enabled,\n        triggerCallbackEvents: function() {\n          $$asyncCallback.flush();\n        },\n        triggerCallbackPromise: function() {\n          $timeout.flush(0);\n        },\n        triggerCallbacks: function() {\n          this.triggerCallbackEvents();\n          this.triggerCallbackPromise();\n        },\n        triggerReflow: function() {\n          angular.forEach(reflowQueue, function(fn) {\n            fn();\n          });\n          reflowQueue = [];\n        }\n      };\n\n      angular.forEach(\n        ['animate','enter','leave','move','addClass','removeClass','setClass'], function(method) {\n        animate[method] = function() {\n          animate.queue.push({\n            event: method,\n            element: arguments[0],\n            options: arguments[arguments.length - 1],\n            args: arguments\n          });\n          return $delegate[method].apply($delegate, arguments);\n        };\n      });\n\n      return animate;\n    }]);\n\n  }]);\n\n\n/**\n * @ngdoc function\n * @name angular.mock.dump\n * @description\n *\n * *NOTE*: this is not an injectable instance, just a globally available function.\n *\n * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for\n * debugging.\n *\n * This method is also available on window, where it can be used to display objects on debug\n * console.\n *\n * @param {*} object - any object to turn into string.\n * @return {string} a serialized string of the argument\n */\nangular.mock.dump = function(object) {\n  return serialize(object);\n\n  function serialize(object) {\n    var out;\n\n    if (angular.isElement(object)) {\n      object = angular.element(object);\n      out = angular.element('<div></div>');\n      angular.forEach(object, function(element) {\n        out.append(angular.element(element).clone());\n      });\n      out = out.html();\n    } else if (angular.isArray(object)) {\n      out = [];\n      angular.forEach(object, function(o) {\n        out.push(serialize(o));\n      });\n      out = '[ ' + out.join(', ') + ' ]';\n    } else if (angular.isObject(object)) {\n      if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {\n        out = serializeScope(object);\n      } else if (object instanceof Error) {\n        out = object.stack || ('' + object.name + ': ' + object.message);\n      } else {\n        // TODO(i): this prevents methods being logged,\n        // we should have a better way to serialize objects\n        out = angular.toJson(object, true);\n      }\n    } else {\n      out = String(object);\n    }\n\n    return out;\n  }\n\n  function serializeScope(scope, offset) {\n    offset = offset ||  '  ';\n    var log = [offset + 'Scope(' + scope.$id + '): {'];\n    for (var key in scope) {\n      if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\\$|this)/)) {\n        log.push('  ' + key + ': ' + angular.toJson(scope[key]));\n      }\n    }\n    var child = scope.$$childHead;\n    while (child) {\n      log.push(serializeScope(child, offset + '  '));\n      child = child.$$nextSibling;\n    }\n    log.push('}');\n    return log.join('\\n' + offset);\n  }\n};\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @description\n * Fake HTTP backend implementation suitable for unit testing applications that use the\n * {@link ng.$http $http service}.\n *\n * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less\n * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.\n *\n * During unit testing, we want our unit tests to run quickly and have no external dependencies so\n * we don’t want to send [XHR](https://developer.mozilla.org/en/xmlhttprequest) or\n * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All we really need is\n * to verify whether a certain request has been sent or not, or alternatively just let the\n * application make requests, respond with pre-trained responses and assert that the end result is\n * what we expect it to be.\n *\n * This mock implementation can be used to respond with static or dynamic responses via the\n * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).\n *\n * When an Angular application needs some data from a server, it calls the $http service, which\n * sends the request to a real server using $httpBackend service. With dependency injection, it is\n * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify\n * the requests and respond with some testing data without sending a request to a real server.\n *\n * There are two ways to specify what test data should be returned as http responses by the mock\n * backend when the code under test makes http requests:\n *\n * - `$httpBackend.expect` - specifies a request expectation\n * - `$httpBackend.when` - specifies a backend definition\n *\n *\n * # Request Expectations vs Backend Definitions\n *\n * Request expectations provide a way to make assertions about requests made by the application and\n * to define responses for those requests. The test will fail if the expected requests are not made\n * or they are made in the wrong order.\n *\n * Backend definitions allow you to define a fake backend for your application which doesn't assert\n * if a particular request was made or not, it just returns a trained response if a request is made.\n * The test will pass whether or not the request gets made during testing.\n *\n *\n * <table class=\"table\">\n *   <tr><th width=\"220px\"></th><th>Request expectations</th><th>Backend definitions</th></tr>\n *   <tr>\n *     <th>Syntax</th>\n *     <td>.expect(...).respond(...)</td>\n *     <td>.when(...).respond(...)</td>\n *   </tr>\n *   <tr>\n *     <th>Typical usage</th>\n *     <td>strict unit tests</td>\n *     <td>loose (black-box) unit testing</td>\n *   </tr>\n *   <tr>\n *     <th>Fulfills multiple requests</th>\n *     <td>NO</td>\n *     <td>YES</td>\n *   </tr>\n *   <tr>\n *     <th>Order of requests matters</th>\n *     <td>YES</td>\n *     <td>NO</td>\n *   </tr>\n *   <tr>\n *     <th>Request required</th>\n *     <td>YES</td>\n *     <td>NO</td>\n *   </tr>\n *   <tr>\n *     <th>Response required</th>\n *     <td>optional (see below)</td>\n *     <td>YES</td>\n *   </tr>\n * </table>\n *\n * In cases where both backend definitions and request expectations are specified during unit\n * testing, the request expectations are evaluated first.\n *\n * If a request expectation has no response specified, the algorithm will search your backend\n * definitions for an appropriate response.\n *\n * If a request didn't match any expectation or if the expectation doesn't have the response\n * defined, the backend definitions are evaluated in sequential order to see if any of them match\n * the request. The response from the first matched definition is returned.\n *\n *\n * # Flushing HTTP requests\n *\n * The $httpBackend used in production always responds to requests asynchronously. If we preserved\n * this behavior in unit testing, we'd have to create async unit tests, which are hard to write,\n * to follow and to maintain. But neither can the testing mock respond synchronously; that would\n * change the execution of the code under test. For this reason, the mock $httpBackend has a\n * `flush()` method, which allows the test to explicitly flush pending requests. This preserves\n * the async api of the backend, while allowing the test to execute synchronously.\n *\n *\n * # Unit testing with mock $httpBackend\n * The following code shows how to setup and use the mock backend when unit testing a controller.\n * First we create the controller under test:\n *\n  ```js\n  // The module code\n  angular\n    .module('MyApp', [])\n    .controller('MyController', MyController);\n\n  // The controller code\n  function MyController($scope, $http) {\n    var authToken;\n\n    $http.get('/auth.py').success(function(data, status, headers) {\n      authToken = headers('A-Token');\n      $scope.user = data;\n    });\n\n    $scope.saveMessage = function(message) {\n      var headers = { 'Authorization': authToken };\n      $scope.status = 'Saving...';\n\n      $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) {\n        $scope.status = '';\n      }).error(function() {\n        $scope.status = 'ERROR!';\n      });\n    };\n  }\n  ```\n *\n * Now we setup the mock backend and create the test specs:\n *\n  ```js\n    // testing controller\n    describe('MyController', function() {\n       var $httpBackend, $rootScope, createController, authRequestHandler;\n\n       // Set up the module\n       beforeEach(module('MyApp'));\n\n       beforeEach(inject(function($injector) {\n         // Set up the mock http service responses\n         $httpBackend = $injector.get('$httpBackend');\n         // backend definition common for all tests\n         authRequestHandler = $httpBackend.when('GET', '/auth.py')\n                                .respond({userId: 'userX'}, {'A-Token': 'xxx'});\n\n         // Get hold of a scope (i.e. the root scope)\n         $rootScope = $injector.get('$rootScope');\n         // The $controller service is used to create instances of controllers\n         var $controller = $injector.get('$controller');\n\n         createController = function() {\n           return $controller('MyController', {'$scope' : $rootScope });\n         };\n       }));\n\n\n       afterEach(function() {\n         $httpBackend.verifyNoOutstandingExpectation();\n         $httpBackend.verifyNoOutstandingRequest();\n       });\n\n\n       it('should fetch authentication token', function() {\n         $httpBackend.expectGET('/auth.py');\n         var controller = createController();\n         $httpBackend.flush();\n       });\n\n\n       it('should fail authentication', function() {\n\n         // Notice how you can change the response even after it was set\n         authRequestHandler.respond(401, '');\n\n         $httpBackend.expectGET('/auth.py');\n         var controller = createController();\n         $httpBackend.flush();\n         expect($rootScope.status).toBe('Failed...');\n       });\n\n\n       it('should send msg to server', function() {\n         var controller = createController();\n         $httpBackend.flush();\n\n         // now you don’t care about the authentication, but\n         // the controller will still send the request and\n         // $httpBackend will respond without you having to\n         // specify the expectation and response for this request\n\n         $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');\n         $rootScope.saveMessage('message content');\n         expect($rootScope.status).toBe('Saving...');\n         $httpBackend.flush();\n         expect($rootScope.status).toBe('');\n       });\n\n\n       it('should send auth header', function() {\n         var controller = createController();\n         $httpBackend.flush();\n\n         $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {\n           // check if the header was send, if it wasn't the expectation won't\n           // match the request and the test will fail\n           return headers['Authorization'] == 'xxx';\n         }).respond(201, '');\n\n         $rootScope.saveMessage('whatever');\n         $httpBackend.flush();\n       });\n    });\n   ```\n */\nangular.mock.$HttpBackendProvider = function() {\n  this.$get = ['$rootScope', '$timeout', createHttpBackendMock];\n};\n\n/**\n * General factory function for $httpBackend mock.\n * Returns instance for unit testing (when no arguments specified):\n *   - passing through is disabled\n *   - auto flushing is disabled\n *\n * Returns instance for e2e testing (when `$delegate` and `$browser` specified):\n *   - passing through (delegating request to real backend) is enabled\n *   - auto flushing is enabled\n *\n * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)\n * @param {Object=} $browser Auto-flushing enabled if specified\n * @return {Object} Instance of $httpBackend mock\n */\nfunction createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {\n  var definitions = [],\n      expectations = [],\n      responses = [],\n      responsesPush = angular.bind(responses, responses.push),\n      copy = angular.copy;\n\n  function createResponse(status, data, headers, statusText) {\n    if (angular.isFunction(status)) return status;\n\n    return function() {\n      return angular.isNumber(status)\n          ? [status, data, headers, statusText]\n          : [200, status, data, headers];\n    };\n  }\n\n  // TODO(vojta): change params to: method, url, data, headers, callback\n  function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) {\n    var xhr = new MockXhr(),\n        expectation = expectations[0],\n        wasExpected = false;\n\n    function prettyPrint(data) {\n      return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)\n          ? data\n          : angular.toJson(data);\n    }\n\n    function wrapResponse(wrapped) {\n      if (!$browser && timeout) {\n        timeout.then ? timeout.then(handleTimeout) : $timeout(handleTimeout, timeout);\n      }\n\n      return handleResponse;\n\n      function handleResponse() {\n        var response = wrapped.response(method, url, data, headers);\n        xhr.$$respHeaders = response[2];\n        callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),\n                 copy(response[3] || ''));\n      }\n\n      function handleTimeout() {\n        for (var i = 0, ii = responses.length; i < ii; i++) {\n          if (responses[i] === handleResponse) {\n            responses.splice(i, 1);\n            callback(-1, undefined, '');\n            break;\n          }\n        }\n      }\n    }\n\n    if (expectation && expectation.match(method, url)) {\n      if (!expectation.matchData(data))\n        throw new Error('Expected ' + expectation + ' with different data\\n' +\n            'EXPECTED: ' + prettyPrint(expectation.data) + '\\nGOT:      ' + data);\n\n      if (!expectation.matchHeaders(headers))\n        throw new Error('Expected ' + expectation + ' with different headers\\n' +\n                        'EXPECTED: ' + prettyPrint(expectation.headers) + '\\nGOT:      ' +\n                        prettyPrint(headers));\n\n      expectations.shift();\n\n      if (expectation.response) {\n        responses.push(wrapResponse(expectation));\n        return;\n      }\n      wasExpected = true;\n    }\n\n    var i = -1, definition;\n    while ((definition = definitions[++i])) {\n      if (definition.match(method, url, data, headers || {})) {\n        if (definition.response) {\n          // if $browser specified, we do auto flush all requests\n          ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));\n        } else if (definition.passThrough) {\n          $delegate(method, url, data, callback, headers, timeout, withCredentials);\n        } else throw new Error('No response defined !');\n        return;\n      }\n    }\n    throw wasExpected ?\n        new Error('No response defined !') :\n        new Error('Unexpected request: ' + method + ' ' + url + '\\n' +\n                  (expectation ? 'Expected ' + expectation : 'No more request expected'));\n  }\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#when\n   * @description\n   * Creates a new backend definition.\n   *\n   * @param {string} method HTTP method.\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current definition.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   *\n   *  - respond –\n   *      `{function([status,] data[, headers, statusText])\n   *      | function(function(method, url, data, headers)}`\n   *    – The respond method takes a set of static data to be returned or a function that can\n   *    return an array containing response status (number), response data (string), response\n   *    headers (Object), and the text for the status (string). The respond method returns the\n   *    `requestHandler` object for possible overrides.\n   */\n  $httpBackend.when = function(method, url, data, headers) {\n    var definition = new MockHttpExpectation(method, url, data, headers),\n        chain = {\n          respond: function(status, data, headers, statusText) {\n            definition.passThrough = undefined;\n            definition.response = createResponse(status, data, headers, statusText);\n            return chain;\n          }\n        };\n\n    if ($browser) {\n      chain.passThrough = function() {\n        definition.response = undefined;\n        definition.passThrough = true;\n        return chain;\n      };\n    }\n\n    definitions.push(definition);\n    return chain;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenGET\n   * @description\n   * Creates a new backend definition for GET requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenHEAD\n   * @description\n   * Creates a new backend definition for HEAD requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenDELETE\n   * @description\n   * Creates a new backend definition for DELETE requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(Object|function(Object))=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenPOST\n   * @description\n   * Creates a new backend definition for POST requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenPUT\n   * @description\n   * Creates a new backend definition for PUT requests.  For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives\n   *   data string and returns true if the data is as expected.\n   * @param {(Object|function(Object))=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#whenJSONP\n   * @description\n   * Creates a new backend definition for JSONP requests. For more info see `when()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled.\n   */\n  createShortMethods('when');\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expect\n   * @description\n   * Creates a new request expectation.\n   *\n   * @param {string} method HTTP method.\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n   *   object and returns true if the headers match the current expectation.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *  request is handled. You can save this object for later use and invoke `respond` again in\n   *  order to change how a matched request is handled.\n   *\n   *  - respond –\n   *    `{function([status,] data[, headers, statusText])\n   *    | function(function(method, url, data, headers)}`\n   *    – The respond method takes a set of static data to be returned or a function that can\n   *    return an array containing response status (number), response data (string), response\n   *    headers (Object), and the text for the status (string). The respond method returns the\n   *    `requestHandler` object for possible overrides.\n   */\n  $httpBackend.expect = function(method, url, data, headers) {\n    var expectation = new MockHttpExpectation(method, url, data, headers),\n        chain = {\n          respond: function(status, data, headers, statusText) {\n            expectation.response = createResponse(status, data, headers, statusText);\n            return chain;\n          }\n        };\n\n    expectations.push(expectation);\n    return chain;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectGET\n   * @description\n   * Creates a new request expectation for GET requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   * request is handled. You can save this object for later use and invoke `respond` again in\n   * order to change how a matched request is handled. See #expect for more info.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectHEAD\n   * @description\n   * Creates a new request expectation for HEAD requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectDELETE\n   * @description\n   * Creates a new request expectation for DELETE requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPOST\n   * @description\n   * Creates a new request expectation for POST requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPUT\n   * @description\n   * Creates a new request expectation for PUT requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectPATCH\n   * @description\n   * Creates a new request expectation for PATCH requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that\n   *  receives data string and returns true if the data is as expected, or Object if request body\n   *  is in JSON format.\n   * @param {Object=} headers HTTP headers.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#expectJSONP\n   * @description\n   * Creates a new request expectation for JSONP requests. For more info see `expect()`.\n   *\n   * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n   *   and returns true if the url match the current definition.\n   * @returns {requestHandler} Returns an object with `respond` method that controls how a matched\n   *   request is handled. You can save this object for later use and invoke `respond` again in\n   *   order to change how a matched request is handled.\n   */\n  createShortMethods('expect');\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#flush\n   * @description\n   * Flushes all pending requests using the trained responses.\n   *\n   * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,\n   *   all pending requests will be flushed. If there are no pending requests when the flush method\n   *   is called an exception is thrown (as this typically a sign of programming error).\n   */\n  $httpBackend.flush = function(count, digest) {\n    if (digest !== false) $rootScope.$digest();\n    if (!responses.length) throw new Error('No pending request to flush !');\n\n    if (angular.isDefined(count) && count !== null) {\n      while (count--) {\n        if (!responses.length) throw new Error('No more pending request to flush !');\n        responses.shift()();\n      }\n    } else {\n      while (responses.length) {\n        responses.shift()();\n      }\n    }\n    $httpBackend.verifyNoOutstandingExpectation(digest);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#verifyNoOutstandingExpectation\n   * @description\n   * Verifies that all of the requests defined via the `expect` api were made. If any of the\n   * requests were not made, verifyNoOutstandingExpectation throws an exception.\n   *\n   * Typically, you would call this method following each test case that asserts requests using an\n   * \"afterEach\" clause.\n   *\n   * ```js\n   *   afterEach($httpBackend.verifyNoOutstandingExpectation);\n   * ```\n   */\n  $httpBackend.verifyNoOutstandingExpectation = function(digest) {\n    if (digest !== false) $rootScope.$digest();\n    if (expectations.length) {\n      throw new Error('Unsatisfied requests: ' + expectations.join(', '));\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#verifyNoOutstandingRequest\n   * @description\n   * Verifies that there are no outstanding requests that need to be flushed.\n   *\n   * Typically, you would call this method following each test case that asserts requests using an\n   * \"afterEach\" clause.\n   *\n   * ```js\n   *   afterEach($httpBackend.verifyNoOutstandingRequest);\n   * ```\n   */\n  $httpBackend.verifyNoOutstandingRequest = function() {\n    if (responses.length) {\n      throw new Error('Unflushed requests: ' + responses.length);\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $httpBackend#resetExpectations\n   * @description\n   * Resets all request expectations, but preserves all backend definitions. Typically, you would\n   * call resetExpectations during a multiple-phase test when you want to reuse the same instance of\n   * $httpBackend mock.\n   */\n  $httpBackend.resetExpectations = function() {\n    expectations.length = 0;\n    responses.length = 0;\n  };\n\n  return $httpBackend;\n\n\n  function createShortMethods(prefix) {\n    angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {\n     $httpBackend[prefix + method] = function(url, headers) {\n       return $httpBackend[prefix](method, url, undefined, headers);\n     };\n    });\n\n    angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {\n      $httpBackend[prefix + method] = function(url, data, headers) {\n        return $httpBackend[prefix](method, url, data, headers);\n      };\n    });\n  }\n}\n\nfunction MockHttpExpectation(method, url, data, headers) {\n\n  this.data = data;\n  this.headers = headers;\n\n  this.match = function(m, u, d, h) {\n    if (method != m) return false;\n    if (!this.matchUrl(u)) return false;\n    if (angular.isDefined(d) && !this.matchData(d)) return false;\n    if (angular.isDefined(h) && !this.matchHeaders(h)) return false;\n    return true;\n  };\n\n  this.matchUrl = function(u) {\n    if (!url) return true;\n    if (angular.isFunction(url.test)) return url.test(u);\n    if (angular.isFunction(url)) return url(u);\n    return url == u;\n  };\n\n  this.matchHeaders = function(h) {\n    if (angular.isUndefined(headers)) return true;\n    if (angular.isFunction(headers)) return headers(h);\n    return angular.equals(headers, h);\n  };\n\n  this.matchData = function(d) {\n    if (angular.isUndefined(data)) return true;\n    if (data && angular.isFunction(data.test)) return data.test(d);\n    if (data && angular.isFunction(data)) return data(d);\n    if (data && !angular.isString(data)) {\n      return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d));\n    }\n    return data == d;\n  };\n\n  this.toString = function() {\n    return method + ' ' + url;\n  };\n}\n\nfunction createMockXhr() {\n  return new MockXhr();\n}\n\nfunction MockXhr() {\n\n  // hack for testing $http, $httpBackend\n  MockXhr.$$lastInstance = this;\n\n  this.open = function(method, url, async) {\n    this.$$method = method;\n    this.$$url = url;\n    this.$$async = async;\n    this.$$reqHeaders = {};\n    this.$$respHeaders = {};\n  };\n\n  this.send = function(data) {\n    this.$$data = data;\n  };\n\n  this.setRequestHeader = function(key, value) {\n    this.$$reqHeaders[key] = value;\n  };\n\n  this.getResponseHeader = function(name) {\n    // the lookup must be case insensitive,\n    // that's why we try two quick lookups first and full scan last\n    var header = this.$$respHeaders[name];\n    if (header) return header;\n\n    name = angular.lowercase(name);\n    header = this.$$respHeaders[name];\n    if (header) return header;\n\n    header = undefined;\n    angular.forEach(this.$$respHeaders, function(headerVal, headerName) {\n      if (!header && angular.lowercase(headerName) == name) header = headerVal;\n    });\n    return header;\n  };\n\n  this.getAllResponseHeaders = function() {\n    var lines = [];\n\n    angular.forEach(this.$$respHeaders, function(value, key) {\n      lines.push(key + ': ' + value);\n    });\n    return lines.join('\\n');\n  };\n\n  this.abort = angular.noop;\n}\n\n\n/**\n * @ngdoc service\n * @name $timeout\n * @description\n *\n * This service is just a simple decorator for {@link ng.$timeout $timeout} service\n * that adds a \"flush\" and \"verifyNoPendingTasks\" methods.\n */\n\nangular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $browser) {\n\n  /**\n   * @ngdoc method\n   * @name $timeout#flush\n   * @description\n   *\n   * Flushes the queue of pending tasks.\n   *\n   * @param {number=} delay maximum timeout amount to flush up until\n   */\n  $delegate.flush = function(delay) {\n    $browser.defer.flush(delay);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $timeout#verifyNoPendingTasks\n   * @description\n   *\n   * Verifies that there are no pending tasks that need to be flushed.\n   */\n  $delegate.verifyNoPendingTasks = function() {\n    if ($browser.deferredFns.length) {\n      throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +\n          formatPendingTasksAsString($browser.deferredFns));\n    }\n  };\n\n  function formatPendingTasksAsString(tasks) {\n    var result = [];\n    angular.forEach(tasks, function(task) {\n      result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');\n    });\n\n    return result.join(', ');\n  }\n\n  return $delegate;\n}];\n\nangular.mock.$RAFDecorator = ['$delegate', function($delegate) {\n  var queue = [];\n  var rafFn = function(fn) {\n    var index = queue.length;\n    queue.push(fn);\n    return function() {\n      queue.splice(index, 1);\n    };\n  };\n\n  rafFn.supported = $delegate.supported;\n\n  rafFn.flush = function() {\n    if (queue.length === 0) {\n      throw new Error('No rAF callbacks present');\n    }\n\n    var length = queue.length;\n    for (var i = 0; i < length; i++) {\n      queue[i]();\n    }\n\n    queue = [];\n  };\n\n  return rafFn;\n}];\n\nangular.mock.$AsyncCallbackDecorator = ['$delegate', function($delegate) {\n  var callbacks = [];\n  var addFn = function(fn) {\n    callbacks.push(fn);\n  };\n  addFn.flush = function() {\n    angular.forEach(callbacks, function(fn) {\n      fn();\n    });\n    callbacks = [];\n  };\n  return addFn;\n}];\n\n/**\n *\n */\nangular.mock.$RootElementProvider = function() {\n  this.$get = function() {\n    return angular.element('<div ng-app></div>');\n  };\n};\n\n/**\n * @ngdoc service\n * @name $controller\n * @description\n * A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing\n * controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}.\n *\n *\n * ## Example\n *\n * ```js\n *\n * // Directive definition ...\n *\n * myMod.directive('myDirective', {\n *   controller: 'MyDirectiveController',\n *   bindToController: {\n *     name: '@'\n *   }\n * });\n *\n *\n * // Controller definition ...\n *\n * myMod.controller('MyDirectiveController', ['log', function($log) {\n *   $log.info(this.name);\n * })];\n *\n *\n * // In a test ...\n *\n * describe('myDirectiveController', function() {\n *   it('should write the bound name to the log', inject(function($controller, $log) {\n *     var ctrl = $controller('MyDirective', { /* no locals &#42;/ }, { name: 'Clark Kent' });\n *     expect(ctrl.name).toEqual('Clark Kent');\n *     expect($log.info.logs).toEqual(['Clark Kent']);\n *   });\n * });\n *\n * ```\n *\n * @param {Function|string} constructor If called with a function then it's considered to be the\n *    controller constructor function. Otherwise it's considered to be a string which is used\n *    to retrieve the controller constructor using the following steps:\n *\n *    * check if a controller with given name is registered via `$controllerProvider`\n *    * check if evaluating the string on the current scope returns a constructor\n *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global\n *      `window` object (not recommended)\n *\n *    The string can use the `controller as property` syntax, where the controller instance is published\n *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n *    to work correctly.\n *\n * @param {Object} locals Injection locals for Controller.\n * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used\n *                           to simulate the `bindToController` feature and simplify certain kinds of tests.\n * @return {Object} Instance of given controller.\n */\nangular.mock.$ControllerDecorator = ['$delegate', function($delegate) {\n  return function(expression, locals, later, ident) {\n    if (later && typeof later === 'object') {\n      var create = $delegate(expression, locals, true, ident);\n      angular.extend(create.instance, later);\n      return create();\n    }\n    return $delegate(expression, locals, later, ident);\n  };\n}];\n\n\n/**\n * @ngdoc module\n * @name ngMock\n * @packageName angular-mocks\n * @description\n *\n * # ngMock\n *\n * The `ngMock` module provides support to inject and mock Angular services into unit tests.\n * In addition, ngMock also extends various core ng services such that they can be\n * inspected and controlled in a synchronous manner within test code.\n *\n *\n * <div doc-module-components=\"ngMock\"></div>\n *\n */\nangular.module('ngMock', ['ng']).provider({\n  $browser: angular.mock.$BrowserProvider,\n  $exceptionHandler: angular.mock.$ExceptionHandlerProvider,\n  $log: angular.mock.$LogProvider,\n  $interval: angular.mock.$IntervalProvider,\n  $httpBackend: angular.mock.$HttpBackendProvider,\n  $rootElement: angular.mock.$RootElementProvider\n}).config(['$provide', function($provide) {\n  $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);\n  $provide.decorator('$$rAF', angular.mock.$RAFDecorator);\n  $provide.decorator('$$asyncCallback', angular.mock.$AsyncCallbackDecorator);\n  $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);\n  $provide.decorator('$controller', angular.mock.$ControllerDecorator);\n}]);\n\n/**\n * @ngdoc module\n * @name ngMockE2E\n * @module ngMockE2E\n * @packageName angular-mocks\n * @description\n *\n * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.\n * Currently there is only one mock present in this module -\n * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.\n */\nangular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {\n  $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);\n}]);\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @module ngMockE2E\n * @description\n * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of\n * applications that use the {@link ng.$http $http service}.\n *\n * *Note*: For fake http backend implementation suitable for unit testing please see\n * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.\n *\n * This implementation can be used to respond with static or dynamic responses via the `when` api\n * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the\n * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch\n * templates from a webserver).\n *\n * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application\n * is being developed with the real backend api replaced with a mock, it is often desirable for\n * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch\n * templates or static files from the webserver). To configure the backend with this behavior\n * use the `passThrough` request handler of `when` instead of `respond`.\n *\n * Additionally, we don't want to manually have to flush mocked out requests like we do during unit\n * testing. For this reason the e2e $httpBackend flushes mocked out requests\n * automatically, closely simulating the behavior of the XMLHttpRequest object.\n *\n * To setup the application to run with this http backend, you have to create a module that depends\n * on the `ngMockE2E` and your application modules and defines the fake backend:\n *\n * ```js\n *   myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);\n *   myAppDev.run(function($httpBackend) {\n *     phones = [{name: 'phone1'}, {name: 'phone2'}];\n *\n *     // returns the current list of phones\n *     $httpBackend.whenGET('/phones').respond(phones);\n *\n *     // adds a new phone to the phones array\n *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {\n *       var phone = angular.fromJson(data);\n *       phones.push(phone);\n *       return [200, phone, {}];\n *     });\n *     $httpBackend.whenGET(/^\\/templates\\//).passThrough();\n *     //...\n *   });\n * ```\n *\n * Afterwards, bootstrap your app with this new module.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#when\n * @module ngMockE2E\n * @description\n * Creates a new backend definition.\n *\n * @param {string} method HTTP method.\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(string|RegExp)=} data HTTP request body.\n * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header\n *   object and returns true if the headers match the current definition.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n *\n *  - respond –\n *    `{function([status,] data[, headers, statusText])\n *    | function(function(method, url, data, headers)}`\n *    – The respond method takes a set of static data to be returned or a function that can return\n *    an array containing response status (number), response data (string), response headers\n *    (Object), and the text for the status (string).\n *  - passThrough – `{function()}` – Any request matching a backend definition with\n *    `passThrough` handler will be passed through to the real backend (an XHR request will be made\n *    to the server.)\n *  - Both methods return the `requestHandler` object for possible overrides.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenGET\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for GET requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenHEAD\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for HEAD requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenDELETE\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for DELETE requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPOST\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for POST requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(string|RegExp)=} data HTTP request body.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPUT\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for PUT requests.  For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(string|RegExp)=} data HTTP request body.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenPATCH\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for PATCH requests.  For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @param {(string|RegExp)=} data HTTP request body.\n * @param {(Object|function(Object))=} headers HTTP headers.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\n\n/**\n * @ngdoc method\n * @name $httpBackend#whenJSONP\n * @module ngMockE2E\n * @description\n * Creates a new backend definition for JSONP requests. For more info see `when()`.\n *\n * @param {string|RegExp|function(string)} url HTTP url or function that receives the url\n *   and returns true if the url match the current definition.\n * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that\n *   control how a matched request is handled. You can save this object for later use and invoke\n *   `respond` or `passThrough` again in order to change how a matched request is handled.\n */\nangular.mock.e2e = {};\nangular.mock.e2e.$httpBackendDecorator =\n  ['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock];\n\n\n/**\n * @ngdoc type\n * @name $rootScope.Scope\n * @module ngMock\n * @description\n * {@link ng.$rootScope.Scope Scope} type decorated with helper methods useful for testing. These\n * methods are automatically available on any {@link ng.$rootScope.Scope Scope} instance when\n * `ngMock` module is loaded.\n *\n * In addition to all the regular `Scope` methods, the following helper methods are available:\n */\nangular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {\n\n  var $rootScopePrototype = Object.getPrototypeOf($delegate);\n\n  $rootScopePrototype.$countChildScopes = countChildScopes;\n  $rootScopePrototype.$countWatchers = countWatchers;\n\n  return $delegate;\n\n  // ------------------------------------------------------------------------------------------ //\n\n  /**\n   * @ngdoc method\n   * @name $rootScope.Scope#$countChildScopes\n   * @module ngMock\n   * @description\n   * Counts all the direct and indirect child scopes of the current scope.\n   *\n   * The current scope is excluded from the count. The count includes all isolate child scopes.\n   *\n   * @returns {number} Total number of child scopes.\n   */\n  function countChildScopes() {\n    // jshint validthis: true\n    var count = 0; // exclude the current scope\n    var pendingChildHeads = [this.$$childHead];\n    var currentScope;\n\n    while (pendingChildHeads.length) {\n      currentScope = pendingChildHeads.shift();\n\n      while (currentScope) {\n        count += 1;\n        pendingChildHeads.push(currentScope.$$childHead);\n        currentScope = currentScope.$$nextSibling;\n      }\n    }\n\n    return count;\n  }\n\n\n  /**\n   * @ngdoc method\n   * @name $rootScope.Scope#$countWatchers\n   * @module ngMock\n   * @description\n   * Counts all the watchers of direct and indirect child scopes of the current scope.\n   *\n   * The watchers of the current scope are included in the count and so are all the watchers of\n   * isolate child scopes.\n   *\n   * @returns {number} Total number of watchers.\n   */\n  function countWatchers() {\n    // jshint validthis: true\n    var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope\n    var pendingChildHeads = [this.$$childHead];\n    var currentScope;\n\n    while (pendingChildHeads.length) {\n      currentScope = pendingChildHeads.shift();\n\n      while (currentScope) {\n        count += currentScope.$$watchers ? currentScope.$$watchers.length : 0;\n        pendingChildHeads.push(currentScope.$$childHead);\n        currentScope = currentScope.$$nextSibling;\n      }\n    }\n\n    return count;\n  }\n}];\n\n\nif (window.jasmine || window.mocha) {\n\n  var currentSpec = null,\n      annotatedFunctions = [],\n      isSpecRunning = function() {\n        return !!currentSpec;\n      };\n\n  angular.mock.$$annotate = angular.injector.$$annotate;\n  angular.injector.$$annotate = function(fn) {\n    if (typeof fn === 'function' && !fn.$inject) {\n      annotatedFunctions.push(fn);\n    }\n    return angular.mock.$$annotate.apply(this, arguments);\n  };\n\n\n  (window.beforeEach || window.setup)(function() {\n    annotatedFunctions = [];\n    currentSpec = this;\n  });\n\n  (window.afterEach || window.teardown)(function() {\n    var injector = currentSpec.$injector;\n\n    annotatedFunctions.forEach(function(fn) {\n      delete fn.$inject;\n    });\n\n    angular.forEach(currentSpec.$modules, function(module) {\n      if (module && module.$$hashKey) {\n        module.$$hashKey = undefined;\n      }\n    });\n\n    currentSpec.$injector = null;\n    currentSpec.$modules = null;\n    currentSpec = null;\n\n    if (injector) {\n      injector.get('$rootElement').off();\n      injector.get('$browser').pollFns.length = 0;\n    }\n\n    // clean up jquery's fragment cache\n    angular.forEach(angular.element.fragments, function(val, key) {\n      delete angular.element.fragments[key];\n    });\n\n    MockXhr.$$lastInstance = null;\n\n    angular.forEach(angular.callbacks, function(val, key) {\n      delete angular.callbacks[key];\n    });\n    angular.callbacks.counter = 0;\n  });\n\n  /**\n   * @ngdoc function\n   * @name angular.mock.module\n   * @description\n   *\n   * *NOTE*: This function is also published on window for easy access.<br>\n   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha\n   *\n   * This function registers a module configuration code. It collects the configuration information\n   * which will be used when the injector is created by {@link angular.mock.inject inject}.\n   *\n   * See {@link angular.mock.inject inject} for usage example\n   *\n   * @param {...(string|Function|Object)} fns any number of modules which are represented as string\n   *        aliases or as anonymous module initialization functions. The modules are used to\n   *        configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an\n   *        object literal is passed they will be registered as values in the module, the key being\n   *        the module name and the value being what is returned.\n   */\n  window.module = angular.mock.module = function() {\n    var moduleFns = Array.prototype.slice.call(arguments, 0);\n    return isSpecRunning() ? workFn() : workFn;\n    /////////////////////\n    function workFn() {\n      if (currentSpec.$injector) {\n        throw new Error('Injector already created, can not register a module!');\n      } else {\n        var modules = currentSpec.$modules || (currentSpec.$modules = []);\n        angular.forEach(moduleFns, function(module) {\n          if (angular.isObject(module) && !angular.isArray(module)) {\n            modules.push(function($provide) {\n              angular.forEach(module, function(value, key) {\n                $provide.value(key, value);\n              });\n            });\n          } else {\n            modules.push(module);\n          }\n        });\n      }\n    }\n  };\n\n  /**\n   * @ngdoc function\n   * @name angular.mock.inject\n   * @description\n   *\n   * *NOTE*: This function is also published on window for easy access.<br>\n   * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha\n   *\n   * The inject function wraps a function into an injectable function. The inject() creates new\n   * instance of {@link auto.$injector $injector} per test, which is then used for\n   * resolving references.\n   *\n   *\n   * ## Resolving References (Underscore Wrapping)\n   * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this\n   * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable\n   * that is declared in the scope of the `describe()` block. Since we would, most likely, want\n   * the variable to have the same name of the reference we have a problem, since the parameter\n   * to the `inject()` function would hide the outer variable.\n   *\n   * To help with this, the injected parameters can, optionally, be enclosed with underscores.\n   * These are ignored by the injector when the reference name is resolved.\n   *\n   * For example, the parameter `_myService_` would be resolved as the reference `myService`.\n   * Since it is available in the function body as _myService_, we can then assign it to a variable\n   * defined in an outer scope.\n   *\n   * ```\n   * // Defined out reference variable outside\n   * var myService;\n   *\n   * // Wrap the parameter in underscores\n   * beforeEach( inject( function(_myService_){\n   *   myService = _myService_;\n   * }));\n   *\n   * // Use myService in a series of tests.\n   * it('makes use of myService', function() {\n   *   myService.doStuff();\n   * });\n   *\n   * ```\n   *\n   * See also {@link angular.mock.module angular.mock.module}\n   *\n   * ## Example\n   * Example of what a typical jasmine tests looks like with the inject method.\n   * ```js\n   *\n   *   angular.module('myApplicationModule', [])\n   *       .value('mode', 'app')\n   *       .value('version', 'v1.0.1');\n   *\n   *\n   *   describe('MyApp', function() {\n   *\n   *     // You need to load modules that you want to test,\n   *     // it loads only the \"ng\" module by default.\n   *     beforeEach(module('myApplicationModule'));\n   *\n   *\n   *     // inject() is used to inject arguments of all given functions\n   *     it('should provide a version', inject(function(mode, version) {\n   *       expect(version).toEqual('v1.0.1');\n   *       expect(mode).toEqual('app');\n   *     }));\n   *\n   *\n   *     // The inject and module method can also be used inside of the it or beforeEach\n   *     it('should override a version and test the new version is injected', function() {\n   *       // module() takes functions or strings (module aliases)\n   *       module(function($provide) {\n   *         $provide.value('version', 'overridden'); // override version here\n   *       });\n   *\n   *       inject(function(version) {\n   *         expect(version).toEqual('overridden');\n   *       });\n   *     });\n   *   });\n   *\n   * ```\n   *\n   * @param {...Function} fns any number of functions which will be injected using the injector.\n   */\n\n\n\n  var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {\n    this.message = e.message;\n    this.name = e.name;\n    if (e.line) this.line = e.line;\n    if (e.sourceId) this.sourceId = e.sourceId;\n    if (e.stack && errorForStack)\n      this.stack = e.stack + '\\n' + errorForStack.stack;\n    if (e.stackArray) this.stackArray = e.stackArray;\n  };\n  ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString;\n\n  window.inject = angular.mock.inject = function() {\n    var blockFns = Array.prototype.slice.call(arguments, 0);\n    var errorForStack = new Error('Declaration Location');\n    return isSpecRunning() ? workFn.call(currentSpec) : workFn;\n    /////////////////////\n    function workFn() {\n      var modules = currentSpec.$modules || [];\n      var strictDi = !!currentSpec.$injectorStrict;\n      modules.unshift('ngMock');\n      modules.unshift('ng');\n      var injector = currentSpec.$injector;\n      if (!injector) {\n        if (strictDi) {\n          // If strictDi is enabled, annotate the providerInjector blocks\n          angular.forEach(modules, function(moduleFn) {\n            if (typeof moduleFn === \"function\") {\n              angular.injector.$$annotate(moduleFn);\n            }\n          });\n        }\n        injector = currentSpec.$injector = angular.injector(modules, strictDi);\n        currentSpec.$injectorStrict = strictDi;\n      }\n      for (var i = 0, ii = blockFns.length; i < ii; i++) {\n        if (currentSpec.$injectorStrict) {\n          // If the injector is strict / strictDi, and the spec wants to inject using automatic\n          // annotation, then annotate the function here.\n          injector.annotate(blockFns[i]);\n        }\n        try {\n          /* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */\n          injector.invoke(blockFns[i] || angular.noop, this);\n          /* jshint +W040 */\n        } catch (e) {\n          if (e.stack && errorForStack) {\n            throw new ErrorAddingDeclarationLocationStack(e, errorForStack);\n          }\n          throw e;\n        } finally {\n          errorForStack = null;\n        }\n      }\n    }\n  };\n\n\n  angular.mock.inject.strictDi = function(value) {\n    value = arguments.length ? !!value : true;\n    return isSpecRunning() ? workFn() : workFn;\n\n    function workFn() {\n      if (value !== currentSpec.$injectorStrict) {\n        if (currentSpec.$injector) {\n          throw new Error('Injector already created, can not modify strict annotations');\n        } else {\n          currentSpec.$injectorStrict = value;\n        }\n      }\n    }\n  };\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/bower.json",
    "content": "{\n  \"name\": \"angular-mocks\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-mocks.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/ngAnimateMock.js",
    "content": "require('./angular-mocks');\nmodule.exports = 'ngAnimateMock';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/ngMock.js",
    "content": "require('./angular-mocks');\nmodule.exports = 'ngMock';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/ngMockE2E.js",
    "content": "require('./angular-mocks');\nmodule.exports = 'ngMockE2E';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-mocks/package.json",
    "content": "{\n  \"name\": \"angular-mocks\",\n  \"version\": \"1.3.15\",\n  \"description\": \"AngularJS mocks for testing\",\n  \"main\": \"angular-mocks.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"mocks\",\n    \"testing\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/.bower.json",
    "content": "{\n  \"name\": \"angular-route\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-route.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  },\n  \"homepage\": \"https://github.com/angular/bower-angular-route\",\n  \"_release\": \"1.3.15\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.3.15\",\n    \"commit\": \"1f6e6ac94e20b98bca10155363042411f7729ce2\"\n  },\n  \"_source\": \"git://github.com/angular/bower-angular-route.git\",\n  \"_target\": \"1.3.x\",\n  \"_originalSource\": \"angular-route\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/README.md",
    "content": "# packaged angular-route\n\nThis repo is for distribution on `npm` and `bower`. The source for this module is in the\n[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngRoute).\nPlease file issues and pull requests against that repo.\n\n## Install\n\nYou can install this package either with `npm` or with `bower`.\n\n### npm\n\n```shell\nnpm install angular-route\n```\n\nThen add `ngRoute` as a dependency for your app:\n\n```javascript\nangular.module('myApp', [require('angular-route')]);\n```\n\n### bower\n\n```shell\nbower install angular-route\n```\n\nAdd a `<script>` to your `index.html`:\n\n```html\n<script src=\"/bower_components/angular-route/angular-route.js\"></script>\n```\n\nThen add `ngRoute` as a dependency for your app:\n\n```javascript\nangular.module('myApp', ['ngRoute']);\n```\n\n## Documentation\n\nDocumentation is available on the\n[AngularJS docs site](http://docs.angularjs.org/api/ngRoute).\n\n## License\n\nThe MIT License\n\nCopyright (c) 2010-2015 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/angular-route.js",
    "content": "/**\n * @license AngularJS v1.3.15\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * # ngRoute\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n *\n * <div doc-module-components=\"ngRoute\"></div>\n */\n /* global -ngRouteModule */\nvar ngRouteModule = angular.module('ngRoute', ['ng']).\n                        provider('$route', $RouteProvider),\n    $routeMinErr = angular.$$minErr('ngRoute');\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider() {\n  function inherit(parent, extra) {\n    return angular.extend(Object.create(parent), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|function()=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be\n   *      published to scope under the `controllerAs` name.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object\n   *      is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `redirectTo` – {(string|function())=} – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.path()` and `$location.search()`.\n   *\n   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and url in the browser changes, then\n   *      `$routeUpdate` event is broadcasted on the root scope.\n   *\n   *    - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    //copy original route object to preserve params inherited from proto chain\n    var routeCopy = angular.copy(route);\n    if (angular.isUndefined(routeCopy.reloadOnSearch)) {\n      routeCopy.reloadOnSearch = true;\n    }\n    if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {\n      routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;\n    }\n    routes[path] = angular.extend(\n      routeCopy,\n      path && pathRegExp(path, routeCopy)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length - 1] == '/')\n            ? path.substr(0, path.length - 1)\n            : path + '/';\n\n      routes[redirectPath] = angular.extend(\n        {redirectTo: path},\n        pathRegExp(redirectPath, routeCopy)\n      );\n    }\n\n    return this;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $routeProvider#caseInsensitiveMatch\n   * @description\n   *\n   * A boolean property indicating if routes defined\n   * using this provider should be matched using a case insensitive\n   * algorithm. Defaults to `false`.\n   */\n  this.caseInsensitiveMatch = false;\n\n   /**\n    * @param path {string} path\n    * @param opts {Object} options\n    * @return {?Object}\n    *\n    * @description\n    * Normalizes the given path, returning a regular expression\n    * and the original path.\n    *\n    * Inspired by pathRexp in visionmedia/express/lib/utils.js.\n    */\n  function pathRegExp(path, opts) {\n    var insensitive = opts.caseInsensitiveMatch,\n        ret = {\n          originalPath: path,\n          regexp: path\n        },\n        keys = ret.keys = [];\n\n    path = path\n      .replace(/([().])/g, '\\\\$1')\n      .replace(/(\\/)?:(\\w+)([\\?\\*])?/g, function(_, slash, key, option) {\n        var optional = option === '?' ? option : null;\n        var star = option === '*' ? option : null;\n        keys.push({ name: key, optional: !!optional });\n        slash = slash || '';\n        return ''\n          + (optional ? '' : slash)\n          + '(?:'\n          + (optional ? slash : '')\n          + (star && '(.+?)' || '([^/]+)')\n          + (optional || '')\n          + ')'\n          + (optional || '');\n      })\n      .replace(/([\\/$\\*])/g, '\\\\$1');\n\n    ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');\n    return ret;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object|string} params Mapping information to be assigned to `$route.current`.\n   * If called with a string, the value maps to `redirectTo`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    if (typeof params === 'string') {\n      params = {redirectTo: params};\n    }\n    this.when(null, params);\n    return this;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$templateRequest',\n               '$sce',\n      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as define in route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = \"BookController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = \"ChapterController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: ChapterController/);\n     *       expect(content).toMatch(/Book Id\\: Moby/);\n     *       expect(content).toMatch(/Chapter Id\\: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: BookController/);\n     *       expect(content).toMatch(/Book Id\\: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * The route change (and the `$location` change that triggered it) can be prevented\n     * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}\n     * for more details about event object.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route dependencies are resolved.\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if any of the resolve promises are rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     *\n     * The `reloadOnSearch` property has been set to false, and we are reusing the same\n     * instance of the Controller.\n     */\n\n    var forceReload = false,\n        preparedRoute,\n        preparedRouteIsUpdateOnly,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope and reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n            $rootScope.$evalAsync(function() {\n              // Don't support cancellation of a reload for now...\n              prepareRoute();\n              commitRoute();\n            });\n          },\n\n          /**\n           * @ngdoc method\n           * @name $route#updateParams\n           *\n           * @description\n           * Causes `$route` service to update the current URL, replacing\n           * current route parameters with those specified in `newParams`.\n           * Provided property names that match the route's path segment\n           * definitions will be interpolated into the location's path, while\n           * remaining properties will be treated as query params.\n           *\n           * @param {!Object<string, string>} newParams mapping of URL parameter names to values\n           */\n          updateParams: function(newParams) {\n            if (this.current && this.current.$$route) {\n              newParams = angular.extend({}, this.current.params, newParams);\n              $location.path(interpolate(this.current.$$route.originalPath, newParams));\n              // interpolate modifies newParams, only query params are left\n              $location.search(newParams);\n            } else {\n              throw $routeMinErr('norout', 'Tried updating route when with no current route');\n            }\n          }\n        };\n\n    $rootScope.$on('$locationChangeStart', prepareRoute);\n    $rootScope.$on('$locationChangeSuccess', commitRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function prepareRoute($locationEvent) {\n      var lastRoute = $route.current;\n\n      preparedRoute = parseRoute();\n      preparedRouteIsUpdateOnly = preparedRoute && lastRoute && preparedRoute.$$route === lastRoute.$$route\n          && angular.equals(preparedRoute.pathParams, lastRoute.pathParams)\n          && !preparedRoute.reloadOnSearch && !forceReload;\n\n      if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {\n        if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {\n          if ($locationEvent) {\n            $locationEvent.preventDefault();\n          }\n        }\n      }\n    }\n\n    function commitRoute() {\n      var lastRoute = $route.current;\n      var nextRoute = preparedRoute;\n\n      if (preparedRouteIsUpdateOnly) {\n        lastRoute.params = nextRoute.params;\n        angular.copy(lastRoute.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', lastRoute);\n      } else if (nextRoute || lastRoute) {\n        forceReload = false;\n        $route.current = nextRoute;\n        if (nextRoute) {\n          if (nextRoute.redirectTo) {\n            if (angular.isString(nextRoute.redirectTo)) {\n              $location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search(nextRoute.params)\n                       .replace();\n            } else {\n              $location.url(nextRoute.redirectTo(nextRoute.pathParams, $location.path(), $location.search()))\n                       .replace();\n            }\n          }\n        }\n\n        $q.when(nextRoute).\n          then(function() {\n            if (nextRoute) {\n              var locals = angular.extend({}, nextRoute.resolve),\n                  template, templateUrl;\n\n              angular.forEach(locals, function(value, key) {\n                locals[key] = angular.isString(value) ?\n                    $injector.get(value) : $injector.invoke(value, null, null, key);\n              });\n\n              if (angular.isDefined(template = nextRoute.template)) {\n                if (angular.isFunction(template)) {\n                  template = template(nextRoute.params);\n                }\n              } else if (angular.isDefined(templateUrl = nextRoute.templateUrl)) {\n                if (angular.isFunction(templateUrl)) {\n                  templateUrl = templateUrl(nextRoute.params);\n                }\n                templateUrl = $sce.getTrustedResourceUrl(templateUrl);\n                if (angular.isDefined(templateUrl)) {\n                  nextRoute.loadedTemplateUrl = templateUrl;\n                  template = $templateRequest(templateUrl);\n                }\n              }\n              if (angular.isDefined(template)) {\n                locals['$template'] = template;\n              }\n              return $q.all(locals);\n            }\n          }).\n          // after route change\n          then(function(locals) {\n            if (nextRoute == $route.current) {\n              if (nextRoute) {\n                nextRoute.locals = locals;\n                angular.copy(nextRoute.params, $routeParams);\n              }\n              $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);\n            }\n          }, function(error) {\n            if (nextRoute == $route.current) {\n              $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);\n            }\n          });\n      }\n    }\n\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string || '').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(?:[?*])?(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * # Overview\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"BookCtrl\";\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"ChapterCtrl\";\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: ChapterCtrl/);\n          expect(content).toMatch(/Book Id\\: Moby/);\n          expect(content).toMatch(/Chapter Id\\: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: BookCtrl/);\n          expect(content).toMatch(/Book Id\\: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory($route, $anchorScroll, $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousLeaveAnimation,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if (previousLeaveAnimation) {\n            $animate.cancel(previousLeaveAnimation);\n            previousLeaveAnimation = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            previousLeaveAnimation = $animate.leave(currentElement);\n            previousLeaveAnimation.then(function() {\n              previousLeaveAnimation = null;\n            });\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element).then(function onNgViewEnter() {\n                if (angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n\n      link(scope);\n    }\n  };\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/bower.json",
    "content": "{\n  \"name\": \"angular-route\",\n  \"version\": \"1.3.15\",\n  \"main\": \"./angular-route.js\",\n  \"ignore\": [],\n  \"dependencies\": {\n    \"angular\": \"1.3.15\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/index.js",
    "content": "require('./angular-route');\nmodule.exports = 'ngRoute';\n"
  },
  {
    "path": "third_party/ui/bower_components/angular-route/package.json",
    "content": "{\n  \"name\": \"angular-route\",\n  \"version\": \"1.3.15\",\n  \"description\": \"AngularJS router module\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/angular/angular.js.git\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"framework\",\n    \"browser\",\n    \"router\",\n    \"client-side\"\n  ],\n  \"author\": \"Angular Core Team <angular-core+npm@google.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/angular/angular.js/issues\"\n  },\n  \"homepage\": \"http://angularjs.org\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/angularjs-jasmine-matchers/.bower.json",
    "content": "{\n  \"name\": \"angular-jasmine-matchers\",\n  \"main\": \"./dist/matchers.js\",\n  \"dependencies\": {\n    \"angular\": \">= 1.1.2\"\n  },\n  \"ignore\": [\n    \"**/.*\",\n    \"_*\",\n    \"node_modules\",\n    \"config\",\n    \"lib\",\n    \"test\",\n    \"DEVELOP.md\",\n    \"CHANGELOG.md\",\n    \"LICENSE\",\n    \"Gruntfile.js\",\n    \"browserstack.json\",\n    \"composer.json\",\n    \"package.json\",\n    \".*\"\n  ],\n  \"homepage\": \"https://github.com/ferronrsmith/angularjs-jasmine-matchers\",\n  \"_release\": \"0.2\",\n  \"_resolution\": {\n    \"type\": \"tag\",\n    \"tag\": \"0.2\",\n    \"commit\": \"e951694056fe7c8f91b5aae6667bfe1fd70d5956\"\n  },\n  \"_source\": \"git://github.com/ferronrsmith/angularjs-jasmine-matchers.git\",\n  \"_target\": \"0.2\",\n  \"_originalSource\": \"angularjs-jasmine-matchers\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/angularjs-jasmine-matchers/LICENSE",
    "content": "The MIT License\n\nCopyright (c) 2013. Ferron Hanse\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "third_party/ui/bower_components/angularjs-jasmine-matchers/README.md",
    "content": "# Angular Matchers\n\nangular matchers provides a set of matchers for the [Jasmine](http://pivotal.github.com/jasmine/) JavaScript Testing Framework:\n  \n- a set of custom matchers for Angular framework that are meant to make your testing a little bit easier\n\n\n## Angular matchers\n\njasmine-jquery provides following custom matchers (in alphabetical order):\n\n- `toBe(jQuerySelector)`\n  - e.g. `expect($('<div id=\"some-id\"></div>')).toBe('div')`\n  - e.g. `expect($('<div id=\"some-id\"></div>')).toBe('div#some-id')`\n- `toBeChecked()`\n  - only for tags that have checked attribute\n  - e.g. `expect($('<input type=\"checkbox\" checked=\"checked\"/>')).toBeChecked()` \n- `toBeEmpty()`\n  - Checks for child DOM elements or text.\n- `toBeHidden()`\n  \n  Elements can be considered hidden for several reasons:\n    - They have a CSS `display` value of `none`.\n    - They are form elements with `type` equal to `hidden`.\n    - Their `width` and `height` are explicitly set to `0`.\n    - An ancestor element is hidden, so the element is not shown on the page.\n- `toHaveCss(css)`\n  - e.g. `expect($('<div style=\"display: none; margin: 10px;\"></div>')).toHaveCss({display: \"none\", margin: \"10px\"})`\n  - e.g. `expect($('<div style=\"display: none; margin: 10px;\"></div>')).toHaveCss({margin: \"10px\"})`\n- `toBeSelected()`\n  - only for tags that have selected attribute\n  - e.g. `expect($('<option selected=\"selected\"></option>')).toBeSelected()`\n- `toBeVisible()`\n  - Elements are considered visible if they consume space in the document. Visible elements have a width or height that is greater than zero.\n- `toContain(jQuerySelector)`\n  - e.g. `expect($('<div><span class=\"some-class\"></span></div>')).toContain('span.some-class')`\n- `toExist()`\n- `toHaveAttr(attributeName, attributeValue)`\n  - attribute value is optional, if omitted it will check only if attribute exists\n- `toHaveProp(propertyName, propertyValue)`\n  - property value is optional, if omitted it will check only if property exists\n- `toHaveClass(className)`\n  - e.g. `expect($('<div class=\"some-class\"></div>')).toHaveClass(\"some-class\")`  \n- `toHaveData(key, value)`\n  - value is optional, if omitted it will check only if an entry for that key exists\n- `toHaveHtml(string)`\n  - e.g. `expect($('<div><span></span></div>')).toHaveHtml('<span></span>')`\n- `toContainHtml(string)`\n  - e.g. `expect($('<div><ul></ul><h1>header</h1></div>')).toContainHtml('<ul></ul>')`\n- `toHaveId(id)`\n  - e.g. `expect($('<div id=\"some-id\"></div>')).toHaveId(\"some-id\")`\n- `toHaveText(string)`\n  - accepts a String or regular expression\n  - e.g. `expect($('<div>some text</div>')).toHaveText('some text')`\n- `toHaveValue(value)`\n  - only for tags that have value attribute\n  - e.g. `expect($('<input type=\"text\" value=\"some text\"/>')).toHaveValue('some text')`\n- `toBeDisabled()`\n  - e.g. `expect('<input type='submit' disabled='disabled'/>').toBeDisabled()`\n- `toBeFocused()`\n  - e.g. `expect($('<input type='text' />').focus()).toBeFocused()`\n- `toHandle(eventName)`\n  - e.g. `expect($form).toHandle(\"submit\")`\n- `toHandleWith(eventName, eventHandler)`\n  - e.g. `expect($form).toHandleWith(\"submit\", yourSubmitCallback)`\n  \nThe same as with standard Jasmine matchers, all of above custom matchers may be inverted by using `.not` prefix, e.g.:\n\n    expect($('<div>some text</div>')).not.toHaveText(/other/)\n\n\n## Dependencies\n\nangular matchers was tested with Jasmine 1.2 and jQuery 1.8 on FF, Chrome, and Safari. There is a high chance it will work with older versions and other browsers as well, but I don't typically run test suite against them when adding new features.\n\n## Cross domain policy problems under Chrome\n\nNewer versions of Chrome don't allow file:// URIs read other file:// URIs. In effect, jasmine-jquery cannot properly load fixtures under some versions of Chrome. An override for this is to run Chrome with a switch `--allow-file-access-from-files`. \n\nUnder Windows 7, you have to launch `C:\\Users\\[UserName]\\AppData\\Local\\Google\\Chrome[ SxS]\\Application\\chrome.exe --allow-file-access-from-files`\n\n\n### Writing the Code\n\n- Get the code right.\n- Include tests that fail without your code, and pass with it.\n- Update the (surrounding) documentation, examples elsewhere, and the guides: whatever is affected by your contribution.\n- Follow the conventions in the source you see used already, basically [npm coding style](http://npmjs.org/doc/coding-style.html)\n\nIf you can, have another developer sanity check your change\n\n### Install via Bower\n\nNow offers bower support. `bower install angularjs-jasmine-matchers --save`\n\n\n### Build status\n[![Build Status](https://travis-ci.org/ferronrsmith/angularjs-jasmine-matchers.png?branch=master)](https://travis-ci.org/ferronrsmith/angularjs-jasmine-matchers)"
  },
  {
    "path": "third_party/ui/bower_components/angularjs-jasmine-matchers/bower.json",
    "content": "{\n    \"name\": \"angular-jasmine-matchers\",\n    \"version\": \"0.0.7\",\n    \"main\": \"./dist/matchers.js\",\n    \"dependencies\": {\n        \"angular\": \">= 1.1.2\"\n    },\n    \"ignore\": [\n        \"**/.*\",\n        \"_*\",\n        \"node_modules\",\n        \"config\",\n        \"lib\",\n        \"test\",\n        \"DEVELOP.md\",\n        \"CHANGELOG.md\",\n        \"LICENSE\",\n        \"Gruntfile.js\",\n        \"browserstack.json\",\n        \"composer.json\",\n        \"package.json\",\n        \".*\"\n    ]\n}"
  },
  {
    "path": "third_party/ui/bower_components/angularjs-jasmine-matchers/dist/matchers.js",
    "content": "/*\n (c) Ferron Hanse 2012\n https://github.com/ferronrsmith/anuglarjs-jasmine-matchers\n Released under the MIT license\n*/\n\n\n/*jslint nomen : true*/\n/*jslint devel : true*/\n/*jslint unparam : true */\n/*jslint browser : true */\n/*jslint bitwise : true*/\n/*global describe, beforeEach, inject, module, angular, document, it, expect, $, jasmine, toJson */\n\n/**\n Provides a comprehensive set of custom matchers for the Jasmine testing framework\n @class matchers\n @main matchers\n **/\nbeforeEach(function () {\n    \"use strict\";\n    var matchers = {},\n        hlp = {},\n        bjQuery = false;\n\n    hlp.cssMatcher = function (presentClasses, absentClasses) {\n        var self = this;\n        return function () {\n            var element = angular.element(self.actual), present = true, absent = false;\n\n            angular.forEach(presentClasses.split(' '), function (className) {\n                present = present && element.hasClass(className);\n            });\n\n            angular.forEach(absentClasses.split(' '), function (className) {\n                absent = absent || element.hasClass(className);\n            });\n\n            self.message = function () {\n                return \"Expected to {0} have \".t(this.isNot ? \"not\" : \"\") + presentClasses +\n                    (absentClasses ? (\" and not have \" + absentClasses + \" \") : \"\") +\n                    \" but had \" + element[0].className + \".\";\n            };\n            return present && !absent;\n        };\n    };\n\n    /**\n     * Returns the index of an object in a given array\n     * @method hpl.indexOf\n     * @param array :- array object to be checked\n     * @param obj :- object (value) to be checked for in the array\n     * @return {number} index of the obj in the array\n     */\n    hlp.indexOf = function (array, obj) {\n        var i;\n        for (i = 0; i < array.length; i += 1) {\n            if (obj === array[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n\n    /**\n     * Check if an object has a particular property matches the expected value\n     * @method hpl.hasProperty\n     * @param actualValue property value\n     * @param expectedValue expected value\n     * @return {boolean} boolean indicating if the values match\n     */\n    hlp.hasProperty = function (actualValue, expectedValue) {\n        if (expectedValue === undefined) {\n            return actualValue !== undefined;\n        }\n        return actualValue === expectedValue;\n    };\n\n    /**\n     * Checks if a given element/JavaScript object matches the type\n     * @method hpl.typeOf\n     * @param actual Object to be checked for type comparison\n     * @param type type to be matched\n     * @return {boolean} boolean indicating if the type matches the object type\n     */\n    hlp.typeOf = function (actual, type) {\n        return Object.prototype.toString.call(actual) === \"[object \" + type + \"]\";\n    };\n\n    /**\n     * Checks if the a given word/phrase/substring is at the end of a string\n     * @method hpl.endsWith\n     * @param {String} haystack string to be search\n     * @param needle {String} word/phrase/substring\n     * @return {boolean} boolean indicating if the word/phrase/substring was found at the end of the string\n     */\n    hlp.endsWith = function (haystack, needle) {\n        return haystack.substr(-needle.length) === needle;\n    };\n\n    /**\n     * Checks if the a given word/phrase/substring is at the beginning of a string\n     * @method hpl.endsWith\n     * @param {String} haystack string to be search\n     * @param needle {String} word/phrase/substring\n     * @return {boolean} boolean indicating if the word/phrase/substring was found at the beginning of the string\n     */\n    hlp.startsWith = function (haystack, needle) {\n        return haystack.substr(0, needle.length) === needle;\n    };\n\n    /**\n     * Coverts a given object literal to an array\n     * @method hlp.objToArray\n     * @param obj - object literal\n     * @return {Array} array representation of the object\n     * @since 0.2 :- Removed $$hashKey check\n     */\n    hlp.objToArray = function (obj) {\n        var arr = [], aDup = {};\n        angular.copy(obj, aDup);\n        angular.forEach(aDup, function (value, key) {\n            arr.push(value);\n        });\n        return arr;\n    };\n\n    /**\n     * Coverts a given a list of object literals to a flatten array\n     * @method hlp.objListToArray\n     * @param obj - object literals\n     * @return {Array} flatten array representation of the objects\n     */\n    hlp.objListToArray = function (obj) {\n        var res = [];\n        angular.forEach(obj, function (value, key) {\n            res = res.concat(hlp.objToArray(value));\n        });\n        return res;\n    };\n\n    hlp.isNumber = function (val) {\n        return !isNaN(parseFloat(val)) && !hlp.typeOf(val, 'String');\n    };\n\n    /**\n     * Message constant for jQuery\n     * @type {string}\n     */\n    hlp.msg = {\n        jQuery : \"Error: jQuery not found. this matcher has a dependency on jQuery\",\n        date : {\n            invalidType : 'Expected {0} & {1} to be a Date',\n            nomatch : {\n                Date : 'Expected {0} & {1} to match',\n                part : \"Invalid part : {0} entered\"\n            }\n        }\n    };\n\n    hlp.dp = function (x) {\n        return angular.mock.dump(arguments.length > 1 ? arguments : x);\n    };\n\n    /**\n     * Returns isNot String\n     * @param context\n     * @param altText\n     */\n    hlp.isNot = function (context, altText) {\n        altText = altText || \"\";\n        return context.isNot ? \"not \" : altText;\n    };\n\n    String.prototype.t = function () {\n        var args = arguments;\n        return this.replace(/\\{(\\d+)\\}/g, function (match, number) {\n            return args[number] !== 'undefined' ? args[number] : match;\n        });\n    };\n\n    /**\n     * Check if jQuery is present\n     * @return {boolean} boolean indicating if jQuery is present\n     */\n    bjQuery = (function () {\n        return (window.$ !== undefined || window.jQuery !== undefined);\n    }());\n\n    // a check that allows the matchers to work with angular-scenario\n    // NB: Not all matchers work with angualar-scenario and i have not done extensive testing on this\n    if (this.addMatchers === undefined) {\n        this.addMatchers = function (properties) {\n            if (angular.scenario !== undefined && angular.isObject(properties)) {\n                angular.forEach(properties, function (value, key) {\n                    angular.scenario.matcher(key, value);\n                });\n            }\n        };\n    }\n\n    matchers.toBeInvalid =  hlp.cssMatcher('ng-invalid', 'ng-valid');\n    matchers.toBeValid =  hlp.cssMatcher('ng-valid', 'ng-invalid');\n    matchers.toBeDirty =  hlp.cssMatcher('ng-dirty', 'ng-pristine');\n    matchers.toBePristine = hlp.cssMatcher('ng-pristine', 'ng-dirty');\n    matchers.toEqual = function (expected) {\n        if (this.actual && this.actual.$$log) {\n            if (typeof expected === 'string') {\n                this.actual = this.actual.toString();\n            } else {\n                this.actual = this.actual.toArray();\n            }\n        }\n        return jasmine.Matchers.prototype.toEqual.call(this, expected);\n    };\n\n    matchers.toEqualData = function (expected) {\n        this.message = function () {\n            return \"Expected \" + hlp.dp(this.actual) + \" data {0} to Equal \".t(this.isNot ? \"not\" : \"\") + expected;\n        };\n        return angular.equals(this.actual, expected);\n    };\n\n    matchers.toEqualError = function (message) {\n        this.message = function () {\n            var expected;\n            if (this.actual.message && this.actual.name === 'Error') {\n                expected = angular.toJson(this.actual.message);\n            } else {\n                expected = angular.toJson(this.actual);\n            }\n            return \"Expected \" + expected + \" to {0} be an Error with message \".t(this.isNot ? \"not\" : \"\") + angular.toJson(message);\n        };\n        return this.actual.name === 'Error' && this.actual.message === message;\n    };\n\n    matchers.toMatchError = function (messageRegexp) {\n        this.message = function () {\n            var expected;\n            if (this.actual.message && this.actual.name === 'Error') {\n                expected = angular.toJson(this.actual.message);\n            } else {\n                expected = angular.toJson(this.actual);\n            }\n            return \"Expected \" + expected + \" to {0} match an Error with message \".t(this.isNot ? \"not\" : \"\") + angular.toJson(messageRegexp);\n        };\n        return this.actual.name === 'Error' && messageRegexp.test(this.actual.message);\n    };\n\n    matchers.toHaveBeenCalledOnce = function () {\n        if (arguments.length > 0) {\n            throw new Error('toHaveBeenCalledOnce does not take arguments, use toHaveBeenCalledWith');\n        }\n\n        if (!jasmine.isSpy(this.actual)) {\n            throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n        }\n\n        this.message = function () {\n            var msg = 'Expected spy ' + this.actual.identity + ' to have been called once, but was ',\n                count = this.actual.callCount;\n            return [\n                count === 0 ? msg + 'never called.' : msg + 'called ' + count + ' times.',\n                msg.replace('to have', 'not to have') + 'called once.'\n            ];\n        };\n\n        return this.actual.callCount === 1;\n    };\n\n    matchers.toHaveBeenCalledOnceWith = function () {\n        var expectedArgs = jasmine.util.argsToArray(arguments);\n\n        if (!jasmine.isSpy(this.actual)) {\n            throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n        }\n\n        this.message = function () {\n            var result;\n            if (this.actual.callCount !== 1) {\n                if (this.actual.callCount === 0) {\n                    result = [\n                        'Expected spy ' + this.actual.identity + ' to have been called with ' +\n                            jasmine.pp(expectedArgs) + ' but it was never called.',\n                        'Expected spy ' + this.actual.identity + ' not to have been called with ' +\n                            jasmine.pp(expectedArgs) + ' but it was.'\n                    ];\n                } else {\n                    result = [\n                        'Expected spy ' + this.actual.identity + ' to have been called with ' +\n                            jasmine.pp(expectedArgs) + ' but it was never called.',\n                        'Expected spy ' + this.actual.identity + ' not to have been called with ' +\n                            jasmine.pp(expectedArgs) + ' but it was.'\n                    ];\n                }\n            } else {\n                result = [\n                    'Expected spy ' + this.actual.identity + ' to have been called with ' +\n                        jasmine.pp(expectedArgs) + ' but was called with ' + jasmine.pp(this.actual.argsForCall),\n                    'Expected spy ' + this.actual.identity + ' not to have been called with ' +\n                        jasmine.pp(expectedArgs) + ' but was called with ' + jasmine.pp(this.actual.argsForCall)\n                ];\n            }\n            return result;\n        };\n\n        return this.actual.callCount === 1 && this.env.contains_(this.actual.argsForCall, expectedArgs);\n    };\n\n    matchers.toBeOneOf = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be one of '\".t(this.isNot ? \"not\" : \"\") + hlp.dp(arguments) + \"'.\";\n        };\n        return hlp.indexOf(arguments, this.actual) !== -1;\n    };\n\n    matchers.toHaveClass = function (clazz) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have class '\".t(this.isNot ? \"not\" : \"\") + clazz + \"'.\";\n        };\n        return this.actual.hasClass ? this.actual.hasClass(clazz) : angular.element(this.actual).hasClass(clazz);\n    };\n\n    matchers.toHaveCss = function (css) {\n        var prop; // css prop\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have css '\".t(this.isNot ? \"not\" : \"\") + hlp.dp(css) + \"'.\";\n        };\n        for (prop in css) {\n            if (css.hasOwnProperty(prop)) {\n                if (this.actual.css(prop) !== css[prop]) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    };\n\n    matchers.toMatchRegex = function (regex) {\n\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} match '\".t(this.isNot ? \"not\" : \"\") + regex;\n        };\n\n        var reg;\n        if (hlp.typeOf(regex, \"String\")) {\n            reg = new RegExp(regex);\n        } else if (hlp.typeOf(regex, \"RegExp\")) {\n            reg = regex;\n        }\n        return reg.test(this.actual);\n    };\n\n    matchers.toBeVisible = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be visible '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return this.actual.is(':visible');\n    };\n\n    matchers.toBeHidden = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be hidden '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return this.actual.is(':hidden');\n    };\n\n    matchers.toBeSelected = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be selected '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return this.actual.is(':selected');\n    };\n\n    matchers.toBeChecked = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be checked '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return this.actual.is(':checked');\n    };\n\n    matchers.toBeSameDate = function (date) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be equal to '\".t(this.isNot ? \"not\" : \"\") + hlp.dp(date);\n        };\n\n        var actualDate = this.actual;\n        return actualDate.getDate() === date.getDate() &&\n            actualDate.getFullYear() === date.getFullYear() &&\n            actualDate.getMonth() === date.getMonth() &&\n            actualDate.getHours() === date.getHours() &&\n            actualDate.getMinutes() === date.getMinutes() &&\n            actualDate.getSeconds() === date.getSeconds();\n    };\n\n    matchers.toBeEmpty = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be empty '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return this.actual.is(':empty');\n    };\n\n    matchers.toBeEmptyString = function () {\n        this.message = function () {\n            return \"Expected string '\" + hlp.dp(this.actual) + \"' to {0} be empty '\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'String') && $.trim(this.actual).length === 0;\n    };\n\n    matchers.toExist = function () {\n        this.message = function () {\n            var msg = \"\";\n            if (bjQuery) {\n                msg = \"Expected '\" + hlp.dp(this.actual) + \"' to {0} exists '\".t(this.isNot ? \"not\" : \"\");\n            } else {\n                msg = hlp.msg.jQuery;\n            }\n            return msg;\n        };\n        return bjQuery ? $(document).find(this.actual).length : false;\n    };\n\n    matchers.toHaveAttr = function (attributeName, expectedAttributeValue) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have attribute '\".t(this.isNot ? \"not\" : \"\") + attributeName + \"' with value \"  + expectedAttributeValue + \".\";\n        };\n        return hlp.hasProperty(this.actual.attr(attributeName), expectedAttributeValue);\n    };\n\n    matchers.toHaveProp = function (propertyName, expectedPropertyValue) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have property '\".t(this.isNot ? \"not\" : \"\") + expectedPropertyValue + \"'.\";\n        };\n        return hlp.hasProperty(this.actual.prop(propertyName), expectedPropertyValue);\n    };\n\n    matchers.toHaveId = function (id) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have id '\".t(this.isNot ? \"not\" : \"\") + id + \"'.\";\n        };\n        return this.actual.attr('id') === id;\n    };\n\n    matchers.toBeDisabled = function (selector) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be disabled '\".t(this.isNot ? \"not\" : \"\") + hlp.dp(selector) + \"'.\";\n        };\n        return this.actual.is(':disabled');\n    };\n\n    matchers.toBeFocused = function (selector) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be focused '\".t(this.isNot ? \"not\" : \"\") + hlp.dp(selector) + \"'.\";\n        };\n        return this.actual.is(':focus');\n    };\n\n    matchers.toHaveText = function (text) {\n        if (!bjQuery) {\n            return false;\n        }\n\n        this.message = function () {\n            var msg = \"\";\n            if (bjQuery) {\n                msg = \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have text '\".t(this.isNot ? \"not\" : \"\") + text + \"'.\";\n            } else {\n                msg = hlp.msg.jQuery;\n            }\n            return msg;\n        };\n\n        var trimmedText = $.trim(this.actual.text()), result;\n        if (text && angular.isFunction(text.test)) {\n            result = text.test(trimmedText);\n        } else {\n            result = trimmedText === text;\n        }\n        return result;\n    };\n\n    matchers.toHaveValue = function (value) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have value '\".t(this.isNot ? \"not\" : \"\") + value + \"'.\";\n        };\n        return this.actual.val() === value;\n    };\n\n    matchers.toHaveData = function (key, expectedValue) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} have data '\" + expectedValue + \"'.\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.hasProperty(this.actual.data(key), expectedValue);\n    };\n\n    /**\n     * Does not return true if subject is null\n     * @return {Boolean}\n     */\n    matchers.toBeObject = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be an [Object]\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'Object');\n    };\n\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeArray = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be an [Array]\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'Array');\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeDate = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be a [Date]\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'Date');\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeBefore = function (date) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be before\".t(this.isNot ? \"not\" : \"\") + hlp.dp(date);\n        };\n        return hlp.typeOf(this.actual, 'Date') && this.actual.getTime() < date.getTime();\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeAfter = function (date) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be after\".t(this.isNot ? \"not\" : \"\") + hlp.dp(date);\n        };\n        return hlp.typeOf(this.actual, 'Date') && this.actual.getTime() > date.getTime();\n    };\n\n    matchers.toBeIso8601Date = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be ISO8601 Date Format\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'String')\n            && this.actual.length >= 10\n            && new Date(this.actual).toString() !== 'Invalid Date'\n            && new Date(this.actual).toISOString().slice(0, this.actual.length) === this.actual;\n    };\n\n    /**\n     * Asserts subject is an Array with a defined number of members\n     * @param  {Number} size\n     * @return {Boolean}\n     */\n    matchers.toBeArrayOfSize = function (size) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be an [Array] of size {1}\".t(this.isNot ? \"not\" : \"\", size);\n        };\n        return hlp.typeOf(this.actual, 'Array') && this.actual.length === size;\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeString = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be a [String]\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'String');\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeBoolean = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to {0} be Boolean\".t(this.isNot ? \"not\" : \"\");\n        };\n        return hlp.typeOf(this.actual, 'Boolean');\n    };\n\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeNonEmptyString = function () {\n        if (!bjQuery) {\n            return false;\n        }\n\n        this.message = function () {\n            var msg = \"\";\n            if (bjQuery) {\n                msg = \"Expected '\" + hlp.dp(this.actual) + \"' to \" + hlp.isNot(this, \"\") + \"be a non empty string \";\n            } else {\n                msg = hlp.msg.jQuery;\n            }\n            return msg;\n        };\n        return hlp.typeOf(this.actual, 'String') && $.trim(this.actual).length > 0;\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeNumber = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to \" + hlp.isNot(this, \"\") + \"be a [Number]\";\n        };\n        return hlp.isNumber(this.actual);\n    };\n\n    matchers.toBeEvenNumber = function () {\n        this.message = function () {\n            return \"Expected \" + hlp.dp(this.actual) + \" to \" + hlp.isNot(this, \"\") + \"be an even number\";\n        };\n        return hlp.isNumber(this.actual) && this.actual % 2 === 0;\n    };\n\n    matchers.toBeOddNumber = function () {\n        this.message = function () {\n            return \"Expected \" + hlp.dp(this.actual) + \" to \" + hlp.isNot(this, \"\") + \"be an odd number\";\n        };\n        return hlp.isNumber(this.actual) && this.actual % 2 !== 0;\n    };\n\n    matchers.toBeNaN = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to \" + hlp.isNot(this, \"\") + \"be a [NaN]\";\n        };\n        return isNaN(this.actual);\n    };\n\n    /**\n     * @return {Boolean}\n     */\n    matchers.toBeFunction = function () {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to \" + hlp.isNot(this, \"\") + \"be a [Function]\";\n        };\n        return hlp.typeOf(this.actual, 'Function');\n    };\n\n    matchers.toHaveLength = function (length) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to \" + hlp.isNot(this, \"\") + \"have a length of \" + length;\n        };\n        return this.actual.length === length;\n    };\n\n    matchers.toStartWith = function (value) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \" \" + hlp.isNot(this, \"\") + \"to start with \" + value;\n        };\n        return hlp.startsWith(this.actual, value);\n    };\n\n    matchers.toEndWith = function (value) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \" \" + hlp.isNot(this, \"\") + \"' to end with \" + value;\n        };\n        return hlp.endsWith(this.actual, value);\n    };\n\n    matchers.toContainOnce = function (value) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to contain only one \" + value;\n        };\n        var actual = this.actual, containsOnce = false, firstFoundAt;\n        if (actual) {\n            firstFoundAt = actual.indexOf(value);\n            containsOnce = firstFoundAt !== -1 && firstFoundAt === actual.lastIndexOf(value);\n        }\n        return containsOnce;\n    };\n\n    matchers.toContainSelector = function (selector) {\n        this.message = function () {\n            return \"Expected '\" + hlp.dp(this.actual) + \"' to have contain '\" + hlp.dp(selector) + \"'.\";\n        };\n        return this.actual.find(selector).length;\n    };\n\n    /**\n     * @return {boolean}\n     */\n    matchers.toBeUniqueArray = function () {\n        // iterate over the array, adding unique elements to o\n        var arr = this.actual, i, len = this.actual.length, o = [];\n        this.message = function () {\n            return \"Expected \" + hlp.dp(this.actual) + \" values {0} to be unique\".t(this.isNot ? \"not\" : \"\");\n        };\n        for (i = 0; i < len; i += 1) {\n            if (hlp.indexOf(o, arr[i]) === -1) {\n                o.push(arr[i]);\n            } else {\n                return false;\n            }\n        }\n        return true;\n    };\n\n    matchers.toHaveMatchingAtrr = function (attr, obj) {\n        var arr = hlp.objListToArray(obj),\n            result = true,\n            temp = this.actual,\n            iter = 0,\n            len = this.actual.length;\n\n        // can't compare arrays of different lengths\n        if (this.actual.length !== arr.length) {\n            return false;\n        }\n\n        for (iter = 0; iter < len; iter += 1) {\n            result &= temp.eq(iter).attr(attr) === arr[iter];\n        }\n\n        this.message = function () {\n            var message;\n            if (this.actual.length === arr.length) {\n                message = \"Expected '\" + hlp.dp(this.actual) + \"' elements to have attributes \" + hlp.dp(arr) + \" \" + hlp.dp(arr);\n            } else {\n                message = \"Can't compare obj properties of length \" + arr.length + \" with element collection of length \" + this.actual.length;\n            }\n            return message;\n        };\n\n        return result;\n    };\n\n    /**\n     *\n     * @method matchers.toMatchDatePart\n     * @param oDate {Date} Date to be compared\n     * @param {String} part specific part/property of the date you want to be compared </br\n     *        <br />\n     *        <b>Currently supported parts are listed below :</b>\n     *        <ul>\n     *            <li>date</li>\n     *            <li>day</li>\n     *            <li>month</li>\n     *            <li>year</li>\n     *            <li>milliseconds</li>\n     *            <li>minutes</li>\n     *            <li>seconds</li>\n     *            <li>hours</li>\n     *            <li>time</li>\n     *        </ul>\n     *  e.g usages :expect(date).toMatchDatePart(date, 'day');\n     * @beta\n     */\n    matchers.toMatchDatePart = function (oDate, part) {\n        var cDate = this.actual,\n            msg,\n            result;\n        if (hlp.typeOf(cDate, 'Date') && hlp.typeOf(oDate, 'Date')) {\n            switch (part) {\n            case 'date':\n                result = cDate.getDate() === oDate.getDate();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getDate()), hlp.dp(oDate.getDate()));\n                break;\n            case 'day':\n                result = cDate.getDay() === oDate.getDay();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getDay()), hlp.dp(oDate.getDay()));\n                break;\n            case 'month':\n                result = cDate.getMonth() === oDate.getMonth();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getMonth()), hlp.dp(oDate.getMonth()));\n                break;\n            case 'year':\n                result = cDate.getFullYear() === oDate.getFullYear();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getFullYear()), hlp.dp(oDate.getFullYear()));\n                break;\n            case 'milliseconds':\n                result = cDate.getMilliseconds() === oDate.getMilliseconds();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getMilliseconds()), hlp.dp(oDate.getMilliseconds()));\n                break;\n            case 'seconds':\n                result = cDate.getSeconds() === oDate.getSeconds();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getSeconds()), hlp.dp(oDate.getSeconds()));\n                break;\n            case 'minutes':\n                result = cDate.getMinutes() === oDate.getMinutes();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getMinutes()), hlp.dp(oDate.getMinutes()));\n                break;\n            case 'hours':\n                result = cDate.getHours() === oDate.getHours();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getHours()), hlp.dp(oDate.getHours()));\n                break;\n            case 'time':\n                result = cDate.getTime() === oDate.getTime();\n                msg = hlp.msg.date.nomatch.Date.t(hlp.dp(cDate.getTime()), hlp.dp(oDate.getTime()));\n                break;\n            default:\n                msg = hlp.msg.date.nomatch.part.t(part);\n            }\n\n        } else {\n            msg = hlp.msg.date.invalidType.t(hlp.dp(cDate), hlp.dp(oDate));\n            result = false;\n        }\n        this.message = function () { return msg; };\n        return result;\n    };\n\n    // aliases\n    this.addMatchers(matchers);\n\n    // Keep a reference to the original matchers, for tests\n    jasmine.__angular_jasmine_matchers__ = matchers;\n});"
  },
  {
    "path": "third_party/ui/bower_components/d3/.bower.json",
    "content": "{\n  \"name\": \"d3\",\n  \"version\": \"3.5.5\",\n  \"main\": \"d3.js\",\n  \"scripts\": [\n    \"d3.js\"\n  ],\n  \"ignore\": [\n    \".DS_Store\",\n    \".git\",\n    \".gitignore\",\n    \".npmignore\",\n    \".spmignore\",\n    \".travis.yml\",\n    \"Makefile\",\n    \"bin\",\n    \"component.json\",\n    \"composer.json\",\n    \"index.js\",\n    \"lib\",\n    \"node_modules\",\n    \"package.json\",\n    \"src\",\n    \"test\"\n  ],\n  \"homepage\": \"https://github.com/mbostock/d3\",\n  \"_release\": \"3.5.5\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v3.5.5\",\n    \"commit\": \"9628a923cb9df82058a4a2fcc8d415e45b6d5d2f\"\n  },\n  \"_source\": \"git://github.com/mbostock/d3.git\",\n  \"_target\": \"~3.5.5\",\n  \"_originalSource\": \"d3\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/d3/.gitattributes",
    "content": "bower.json -diff merge=ours\ncomponent.json -diff merge=ours\nd3.js -diff merge=ours\nd3.min.js -diff merge=ours\npackage.js -diff merge=ours\n"
  },
  {
    "path": "third_party/ui/bower_components/d3/CONTRIBUTING.md",
    "content": "# Contributing\n\n**Important:** these GitHub issues are for *bug reports and feature requests only*. Please use [StackOverflow](http://stackoverflow.com/questions/tagged/d3.js) or the [d3-js Google group](https://groups.google.com/d/forum/d3-js) for general help.\n\nIf you’re looking for ways to contribute, please [peruse open issues](https://github.com/mbostock/d3/issues?milestone=&page=1&state=open). The icebox is a good place to find ideas that are not currently in development. If you already have an idea, please check past issues to see whether your idea or a similar one was previously discussed.\n\nBefore submitting a pull request, consider implementing a live example first, say using [bl.ocks.org](http://bl.ocks.org). Real-world use cases go a long way to demonstrating the usefulness of a proposed feature. The more complex a feature’s implementation, the more usefulness it should provide. Share your demo using the #d3js tag on Twitter or by sending it to the [d3-js Google group](https://groups.google.com/d/forum/d3-js).\n\nIf your proposed feature does not involve changing core functionality, consider submitting it instead as a [D3 plugin](https://github.com/d3/d3-plugins). New core features should be for general use, whereas plugins are suitable for more specialized use cases. When in doubt, it’s easier to start with a plugin before “graduating” to core.\n\nTo contribute new documentation or add examples to the gallery, just [edit the Wiki](https://github.com/mbostock/d3/wiki)!\n\n## How to Submit a Pull Request\n\n1. Click the “Fork” button to create your personal fork of the D3 repository.\n\n2. After cloning your fork of the D3 repository in the terminal, run `npm install` to install D3’s dependencies.\n\n3. Create a new branch for your new feature. For example: `git checkout -b my-awesome-feature`. A dedicated branch for your pull request means you can develop multiple features at the same time, and ensures that your pull request is stable even if you later decide to develop an unrelated feature.\n\n4. The `d3.js` and `d3.min.js` files are built from source files in the `src` directory. _Do not edit `d3.js` directly._ Instead, edit the source files, and then run `make` to build the generated files.\n\n5. Use `make test` to run tests and verify your changes. If you are adding a new feature, you should add new tests! If you are changing existing functionality, make sure the existing tests run, or update them as appropriate.\n\n6. Sign D3’s [Individual Contributor License Agreement](https://docs.google.com/forms/d/1CzjdBKtDuA8WeuFJinadx956xLQ4Xriv7-oDvXnZMaI/viewform). Unless you are submitting a trivial patch (such as fixing a typo), this form is needed to verify that you are able to contribute.\n\n7. Submit your pull request, and good luck!\n"
  },
  {
    "path": "third_party/ui/bower_components/d3/LICENSE",
    "content": "Copyright (c) 2010-2015, Michael Bostock\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* The name Michael Bostock may not be used to endorse or promote products\n  derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,\nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\nOF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "third_party/ui/bower_components/d3/README.md",
    "content": "# Data-Driven Documents\n\n<a href=\"http://d3js.org\"><img src=\"http://d3js.org/logo.svg\" align=\"left\" hspace=\"10\" vspace=\"6\"></a>\n\n**D3.js** is a JavaScript library for manipulating documents based on data. **D3** helps you bring data to life using HTML, SVG and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation.\n\nWant to learn more? [See the wiki.](https://github.com/mbostock/d3/wiki)\n\nFor examples, [see the gallery](https://github.com/mbostock/d3/wiki/Gallery) and [mbostock’s bl.ocks](http://bl.ocks.org/mbostock).\n"
  },
  {
    "path": "third_party/ui/bower_components/d3/bower.json",
    "content": "{\n  \"name\": \"d3\",\n  \"version\": \"3.5.5\",\n  \"main\": \"d3.js\",\n  \"scripts\": [\n    \"d3.js\"\n  ],\n  \"ignore\": [\n    \".DS_Store\",\n    \".git\",\n    \".gitignore\",\n    \".npmignore\",\n    \".spmignore\",\n    \".travis.yml\",\n    \"Makefile\",\n    \"bin\",\n    \"component.json\",\n    \"composer.json\",\n    \"index.js\",\n    \"lib\",\n    \"node_modules\",\n    \"package.json\",\n    \"src\",\n    \"test\"\n  ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/d3/d3.js",
    "content": "!function() {\n  var d3 = {\n    version: \"3.5.5\"\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = this.document;\n  function d3_documentElement(node) {\n    return node && (node.ownerDocument || node.document || node).documentElement;\n  }\n  function d3_window(node) {\n    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n  }\n  if (d3_document) {\n    try {\n      d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n    } catch (e) {\n      d3_array = function(list) {\n        var i = list.length, array = new Array(i);\n        while (i--) array[i] = list[i];\n        return array;\n      };\n    }\n  }\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  if (d3_document) {\n    try {\n      d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n    } catch (error) {\n      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n      d3_element_prototype.setAttribute = function(name, value) {\n        d3_element_setAttribute.call(this, name, value + \"\");\n      };\n      d3_element_prototype.setAttributeNS = function(space, local, value) {\n        d3_element_setAttributeNS.call(this, space, local, value + \"\");\n      };\n      d3_style_prototype.setProperty = function(name, value, priority) {\n        d3_style_setProperty.call(this, name, value + \"\", priority);\n      };\n    }\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    if (j) return s / j;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n  };\n  d3.variance = function(array, f) {\n    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    } else {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n    if (j > 1) return s / (j - 1);\n  };\n  d3.deviation = function() {\n    var v = d3.variance.apply(this, arguments);\n    return v ? Math.sqrt(v) : v;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array, i0, i1) {\n    if ((m = arguments.length) < 3) {\n      i1 = array.length;\n      if (m < 2) i0 = 0;\n    }\n    var m = i1 - i0, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.zip = function() {\n    if (!(n = arguments.length)) return [];\n    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n        zip[j] = arguments[j][i];\n      }\n    }\n    return zips;\n  };\n  function d3_zipLength(d) {\n    return d.length;\n  }\n  d3.transpose = function(matrix) {\n    return d3.zip.apply(d3, matrix);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object, f) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) {\n      object.forEach(function(key, value) {\n        map.set(key, value);\n      });\n    } else if (Array.isArray(object)) {\n      var i = -1, n = object.length, o;\n      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n    } else {\n      for (var key in object) map.set(key, object[key]);\n    }\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  function d3_identity(d) {\n    return d;\n  }\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatches = function(n, s) {\n    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n    d3_selectMatches = function(n, s) {\n      return d3_selectMatcher.call(n, s);\n    };\n    return d3_selectMatches(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3.select(d3_document.documentElement);\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: \"http://www.w3.org/1999/xhtml\",\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0) {\n        prefix = name.slice(0, i);\n        name = name.slice(i + 1);\n      }\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) {\n        var node = this.node();\n        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n      }\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    function create() {\n      var document = this.ownerDocument, namespace = this.namespaceURI;\n      return namespace ? document.createElementNS(namespace, name) : document.createElement(name);\n    }\n    function createNS() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    }\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(d3_selectionRemove);\n  };\n  function d3_selectionRemove() {\n    var parent = this.parentNode;\n    if (parent) parent.removeChild(this);\n  }\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) {\n            exitNodes[i] = node;\n          } else {\n            nodeByKeyValue.set(keyValue, node);\n          }\n          keyValues[i] = keyValue;\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3.select = function(node) {\n    var group;\n    if (typeof node === \"string\") {\n      group = [ d3_select(node, d3_document) ];\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = [ node ];\n      group.parentNode = d3_documentElement(node);\n    }\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group;\n    if (typeof nodes === \"string\") {\n      group = d3_array(d3_selectAll(nodes, d3_document));\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = nodes;\n      group.parentNode = null;\n    }\n    return d3_selection([ group ]);\n  };\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  if (d3_document) {\n    d3_selection_onFilters.forEach(function(k) {\n      if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n    });\n  }\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect, d3_event_dragId = 0;\n  function d3_event_dragSuppress(node) {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect == null) {\n      d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n    }\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        var off = function() {\n          w.on(click, null);\n        };\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0) {\n        var window = d3_window(container);\n        if (window.scrollX || window.scrollY) {\n          svg = d3.select(\"body\").append(\"svg\").style({\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            margin: 0,\n            padding: 0,\n            border: \"none\"\n          }, \"important\");\n          var ctm = svg[0][0].getScreenCTM();\n          d3_mouse_bug44083 = !(ctm.f || ctm.e);\n          svg.remove();\n        }\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged && d3.event.target === target);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];\n    var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;\n    function interpolate(t) {\n      var s = t * S;\n      if (dr) {\n        var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      }\n      return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];\n    }\n    interpolate.duration = S * 1e3;\n    return interpolate;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    if (!d3_behavior_zoomWheel) {\n      d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n      }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return d3.event.wheelDelta;\n      }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n        return -d3.event.detail;\n      }, \"MozMousePixelScroll\");\n    }\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"interrupt.zoom\", function() {\n            zoomended(dispatch);\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: +_\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.duration = function(_) {\n      if (!arguments.length) return duration;\n      duration = +_;\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function zoomTo(that, p, l, k) {\n      that.__chart__ = {\n        x: view.x,\n        y: view.y,\n        k: view.k\n      };\n      scaleTo(Math.pow(2, k));\n      translateTo(center0 = p, l);\n      that = d3.select(that);\n      if (duration > 0) that = that.transition().duration(duration);\n      that.call(zoom.event);\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      if (!zooming++) dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      if (!--zooming) dispatch({\n        type: \"zoomend\"\n      });\n      center0 = null;\n    }\n    function mousedowned() {\n      var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged && d3.event.target === target);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0];\n            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n            d3_eventPreventDefault();\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        d3_selection_interrupt.call(that);\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)), \n      d3_selection_interrupt.call(this), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format.toLowerCase())) {\n      return rgb(color.r, color.g, color.b);\n    }\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      f: false,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  };\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now();\n    d3_timer_active = d3_timer_queueHead;\n    while (d3_timer_active) {\n      if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);\n      d3_timer_active = d3_timer_active.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.f) {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      } else {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x + pointRadius, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = xm; else x2 = xm;\n        if (below) y1 = ym; else y2 = ym;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      root.find = function(point) {\n        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n    var minDistance2 = Infinity, closestPoint;\n    (function find(node, x1, y1, x2, y2) {\n      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n      if (point = node.point) {\n        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n        if (distance2 < minDistance2) {\n          var distance = Math.sqrt(minDistance2 = distance2);\n          x0 = x - distance, y0 = y - distance;\n          x3 = x + distance, y3 = y + distance;\n          closestPoint = point;\n        }\n      }\n      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n        if (node = children[i & 3]) switch (i & 3) {\n         case 0:\n          find(node, x1, y1, xm, ym);\n          break;\n\n         case 1:\n          find(node, xm, y1, x2, ym);\n          break;\n\n         case 2:\n          find(node, x1, ym, xm, y2);\n          break;\n\n         case 3:\n          find(node, xm, ym, x2, y2);\n          break;\n        }\n      }\n    })(root, x0, y0, x3, y3);\n    return closestPoint;\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;\n    if (ta[0] != tb[0] || ta[1] != tb[1]) {\n      s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: 1,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: 3,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    } else {\n      s.push(\"\");\n    }\n    if (ra != rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(s.pop() + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(s.pop() + \"rotate(\" + rb + \")\");\n    }\n    if (wa != wb) {\n      q.push({\n        i: s.push(s.pop() + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(s.pop() + \"skewX(\" + wb + \")\");\n    }\n    if (ka[0] != kb[0] || ka[1] != kb[1]) {\n      n = s.push(s.pop() + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: n - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: n - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] != 1 || kb[1] != 1) {\n      s.push(s.pop() + \"scale(\" + kb + \")\");\n    }\n    n = q.length;\n    return function(t) {\n      var i = -1, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: (x - x0) / k\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight / (t.weight + s.weight));\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) alpha = x; else alpha = 0;\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        d3.timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, l = candidates.length, x;\n        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n    function pie(data) {\n      var n = data.length, values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), k = (da - n * pa) / d3.sum(values), index = d3.range(n), arcs = [], v;\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      index.forEach(function(i) {\n        arcs[i] = {\n          data: data[i],\n          value: v = values[i],\n          startAngle: a,\n          endAngle: a += v * k + pa,\n          padAngle: p\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(_) {\n      if (!arguments.length) return value;\n      value = _;\n      return pie;\n    };\n    pie.sort = function(_) {\n      if (!arguments.length) return sort;\n      sort = _;\n      return pie;\n    };\n    pie.startAngle = function(_) {\n      if (!arguments.length) return startAngle;\n      startAngle = _;\n      return pie;\n    };\n    pie.endAngle = function(_) {\n      if (!arguments.length) return endAngle;\n      endAngle = _;\n      return pie;\n    };\n    pie.padAngle = function(_) {\n      if (!arguments.length) return padAngle;\n      padAngle = _;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = 0;\n      root.y = 0;\n      root.dx = size[0];\n      root.dy = size[1];\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, \n      Math.floor), e;\n      return function(d) {\n        return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n      0) : (stop - start) / (domain.length - 1 + padding);\n      range = steps(start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundPoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n      0) : (stop - start) / (domain.length - 1 + padding) | 0;\n      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangeRoundPoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  function d3_zero() {\n    return 0;\n  }\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n    function arc() {\n      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n        if (!cw) p1 *= -1;\n        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n      }\n      if (r1) {\n        x0 = r1 * Math.cos(a0 + p1);\n        y0 = r1 * Math.sin(a0 + p1);\n        x1 = r1 * Math.cos(a1 - p1);\n        y1 = r1 * Math.sin(a1 - p1);\n        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n          var h1 = (a0 + a1) / 2;\n          x0 = r1 * Math.cos(h1);\n          y0 = r1 * Math.sin(h1);\n          x1 = y1 = null;\n        }\n      } else {\n        x0 = y0 = 0;\n      }\n      if (r0) {\n        x2 = r0 * Math.cos(a1 - p0);\n        y2 = r0 * Math.sin(a1 - p0);\n        x3 = r0 * Math.cos(a0 + p0);\n        y3 = r0 * Math.sin(a0 + p0);\n        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n          var h0 = (a0 + a1) / 2;\n          x2 = r0 * Math.cos(h0);\n          y2 = r0 * Math.sin(h0);\n          x3 = y3 = null;\n        }\n      } else {\n        x2 = y2 = 0;\n      }\n      if ((rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n        cr = r0 < r1 ^ cw ? 0 : 1;\n        var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n        if (x1 != null) {\n          var rc1 = Math.min(rc, (r1 - lc) / (kc + 1)), t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n          if (rc === rc1) {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n          } else {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n          }\n        } else {\n          path.push(\"M\", x0, \",\", y0);\n        }\n        if (x3 != null) {\n          var rc0 = Math.min(rc, (r0 - lc) / (kc - 1)), t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n          if (rc === rc0) {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          } else {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          }\n        } else {\n          path.push(\"L\", x2, \",\", y2);\n        }\n      } else {\n        path.push(\"M\", x0, \",\", y0);\n        if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n        path.push(\"L\", x2, \",\", y2);\n        if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n      }\n      path.push(\"Z\");\n      return path.join(\"\");\n    }\n    function circleSegment(r1, cw) {\n      return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.cornerRadius = function(v) {\n      if (!arguments.length) return cornerRadius;\n      cornerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.padRadius = function(v) {\n      if (!arguments.length) return padRadius;\n      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.padAngle = function(v) {\n      if (!arguments.length) return padAngle;\n      padAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcAuto = \"auto\";\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function d3_svg_arcSweep(x0, y0, x1, y1) {\n    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n  }\n  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(r * r * d2 - D * D), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.join(\"L\");\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return d3_svg_lineLinear(points) + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] - halfπ;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  d3_selectionPrototype.transition = function(name) {\n    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_selectionPrototype.interrupt = function(name) {\n    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n  };\n  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n  function d3_selection_interruptNS(ns) {\n    return function() {\n      var lock, active;\n      if ((lock = this[ns]) && (active = lock[lock.active])) {\n        if (--lock.count) delete lock[lock.active]; else delete this[ns];\n        lock.active += .5;\n        active.event && active.event.interrupt.call(this, this.__data__, active.index);\n      }\n    };\n  }\n  function d3_transition(groups, ns, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.namespace = ns;\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection, name) {\n    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node[ns][id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.namespace, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node[ns][id].tween.remove(name);\n    } : function(node) {\n      node[ns][id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id, ns = groups.namespace;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node[ns][id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    var ns = this.namespace;\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node[ns][id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node[ns][id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node[ns][id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      try {\n        d3_transitionInheritId = id;\n        d3_selection_each(this, function(node, i, j) {\n          d3_transitionInherit = node[ns][id];\n          type.call(node, node.__data__, i, j);\n        });\n      } finally {\n        d3_transitionInherit = inherit;\n        d3_transitionInheritId = inheritId;\n      }\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node[ns][id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = node[ns][id0];\n          d3_transitionNode(node, i, ns, id1, {\n            time: transition.time,\n            ease: transition.ease,\n            delay: transition.delay + transition.duration,\n            duration: transition.duration\n          });\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id1);\n  };\n  function d3_transitionNamespace(name) {\n    return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n  }\n  function d3_transitionNode(node, i, ns, id, inherit) {\n    var lock = node[ns] || (node[ns] = {\n      active: 0,\n      count: 0\n    }), transition = lock[id];\n    if (!transition) {\n      var time = inherit.time;\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        delay: inherit.delay,\n        duration: inherit.duration,\n        ease: inherit.ease,\n        index: i\n      };\n      inherit = null;\n      ++lock.count;\n      d3.timer(function(elapsed) {\n        var delay = transition.delay, duration, ease, timer = d3_timer_active, tweened = [];\n        timer.t = delay + time;\n        if (delay <= elapsed) return start(elapsed - delay);\n        timer.c = start;\n        function start(elapsed) {\n          if (lock.active > id) return stop();\n          var active = lock[lock.active];\n          if (active) {\n            --lock.count;\n            delete lock[lock.active];\n            active.event && active.event.interrupt.call(node, node.__data__, active.index);\n          }\n          lock.active = id;\n          transition.event && transition.event.start.call(node, node.__data__, i);\n          transition.tween.forEach(function(key, value) {\n            if (value = value.call(node, node.__data__, i)) {\n              tweened.push(value);\n            }\n          });\n          ease = transition.ease;\n          duration = transition.duration;\n          d3.timer(function() {\n            timer.c = tick(elapsed || 1) ? d3_true : tick;\n            return 1;\n          }, 0, time);\n        }\n        function tick(elapsed) {\n          if (lock.active !== id) return 1;\n          var t = elapsed / duration, e = ease(t), n = tweened.length;\n          while (n > 0) {\n            tweened[--n].call(node, e);\n          }\n          if (t >= 1) {\n            transition.event && transition.event.end.call(node, node.__data__, i);\n            return stop();\n          }\n        }\n        function stop() {\n          if (--lock.count) delete lock[id]; else delete node[ns];\n          return 1;\n        }\n      }, 0, time);\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = arguments;\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3;\n  this.d3 = d3;\n}();"
  },
  {
    "path": "third_party/ui/bower_components/d3/package.js",
    "content": "// Package metadata for Meteor.js.\n\nPackage.describe({\n  name: \"d3js:d3\", // http://atmospherejs.com/d3js/d3\n  summary: \"D3 (official): A JavaScript visualization library for HTML and SVG.\",\n  version: \"3.5.5\",\n  git: \"https://github.com/mbostock/d3.git\"\n});\n\nPackage.onUse(function(api) {\n  api.versionsFrom([\"METEOR@1.0\"]);\n  api.addFiles(\"d3.js\", \"client\");\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/d3-context-menu/.bower.json",
    "content": "{\n  \"name\": \"d3-context-menu\",\n  \"main\": [\n    \"js/d3-context-menu.js\",\n    \"css/d3-context-menu.css\"\n  ],\n  \"ignore\": [\n    \".jshintrc\",\n    \"**/*.txt\",\n    \"examples\",\n    \"README.md\"\n  ],\n  \"dependencies\": {\n    \"d3\": \"3\"\n  },\n  \"homepage\": \"https://github.com/patorjk/d3-context-menu\",\n  \"_release\": \"d2352d5fd5\",\n  \"_resolution\": {\n    \"type\": \"branch\",\n    \"branch\": \"master\",\n    \"commit\": \"d2352d5fd59e08fa33d80ffaee27338e245731c0\"\n  },\n  \"_source\": \"git://github.com/patorjk/d3-context-menu.git\",\n  \"_target\": \"*\",\n  \"_originalSource\": \"d3-context-menu\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/d3-context-menu/LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (C) 2014-present Patrick Gillespie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "third_party/ui/bower_components/d3-context-menu/bower.json",
    "content": "{\n  \"name\": \"d3-context-menu\",\n  \"version\": \"0.0.1\",\n  \"main\": [\n    \"js/d3-context-menu.js\",\n    \"css/d3-context-menu.css\"\n  ],\n  \"ignore\": [\n    \".jshintrc\",\n    \"**/*.txt\",\n    \"examples\",\n    \"README.md\"\n  ],\n  \"dependencies\": {\n    \"d3\": \"3\"\n  }\n}"
  },
  {
    "path": "third_party/ui/bower_components/d3-context-menu/css/d3-context-menu.css",
    "content": ".d3-context-menu {\n\tposition: absolute;\n\tdisplay: none;\n\tbackground-color: #f2f2f2;\n\tborder-radius: 4px;\n\n\tfont-family: Arial, sans-serif;\n\tfont-size: 14px;\n\tmin-width: 150px;\n\tborder: 1px solid #d4d4d4;\n\n\tz-index:1200;\n}\n\n.d3-context-menu ul {\n\tlist-style-type: none;\n\tmargin: 4px 0px;\n\tpadding: 0px;\n\tcursor: default;\n}\n\n.d3-context-menu ul li {\n\tpadding: 4px 16px;\n}\n\n.d3-context-menu ul li:hover {\n\tbackground-color: #4677f8;\n\tcolor: #fefefe;\n}"
  },
  {
    "path": "third_party/ui/bower_components/d3-context-menu/js/d3-context-menu.js",
    "content": "d3.contextMenu = function (menu, openCallback) {\n\n\t// create the div element that will hold the context menu\n\td3.selectAll('.d3-context-menu').data([1])\n\t\t.enter()\n\t\t.append('div')\n\t\t.attr('class', 'd3-context-menu');\n\n\t// close menu\n\td3.select('body').on('click.d3-context-menu', function() {\n\t\td3.select('.d3-context-menu').style('display', 'none');\n\t});\n\n\t// this gets executed when a contextmenu event occurs\n\treturn function(data, index) {\n\t\tvar elm = this;\n\n\t\td3.selectAll('.d3-context-menu').html('');\n\t\tvar list = d3.selectAll('.d3-context-menu').append('ul');\n\t\tlist.selectAll('li').data(menu).enter()\n\t\t\t.append('li')\n\t\t\t.html(function(d) {\n\t\t\t\treturn (typeof d.title === 'string') ? d.title : d.title(data);\n\t\t\t})\n\t\t\t.on('click', function(d, i) {\n\t\t\t\td.action(elm, data, index);\n\t\t\t\td3.select('.d3-context-menu').style('display', 'none');\n\t\t\t});\n\n\t\t// the openCallback allows an action to fire before the menu is displayed\n\t\t// an example usage would be closing a tooltip\n\t\tif (openCallback) {\n\t\t\tif (openCallback(data, index) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// display context menu\n\t\td3.select('.d3-context-menu')\n\t\t\t.style('left', (d3.event.pageX - 2) + 'px')\n\t\t\t.style('top', (d3.event.pageY - 2) + 'px')\n\t\t\t.style('display', 'block');\n\n\t\td3.event.preventDefault();\n\t\td3.event.stopPropagation();\n\t};\n};\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.bower.json",
    "content": "{\n  \"name\": \"hammerjs\",\n  \"version\": \"2.0.4\",\n  \"main\": \"hammer.js\",\n  \"ignore\": [\n    \"tests\",\n    \"src\"\n  ],\n  \"homepage\": \"https://github.com/EightMedia/hammer.js\",\n  \"_release\": \"2.0.4\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"2.0.4\",\n    \"commit\": \"7fc11efb37d6f2334ce957e26e9cf53690e10fa5\"\n  },\n  \"_source\": \"git://github.com/EightMedia/hammer.js.git\",\n  \"_target\": \"~2.0.2\",\n  \"_originalSource\": \"hammerjs\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.bowerrc",
    "content": "{\n  \"json\": \"bower.json\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.gitignore",
    "content": "# ide\n.idea\n.iml\n\n# node\nlib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n\npids\nlogs\nresults\ntests/build.js\n\nnpm-debug.log\nnode_modules\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.jscsrc",
    "content": "{\n    \"preset\": \"google\",\n    \"excludeFiles\": [\n        \"*.js\",\n        \"tests/**/assets\",\n        \"node_modules/**\"\n    ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.jshintrc",
    "content": "{\n    \"browser\": true,\n    \"curly\": true,\n    \"eqnull\": true,\n    \"expr\": true,\n    \"maxerr\": 100,\n    \"freeze\": true,\n    \"newcap\": true,\n    \"node\": true,\n    \"quotmark\": \"single\",\n    \"strict\": true,\n    \"sub\": true,\n    \"trailing\": true,\n    \"undef\": true,\n    \"unused\": true,\n    \"camelcase\": true,\n    \"indent\": 4,\n    \"validthis\": true,\n    \"globals\": {\n        \"define\": false\n    }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"0.10\"\n\nbefore_script:\n  - npm install -g grunt-cli\n\nscript:\n  - grunt test-travis"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/CHANGELOG.md",
    "content": "# Changelog\n\n### 2.0.4, 2014-09-28\n- Fix IE pointer issue. [#665](https://github.com/hammerjs/hammer.js/pull/665)\n- Fix multi-touch at different elements. [#668](https://github.com/hammerjs/hammer.js/pull/668)\n- Added experimental [single-user Touch input handler](src/input/singletouch.js). This to improve performance/ux when only a single user has to be supported. Plans are to release 2.1 with this as default, and a settings to enable the multi-user handler.\n\n### 2.0.3, 2014-09-10\n- Manager.set improvements. \n- Fix requireFailure() call in Manager.options.recognizers. \n- Make DIRECTION_ALL for pan and swipe gestures less blocking.\n- Fix Swipe recognizer threshold option.\n- Expose the Input classes.\n- Added the option `inputClass` to set the used input handler.\n\n### 2.0.2, 2014-07-26\n- Improved mouse and pointer-events input, now able to move outside the window.\n- Added the export name (`Hammer`) as an argument to the wrapper.\n- Add the option *experimental* `inputTarget` to change the element that receives the events.\n- Improved performance when only one touch being active.\n- Fixed the jumping deltaXY bug when going from single to multi-touch.\n- Improved velocity calculations.\n\n### 2.0.1, 2014-07-15\n- Fix issue when no document.body is available\n- Added pressup event for the press recognizer\n- Removed alternative for Object.create\n\n### 2.0.0, 2014-07-11\n- Full rewrite of the library.\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/CONTRIBUTING.md",
    "content": "# Contributing to Hammer.js\n\nLooking to contribute something to Hammer.js? **Here's how you can help.**\n\n\n## Reporting issues\n\nWe only accept issues that are bug reports or feature requests. Bugs must be\nisolated and reproducible problems that can be fixed within the Hammer.js.\nPlease read the following guidelines before opening any issue.\n\n1. [**Read the documentation**](https://hammerjs.github.io)\n\n2. **Search for existing issues.** We get a lot of duplicate issues, and you'd\nhelp us out a lot by first checking if someone else has reported the same issue.\nMoreover, the issue may have already been resolved with a fix available. Also\ntake a look if your problem is explained at the Wiki.\n\n3. **Create an isolated and reproducible test case.** Be sure the problem exists\nin Hammer's code with a reduced test case that should be included in each bug\nreport.\n\n4. **Include a live example.** Make use of jsFiddle or jsBin to share your\nisolated test cases. Also, a screen capture would work, with tools like LICEcap.\n\n5. **Share as much information as possible.** Include operating system and\nversion, browser and version, version of Hammer.js, customized or vanilla build,\netc. where appropriate. Also include steps to reproduce the bug.\n\n## Pull requests\n\n1. Changes must be done in `/src` files, never just the compiled files. Also, don't \ncommit the compiled files.\n\n2. Try not to pollute your pull request with unintended changes. Keep them simple\nand small\n\n3. Try to share which browsers your code has been tested in before submitting a\npull request\n\n4. Write tests for your code, these can be found in `/tests`.\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/Gruntfile.coffee",
    "content": "module.exports = (grunt) ->\n  grunt.initConfig\n    pkg: grunt.file.readJSON 'package.json'\n\n    usebanner:\n      taskName:\n        options:\n          position: 'top'\n          banner: '\n/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today(\"yyyy-mm-dd\") %>\\n\n * <%= pkg.homepage %>\\n\n *\\n\n * Copyright (c) <%= grunt.template.today(\"yyyy\") %> <%= pkg.author.name %>;\\n\n * Licensed under the <%= _.pluck(pkg.licenses, \"type\").join(\", \") %> license */'\n          linebreak: true\n        files:\n          src: ['./hammer.js','./hammer.min.js']\n\n    concat:\n      build:\n        src: [\n          'src/hammer.prefix'\n          'src/utils.js'\n          'src/input.js'\n          'src/input/*.js'\n          'src/touchaction.js'\n          'src/recognizer.js'\n          'src/recognizers/*.js'\n          'src/hammer.js'\n          'src/manager.js'\n          'src/expose.js'\n          'src/hammer.suffix']\n        dest: 'hammer.js'\n\n    uglify:\n      min:\n        options:\n          report: 'gzip'\n          sourceMap: 'hammer.min.map'\n        files:\n          'hammer.min.js': ['hammer.js']\n       # special test build that exposes everything so it's testable\n      test:\n        options:\n          wrap: \"$H\"\n          comments: 'all'\n          exportAll: true\n          mangle: false\n          beautify: true\n          compress:\n            global_defs:\n              exportName: 'Hammer'\n        files:\n          'tests/build.js': [\n            'src/utils.js'\n            'src/input.js'\n            'src/input/*.js'\n            'src/touchaction.js'\n            'src/recognizer.js'\n            'src/recognizers/*.js'\n            'src/hammer.js'\n            'src/manager.js'\n            'src/expose.js']\n\n    'string-replace':\n      version:\n        files:\n          'hammer.js': 'hammer.js'\n        options:\n          replacements: [\n              pattern: '{{PKG_VERSION}}'\n              replacement: '<%= pkg.version %>'\n            ]\n\n    jshint:\n      options:\n        jshintrc: true\n      build:\n        src: ['hammer.js']\n\n    jscs:\n      src: [\n        'src/**/*.js'\n        'tests/unit/*.js'\n      ]\n      options:\n        config: \"./.jscsrc\"\n        force: true\n\n    watch:\n      scripts:\n        files: ['src/**/*.js']\n        tasks: ['concat','string-replace','uglify','jshint','jscs']\n        options:\n          interrupt: true\n\n    connect:\n      server:\n        options:\n          hostname: \"0.0.0.0\"\n          port: 8000\n\n    qunit:\n      all: ['tests/unit/index.html']\n\n\n  # Load tasks\n  grunt.loadNpmTasks 'grunt-contrib-concat'\n  grunt.loadNpmTasks 'grunt-contrib-uglify'\n  grunt.loadNpmTasks 'grunt-contrib-qunit'\n  grunt.loadNpmTasks 'grunt-contrib-watch'\n  grunt.loadNpmTasks 'grunt-contrib-jshint'\n  grunt.loadNpmTasks 'grunt-contrib-connect'\n  grunt.loadNpmTasks 'grunt-string-replace'\n  grunt.loadNpmTasks 'grunt-banner'\n  grunt.loadNpmTasks 'grunt-jscs-checker'\n\n  # Default task(s)\n  grunt.registerTask 'default', ['connect', 'watch']\n  grunt.registerTask 'default-test', ['connect', 'uglify:test', 'watch']\n  grunt.registerTask 'build', ['concat', 'string-replace', 'uglify:min', 'usebanner', 'test']\n  grunt.registerTask 'test', ['jshint', 'jscs', 'uglify:test', 'qunit']\n  grunt.registerTask 'test-travis', ['build']\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (C) 2011-2014 by Jorik Tangelder (Eight Media)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/README.md",
    "content": "# Hammer.js 2.0 [![Build Status](https://travis-ci.org/hammerjs/hammer.js.svg)](https://travis-ci.org/hammerjs/hammer.js/)\n\nVisit [hammerjs.github.io](http://hammerjs.github.io) for documentation.\n\nYou can get the pre-build versions from the Hammer.js website, or do this by yourself running \n`npm install -g grunt-cli && npm install && grunt build`\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/bower.json",
    "content": "{\n    \"name\": \"hammerjs\",\n    \"version\": \"2.0.4\",\n    \"main\": \"hammer.js\",\n    \"ignore\": [\n        \"tests\",\n        \"src\"\n    ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/component.json",
    "content": "{\n    \"name\": \"hammerjs\",\n    \"version\": \"2.0.3\",\n    \"main\": \"hammer.js\",\n    \"scripts\": [\n      \"hammer.js\"\n    ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/hammer.js",
    "content": "/*! Hammer.JS - v2.0.4 - 2014-09-28\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2014 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge]\n * @returns {Object} dest\n */\nfunction extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nfunction merge(dest, src) {\n    return extend(dest, src, true);\n}\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        extend(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument;\n    return (doc.defaultView || doc.parentWindow);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = last.deltaX - input.deltaX;\n        var deltaY = last.deltaY - input.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y > 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) - getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.allow = true; // used by Input.TouchMouse to disable mouse events\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down, and mouse events are allowed (see the TouchMouse input)\n        if (!this.pressed || !this.allow) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        // when we're in a touch event, so  block all upcoming mouse events\n        // most mobile browser also emit mouseevents, right after touchstart\n        if (isTouch) {\n            this.mouse.allow = false;\n        } else if (isMouse && !this.mouse.allow) {\n            return;\n        }\n\n        // reset the allowMouse when we're done\n        if (inputEvent & (INPUT_END | INPUT_CANCEL)) {\n            this.mouse.allow = true;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        // not needed with native support for the touchAction property\n        if (NATIVE_TOUCH_ACTION) {\n            return;\n        }\n\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE);\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // pan-x and pan-y can be combined\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_PAN_X + ' ' + TOUCH_ACTION_PAN_Y;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.id = uniqueId();\n\n    this.manager = null;\n    this.options = merge(options || {}, this.defaults);\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        extend(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(withState) {\n            self.manager.emit(self.options.event + (withState ? stateStr(state) : ''), input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(true);\n        }\n\n        emit(); // simple 'eventName' events\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(true);\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = extend({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        this._super.emit.call(this, input);\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            this.manager.emit(this.options.event + inOut, input);\n        }\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 500, // minimal time of the pointer to be pressed\n        threshold: 5 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.65,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.velocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.velocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.velocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.direction &&\n            input.distance > this.options.threshold &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.direction);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 2, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED ) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create an manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.4';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, { enable: false }],\n        [PinchRecognizer, { enable: false }, ['rotate']],\n        [SwipeRecognizer,{ direction: DIRECTION_HORIZONTAL }],\n        [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, { event: 'doubletap', taps: 2 }, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    options = options || {};\n\n    this.options = merge(options, Hammer.defaults);\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        extend(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        var recognizers = this.recognizers;\n        recognizer = this.get(recognizer);\n        recognizers.splice(inArray(recognizers, recognizer), 1);\n\n        this.touchAction.update();\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    each(manager.options.cssProps, function(value, name) {\n        element.style[prefixed(element.style, name)] = add ? value : '';\n    });\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nextend(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\nif (typeof define == TYPE_FUNCTION && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n"
  },
  {
    "path": "third_party/ui/bower_components/hammerjs/package.json",
    "content": "{\n  \"name\": \"hammerjs\",\n  \"title\": \"Hammer.JS\",\n  \"description\": \"A javascript library for multi-touch gestures\",\n  \"version\": \"2.0.4\",\n  \"homepage\": \"http://hammerjs.github.io/\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/hammerjs/hammer.js/blob/master/LICENSE.md\"\n    }\n  ],\n  \"keywords\": [\n    \"touch\",\n    \"gestures\"\n  ],\n  \"author\": {\n    \"name\": \"Jorik Tangelder\",\n    \"email\": \"j.tangelder@gmail.com\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/hammerjs/hammer.js.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/hammerjs/hammer.js/issues\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"grunt\": \"0.4.x\",\n    \"grunt-banner\": \"^0.2.3\",\n    \"grunt-contrib-concat\": \"0.4.x\",\n    \"grunt-contrib-connect\": \"0.7.x\",\n    \"grunt-contrib-jshint\": \"0.10.x\",\n    \"grunt-contrib-qunit\": \"^0.5.1\",\n    \"grunt-contrib-uglify\": \"0.4.x\",\n    \"grunt-contrib-watch\": \"0.6.x\",\n    \"grunt-jscs-checker\": \"^0.4.1\",\n    \"grunt-string-replace\": \"^0.2.7\",\n    \"hammer-jquery\": \"git://github.com/hammerjs/jquery.hammer.js#master\",\n    \"hammer-simulator\": \"git://github.com/hammerjs/simulator#master\"\n  },\n  \"main\": \"hammer.js\",\n  \"engines\": {\n    \"node\": \">=0.8.0\"\n  },\n  \"scripts\": {\n    \"test\": \"grunt test\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/.bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.1.3\",\n  \"main\": \"dist/jquery.js\",\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"build\",\n    \"speed\",\n    \"test\",\n    \"*.md\",\n    \"AUTHORS.txt\",\n    \"Gruntfile.js\",\n    \"package.json\"\n  ],\n  \"devDependencies\": {\n    \"sizzle\": \"2.1.1-jquery.2.1.2\",\n    \"requirejs\": \"2.1.10\",\n    \"qunit\": \"1.14.0\",\n    \"sinon\": \"1.8.1\"\n  },\n  \"keywords\": [\n    \"jquery\",\n    \"javascript\",\n    \"library\"\n  ],\n  \"homepage\": \"https://github.com/jquery/jquery\",\n  \"_release\": \"2.1.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"2.1.3\",\n    \"commit\": \"8f2a9d9272d6ed7f32d3a484740ab342c02541e0\"\n  },\n  \"_source\": \"git://github.com/jquery/jquery.git\",\n  \"_target\": \"~2.1.3\",\n  \"_originalSource\": \"jquery\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/jquery/MIT-LICENSE.txt",
    "content": "Copyright 2014 jQuery Foundation and other contributors\nhttp://jquery.com/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.1.3\",\n  \"main\": \"dist/jquery.js\",\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"build\",\n    \"speed\",\n    \"test\",\n    \"*.md\",\n    \"AUTHORS.txt\",\n    \"Gruntfile.js\",\n    \"package.json\"\n  ],\n  \"devDependencies\": {\n    \"sizzle\": \"2.1.1-jquery.2.1.2\",\n    \"requirejs\": \"2.1.10\",\n    \"qunit\": \"1.14.0\",\n    \"sinon\": \"1.8.1\"\n  },\n  \"keywords\": [\n    \"jquery\",\n    \"javascript\",\n    \"library\"\n  ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/dist/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v2.1.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-18T15:11Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\n\nvar arr = [];\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"2.1.3\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\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// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\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\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\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\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\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\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\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}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\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\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\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// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\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\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\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\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\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\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\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\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\nvar data_priv = new Data();\n\nvar data_user = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\nvar strundefined = typeof undefined;\n\n\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\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\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\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\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\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\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\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\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\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\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\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\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/jsonp.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/nonce\",\n\t\"./var/rquery\",\n\t\"../ajax\"\n], function( jQuery, nonce, rquery ) {\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/load.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/parseHTML\",\n\t\"../ajax\",\n\t\"../traversing\",\n\t\"../manipulation\",\n\t\"../selector\",\n\t// Optional event/alias dependency\n\t\"../event/alias\"\n], function( jQuery ) {\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/parseJSON.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\nreturn jQuery.parseJSON;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/parseXML.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\nreturn jQuery.parseXML;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/script.js",
    "content": "define([\n\t\"../core\",\n\t\"../ajax\"\n], function( jQuery ) {\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/var/nonce.js",
    "content": "define([\n\t\"../../core\"\n], function( jQuery ) {\n\treturn jQuery.now();\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/var/rquery.js",
    "content": "define(function() {\n\treturn (/\\?/);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax/xhr.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/support\",\n\t\"../ajax\"\n], function( jQuery, support ) {\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\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\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\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\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/ajax.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\",\n\t\"./ajax/var/nonce\",\n\t\"./ajax/var/rquery\",\n\t\"./core/init\",\n\t\"./ajax/parseJSON\",\n\t\"./ajax/parseXML\",\n\t\"./deferred\"\n], function( jQuery, rnotwhite, nonce, rquery ) {\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes/attr.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"../var/strundefined\",\n\t\"../core/access\",\n\t\"./support\",\n\t\"../selector\"\n], function( jQuery, rnotwhite, strundefined, access, support ) {\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes/classes.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"../var/strundefined\",\n\t\"../data/var/data_priv\",\n\t\"../core/init\"\n], function( jQuery, rnotwhite, strundefined, data_priv ) {\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\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\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\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\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes/prop.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/access\",\n\t\"./support\"\n], function( jQuery, access, support ) {\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes/val.js",
    "content": "define([\n\t\"../core\",\n\t\"./support\",\n\t\"../core/init\"\n], function( jQuery, support ) {\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/attributes.js",
    "content": "define([\n\t\"./core\",\n\t\"./attributes/attr\",\n\t\"./attributes/prop\",\n\t\"./attributes/classes\",\n\t\"./attributes/val\"\n], function( jQuery ) {\n\n// Return jQuery for attributes-only inclusion\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/callbacks.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\"\n], function( jQuery, rnotwhite ) {\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\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\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core/access.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\nreturn access;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core/init.js",
    "content": "// Initialize a jQuery object\ndefine([\n\t\"../core\",\n\t\"./var/rsingleTag\",\n\t\"../traversing/findFilter\"\n], function( jQuery, rsingleTag ) {\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\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\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\nreturn init;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core/parseHTML.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/rsingleTag\",\n\t\"../manipulation\" // buildFragment\n], function( jQuery, rsingleTag ) {\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\nreturn jQuery.parseHTML;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core/ready.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/init\",\n\t\"../deferred\"\n], function( jQuery ) {\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core/var/rsingleTag.js",
    "content": "define(function() {\n\t// Match a standalone tag\n\treturn (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/core.js",
    "content": "define([\n\t\"./var/arr\",\n\t\"./var/slice\",\n\t\"./var/concat\",\n\t\"./var/push\",\n\t\"./var/indexOf\",\n\t\"./var/class2type\",\n\t\"./var/toString\",\n\t\"./var/hasOwn\",\n\t\"./var/support\"\n], function( arr, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) {\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"@VERSION\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\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// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\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\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/addGetHookIf.js",
    "content": "define(function() {\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\nreturn addGetHookIf;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/curCSS.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/rnumnonpx\",\n\t\"./var/rmargin\",\n\t\"./var/getStyles\",\n\t\"../selector\" // contains\n], function( jQuery, rnumnonpx, rmargin, getStyles ) {\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\nreturn curCSS;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/defaultDisplay.js",
    "content": "define([\n\t\"../core\",\n\t\"../manipulation\" // appendTo\n], function( jQuery ) {\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\nreturn defaultDisplay;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/hiddenVisibleSelectors.js",
    "content": "define([\n\t\"../core\",\n\t\"../selector\"\n], function( jQuery ) {\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/support.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/support\"\n], function( jQuery, support ) {\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/swap.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\nreturn jQuery.swap;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/var/cssExpand.js",
    "content": "define(function() {\n\treturn [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/var/getStyles.js",
    "content": "define(function() {\n\treturn function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/var/isHidden.js",
    "content": "define([\n\t\"../../core\",\n\t\"../../selector\"\n\t// css is assumed\n], function( jQuery ) {\n\n\treturn function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/var/rmargin.js",
    "content": "define(function() {\n\treturn (/^margin/);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css/var/rnumnonpx.js",
    "content": "define([\n\t\"../../var/pnum\"\n], function( pnum ) {\n\treturn new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/css.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/pnum\",\n\t\"./core/access\",\n\t\"./css/var/rmargin\",\n\t\"./css/var/rnumnonpx\",\n\t\"./css/var/cssExpand\",\n\t\"./css/var/isHidden\",\n\t\"./css/var/getStyles\",\n\t\"./css/curCSS\",\n\t\"./css/defaultDisplay\",\n\t\"./css/addGetHookIf\",\n\t\"./css/support\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./css/swap\",\n\t\"./core/ready\",\n\t\"./selector\" // contains\n], function( jQuery, pnum, access, rmargin, rnumnonpx, cssExpand, isHidden,\n\tgetStyles, curCSS, defaultDisplay, addGetHookIf, support, data_priv ) {\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/data/Data.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"./accepts\"\n], function( jQuery, rnotwhite ) {\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\n\nreturn Data;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/data/accepts.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\nreturn jQuery.acceptData;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/data/var/data_priv.js",
    "content": "define([\n\t\"../Data\"\n], function( Data ) {\n\treturn new Data();\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/data/var/data_user.js",
    "content": "define([\n\t\"../Data\"\n], function( Data ) {\n\treturn new Data();\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/data.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\",\n\t\"./core/access\",\n\t\"./data/var/data_priv\",\n\t\"./data/var/data_user\"\n], function( jQuery, rnotwhite, access, data_priv, data_user ) {\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/deferred.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/slice\",\n\t\"./callbacks\"\n], function( jQuery, slice ) {\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\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\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/deprecated.js",
    "content": "define([\n\t\"./core\",\n\t\"./traversing\"\n], function( jQuery ) {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/dimensions.js",
    "content": "define([\n\t\"./core\",\n\t\"./core/access\",\n\t\"./css\"\n], function( jQuery, access ) {\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/effects/Tween.js",
    "content": "define([\n\t\"../core\",\n\t\"../css\"\n], function( jQuery ) {\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/effects/animatedSelector.js",
    "content": "define([\n\t\"../core\",\n\t\"../selector\",\n\t\"../effects\"\n], function( jQuery ) {\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/effects.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/pnum\",\n\t\"./css/var/cssExpand\",\n\t\"./css/var/isHidden\",\n\t\"./css/defaultDisplay\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./effects/Tween\",\n\t\"./queue\",\n\t\"./css\",\n\t\"./deferred\",\n\t\"./traversing\"\n], function( jQuery, pnum, cssExpand, isHidden, defaultDisplay, data_priv ) {\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/event/ajax.js",
    "content": "define([\n\t\"../core\",\n\t\"../event\"\n], function( jQuery ) {\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/event/alias.js",
    "content": "define([\n\t\"../core\",\n\t\"../event\"\n], function( jQuery ) {\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/event/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\nreturn support;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/event.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/strundefined\",\n\t\"./var/rnotwhite\",\n\t\"./var/hasOwn\",\n\t\"./var/slice\",\n\t\"./event/support\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./data/accepts\",\n\t\"./selector\"\n], function( jQuery, strundefined, rnotwhite, hasOwn, slice, support, data_priv ) {\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/exports/amd.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/exports/global.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/strundefined\"\n], function( jQuery, strundefined ) {\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/intro.js",
    "content": "/*!\n * jQuery JavaScript Library v@VERSION\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: @DATE\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/jquery.js",
    "content": "define([\n\t\"./core\",\n\t\"./selector\",\n\t\"./traversing\",\n\t\"./callbacks\",\n\t\"./deferred\",\n\t\"./core/ready\",\n\t\"./data\",\n\t\"./queue\",\n\t\"./queue/delay\",\n\t\"./attributes\",\n\t\"./event\",\n\t\"./event/alias\",\n\t\"./manipulation\",\n\t\"./manipulation/_evalUrl\",\n\t\"./wrap\",\n\t\"./css\",\n\t\"./css/hiddenVisibleSelectors\",\n\t\"./serialize\",\n\t\"./ajax\",\n\t\"./ajax/xhr\",\n\t\"./ajax/script\",\n\t\"./ajax/jsonp\",\n\t\"./ajax/load\",\n\t\"./event/ajax\",\n\t\"./effects\",\n\t\"./effects/animatedSelector\",\n\t\"./offset\",\n\t\"./dimensions\",\n\t\"./deprecated\",\n\t\"./exports/amd\",\n\t\"./exports/global\"\n], function( jQuery ) {\n\nreturn jQuery;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/manipulation/_evalUrl.js",
    "content": "define([\n\t\"../ajax\"\n], function( jQuery ) {\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\nreturn jQuery._evalUrl;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/manipulation/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/manipulation/var/rcheckableType.js",
    "content": "define(function() {\n\treturn (/^(?:checkbox|radio)$/i);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/manipulation.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/concat\",\n\t\"./var/push\",\n\t\"./core/access\",\n\t\"./manipulation/var/rcheckableType\",\n\t\"./manipulation/support\",\n\t\"./data/var/data_priv\",\n\t\"./data/var/data_user\",\n\n\t\"./core/init\",\n\t\"./data/accepts\",\n\t\"./traversing\",\n\t\"./selector\",\n\t\"./event\"\n], function( jQuery, concat, push, access, rcheckableType, support, data_priv, data_user ) {\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\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\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\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\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/offset.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/strundefined\",\n\t\"./core/access\",\n\t\"./css/var/rnumnonpx\",\n\t\"./css/curCSS\",\n\t\"./css/addGetHookIf\",\n\t\"./css/support\",\n\n\t\"./core/init\",\n\t\"./css\",\n\t\"./selector\" // contains\n], function( jQuery, strundefined, access, rnumnonpx, curCSS, addGetHookIf, support ) {\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/outro.js",
    "content": "}));\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/queue/delay.js",
    "content": "define([\n\t\"../core\",\n\t\"../queue\",\n\t\"../effects\" // Delay is optional because of this dependency\n], function( jQuery ) {\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\nreturn jQuery.fn.delay;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/queue.js",
    "content": "define([\n\t\"./core\",\n\t\"./data/var/data_priv\",\n\t\"./deferred\",\n\t\"./callbacks\"\n], function( jQuery, data_priv ) {\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/selector-native.js",
    "content": "define([\n\t\"./core\"\n], function( jQuery ) {\n\n/*\n * Optional (non-Sizzle) selector module for custom builds.\n *\n * Note that this DOES NOT SUPPORT many documented jQuery\n * features in exchange for its smaller size:\n *\n * Attribute not equal selector\n * Positional selectors (:first; :eq(n); :odd; etc.)\n * Type selectors (:input; :checkbox; :button; etc.)\n * State-based selectors (:animated; :visible; :hidden; etc.)\n * :has(selector)\n * :not(complex selector)\n * custom selectors via Sizzle extensions\n * Leading combinators (e.g., $collection.find(\"> *\"))\n * Reliable functionality on XML fragments\n * Requiring all parts of a selector to match elements under context\n *   (e.g., $div.find(\"div > *\") now matches children of $div)\n * Matching against non-elements\n * Reliable sorting of disconnected nodes\n * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)\n *\n * If any of these are unacceptable tradeoffs, either use Sizzle or\n * customize this stub for the project's specific needs.\n */\n\nvar docElem = window.document.documentElement,\n\tselector_hasDuplicate,\n\tmatches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector,\n\tselector_sortOrder = function( a, b ) {\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\tselector_hasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ) {\n\n\t\t\t\t// Choose the first element that is related to our document\n\t\t\t\tif ( a === document || jQuery.contains(document, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === document || jQuery.contains(document, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t};\n\njQuery.extend({\n\tfind: function( selector, context, results, seed ) {\n\t\tvar elem, nodeType,\n\t\t\ti = 0;\n\n\t\tresults = results || [];\n\t\tcontext = context || document;\n\n\t\t// Same basic safeguard as Sizzle\n\t\tif ( !selector || typeof selector !== \"string\" ) {\n\t\t\treturn results;\n\t\t}\n\n\t\t// Early return if context is not an element or document\n\t\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\twhile ( (elem = seed[i++]) ) {\n\t\t\t\tif ( jQuery.find.matchesSelector(elem, selector) ) {\n\t\t\t\t\tresults.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tjQuery.merge( results, context.querySelectorAll(selector) );\n\t\t}\n\n\t\treturn results;\n\t},\n\tunique: function( results ) {\n\t\tvar elem,\n\t\t\tduplicates = [],\n\t\t\ti = 0,\n\t\t\tj = 0;\n\n\t\tselector_hasDuplicate = false;\n\t\tresults.sort( selector_sortOrder );\n\n\t\tif ( selector_hasDuplicate ) {\n\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\t\tj = duplicates.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( j-- ) {\n\t\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t},\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( (node = elem[i++]) ) {\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\treturn elem.textContent;\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\tcontains: function( a, b ) {\n\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\tbup = b && b.parentNode;\n\t\treturn a === bup || !!( bup && bup.nodeType === 1 && adown.contains(bup) );\n\t},\n\tisXMLDoc: function( elem ) {\n\t\treturn (elem.ownerDocument || elem).documentElement.nodeName !== \"HTML\";\n\t},\n\texpr: {\n\t\tattrHandle: {},\n\t\tmatch: {\n\t\t\tbool: /^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,\n\t\t\tneedsContext: /^[\\x20\\t\\r\\n\\f]*[>+~]/\n\t\t}\n\t}\n});\n\njQuery.extend( jQuery.find, {\n\tmatches: function( expr, elements ) {\n\t\treturn jQuery.find( expr, null, null, elements );\n\t},\n\tmatchesSelector: function( elem, expr ) {\n\t\treturn matches.call( elem, expr );\n\t},\n\tattr: function( elem, name ) {\n\t\treturn elem.getAttribute( name );\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/selector-sizzle.js",
    "content": "define([\n\t\"./core\",\n\t\"sizzle\"\n], function( jQuery, Sizzle ) {\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/selector.js",
    "content": "define([ \"./selector-sizzle\" ]);\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/serialize.js",
    "content": "define([\n\t\"./core\",\n\t\"./manipulation/var/rcheckableType\",\n\t\"./core/init\",\n\t\"./traversing\", // filter\n\t\"./attributes/prop\"\n], function( jQuery, rcheckableType ) {\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/sizzle/dist/sizzle.js",
    "content": "/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\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\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\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\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\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}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\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\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\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// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\n// EXPOSE\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n// Sizzle requires that there be a global window in Common-JS like environments\n} else if ( typeof module !== \"undefined\" && module.exports ) {\n\tmodule.exports = Sizzle;\n} else {\n\twindow.Sizzle = Sizzle;\n}\n// EXPOSE\n\n})( window );\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/traversing/findFilter.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/indexOf\",\n\t\"./var/rneedsContext\",\n\t\"../selector\"\n], function( jQuery, indexOf, rneedsContext ) {\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\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\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/traversing/var/rneedsContext.js",
    "content": "define([\n\t\"../../core\",\n\t\"../../selector\"\n], function( jQuery ) {\n\treturn jQuery.expr.match.needsContext;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/traversing.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/indexOf\",\n\t\"./traversing/var/rneedsContext\",\n\t\"./core/init\",\n\t\"./traversing/findFilter\",\n\t\"./selector\"\n], function( jQuery, indexOf, rneedsContext ) {\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/arr.js",
    "content": "define(function() {\n\treturn [];\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/class2type.js",
    "content": "define(function() {\n\t// [[Class]] -> type pairs\n\treturn {};\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/concat.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.concat;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/hasOwn.js",
    "content": "define([\n\t\"./class2type\"\n], function( class2type ) {\n\treturn class2type.hasOwnProperty;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/indexOf.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.indexOf;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/pnum.js",
    "content": "define(function() {\n\treturn (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/push.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.push;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/rnotwhite.js",
    "content": "define(function() {\n\treturn (/\\S+/g);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/slice.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.slice;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/strundefined.js",
    "content": "define(function() {\n\treturn typeof undefined;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/support.js",
    "content": "define(function() {\n\t// All support tests are defined in their respective modules.\n\treturn {};\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/var/toString.js",
    "content": "define([\n\t\"./class2type\"\n], function( class2type ) {\n\treturn class2type.toString;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jquery/src/wrap.js",
    "content": "define([\n\t\"./core\",\n\t\"./core/init\",\n\t\"./manipulation\", // clone\n\t\"./traversing\" // parent, contents\n], function( jQuery ) {\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/.bower.json",
    "content": "{\n  \"name\": \"jsonpath\",\n  \"homepage\": \"https://github.com/s3u/JSONPath\",\n  \"_release\": \"3f6e79e\",\n  \"_resolution\": {\n    \"type\": \"commit\",\n    \"commit\": \"3f6e79e\"\n  },\n  \"_source\": \"git://github.com/s3u/JSONPath.git\",\n  \"_target\": \"3f6e79e\",\n  \"_originalSource\": \"jsonpath\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/.gitignore",
    "content": "*.iml\n.DS_Store\n.idea\ntemp\nnode_modules\npids\nreports\ntarget\n*.log\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/.npmignore",
    "content": "node_modules\ntest\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - 0.6\n  - 0.8"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/CHANGES.md",
    "content": "## Dec 9, 2014\n* Offer new class-based API and object-based arguments\n* Version 0.11\n\n## Oct 23, 2013\n\n* Support for parent selection via `^`\n* Access current path via `@path` in test statements\n* Allowing for multi-statement evals\n* Performance improvements\n* Version 0.10\n\n## Mar 28, 2012\n\n* Support a sandbox arg to eval\n* Use vm.runInNewContext in place of eval\n* Version 0.9.0\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/README.md",
    "content": "JSONPath [![build status](https://secure.travis-ci.org/s3u/JSONPath.png)](http://travis-ci.org/s3u/JSONPath)\n========\n\nAnalyse, transform, and selectively extract data from JSON documents (and JavaScript objects).\n\nInstall\n-------\n    \n    npm install JSONPath\n\nUsage\n-----\n\nIn node.js:\n\n```js\nvar JSONPath = require('JSONPath');\nJSONPath({json: obj, path: path});\n```\n\nFor browser usage you can directly include `lib/jsonpath.js`, no browserify\nmagic necessary:\n\n```html\n<script src=\"lib/jsonpath.js\"></script>\n<script>\n    JSONPath({json: obj, path: path});\n</script>\n```\n\nExamples\n--------\n\nGiven the following JSON, taken from http://goessner.net/articles/JsonPath/ :\n\n```json\n{\n  \"store\": {\n    \"book\": [\n      {\n        \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      {\n        \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n}\n```\n\n\nXPath               | JSONPath               | Result\n------------------- | ---------------------- | -------------------------------------\n/store/book/author\t| $.store.book[*].author | the authors of all books in the store \n//author            | $..author              | all authors \n/store/*            | $.store.*              | all things in store, which are some books and a red bicycle.\n/store//price       | $.store..price         | the price of everything in the store.\n//book[3]           | $..book[2]             | the third book\n//book[last()]      | $..book[(@.length-1)]  | the last book in order.\n                    | $..book[-1:]           |\n//book[position()<3]| $..book[0,1]           | the first two books\n                    | $..book[:2]            | \n//book[isbn]        | $..book[?(@.isbn)]     | filter all books with isbn number\n//book[price<10]    | $..book[?(@.price<10)] | filter all books cheapier than 10\n//*[price>19]/..    | $..[?(@.price>19)]^    | categories with things more expensive than 19\n//*                 | $..*                   | all Elements in XML document. All members of JSON structure.\n\nDevelopment\n-----------\n\nRunning the tests on node: `npm test`. For in-browser tests:\n\n* Ensure that nodeunit is browser-compiled: `cd node_modules/nodeunit; make browser;`\n* Serve the js/html files:\n\n```sh\n    node -e \"require('http').createServer(function(req,res) { \\\n        var s = require('fs').createReadStream('.' + req.url); \\\n        s.pipe(res); s.on('error', function() {}); }).listen(8082);\"\n```\n* To run the tests visit [http://localhost:8082/test/test.html]().\n\n\nLicense\n-------\n\n[MIT License](http://www.opensource.org/licenses/mit-license.php).\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/lib/jsonpath.js",
    "content": "/*global module, exports, require*/\r\n/*jslint vars:true, evil:true*/\r\n/* JSONPath 0.8.0 - XPath for JSON\r\n *\r\n * Copyright (c) 2007 Stefan Goessner (goessner.net)\r\n * Licensed under the MIT (MIT-LICENSE.txt) licence.\r\n */\r\n\r\n(function (require) {'use strict';\r\n\r\n// Keep compatibility with old browsers\r\nif (!Array.isArray) {\r\n    Array.isArray = function (vArg) {\r\n        return Object.prototype.toString.call(vArg) === '[object Array]';\r\n    };\r\n}\r\n\r\n// Make sure to know if we are in real node or not (the `require` variable\r\n// could actually be require.js, for example.\r\nvar isNode = typeof module !== 'undefined' && !!module.exports;\r\n\r\nvar vm = isNode ?\r\n    require('vm') : {\r\n        runInNewContext: function (expr, context) {\r\n            return eval(Object.keys(context).reduce(function (s, vr) {\r\n                return 'var ' + vr + '=' + JSON.stringify(context[vr]) + ';' + s;\r\n            }, expr));\r\n        }\r\n    };\r\n\r\nvar cache = {};\r\n\r\nfunction push (arr, elem) {arr = arr.slice(); arr.push(elem); return arr;}\r\nfunction unshift (elem, arr) {arr = arr.slice(); arr.unshift(elem); return arr;}\r\n\r\nfunction JSONPath (opts, obj, expr) {\r\n    if (!(this instanceof JSONPath)) { // Make \"new\" optional\r\n        return new JSONPath(opts, obj, expr);\r\n    }\r\n\r\n    opts = opts || {};\r\n    this.resultType = (opts.resultType && opts.resultType.toLowerCase()) || 'value';\r\n    this.flatten = opts.flatten || false;\r\n    this.wrap = opts.hasOwnProperty('wrap') ? opts.wrap : true;\r\n    this.sandbox = opts.sandbox || {};\r\n\r\n    if (opts.autostart !== false) {\r\n        return this.evaluate(obj || opts.json, expr || opts.path);\r\n    }\r\n}\r\n\r\n// PUBLIC METHODS\r\n\r\nJSONPath.prototype.evaluate = function (obj, expr) {\r\n    var self = this;\r\n    this.obj = obj;\r\n    if (expr && obj && (this.resultType === 'value' || this.resultType === 'path')) {\r\n        var exprList = this._normalize(expr);\r\n        if (exprList[0] === '$' && exprList.length > 1) {exprList.shift();}\r\n        var result = this._trace(exprList, obj, ['$']);\r\n        result = result.filter(function (ea) { return ea && !ea.isParentSelector; });\r\n        if (!result.length) {return this.wrap ? [] : false;}\r\n        if (result.length === 1 && !this.wrap && !Array.isArray(result[0].value)) {return result[0][this.resultType] || false;}\r\n        return result.reduce(function (result, ea) {\r\n            var valOrPath = ea[self.resultType];\r\n            if (self.resultType === 'path') {valOrPath = self._asPath(valOrPath);}\r\n            if (self.flatten && Array.isArray(valOrPath)) {\r\n                result = result.concat(valOrPath);\r\n            } else {\r\n                result.push(valOrPath);\r\n            }\r\n            return result;\r\n        }, []);\r\n    }\r\n};\r\n\r\n// PRIVATE METHODS\r\n\r\nJSONPath.prototype._normalize = function (expr) {\r\n    if (cache[expr]) {return cache[expr];}\r\n    var subx = [];\r\n    var normalized = expr.replace(/[\\['](\\??\\(.*?\\))[\\]']/g, function ($0, $1) {return '[#' + (subx.push($1) - 1) + ']';})\r\n                    .replace(/'?\\.'?|\\['?/g, ';')\r\n                    .replace(/(?:;)?(\\^+)(?:;)?/g, function (_, ups) {return ';' + ups.split('').join(';') + ';';})\r\n                    .replace(/;;;|;;/g, ';..;')\r\n                    .replace(/;$|'?\\]|'$/g, '');\r\n    var exprList = normalized.split(';').map(function (expr) {\r\n        var match = expr.match(/#([0-9]+)/);\r\n        return !match || !match[1] ? expr : subx[match[1]];\r\n    });\r\n    cache[expr] = exprList;\r\n    return cache[expr];\r\n};\r\n\r\nJSONPath.prototype._asPath = function (path) {\r\n    var i, n, x = path, p = '$';\r\n    for (i = 1, n = x.length; i < n; i++) {\r\n        p += /^[0-9*]+$/.test(x[i]) ? ('[' + x[i] + ']') : (\"['\" + x[i] + \"']\");\r\n    }\r\n    return p;\r\n};\r\n\r\nJSONPath.prototype._trace = function (expr, val, path) {\r\n    // No expr to follow? return path and value as the result of this trace branch\r\n    var self = this;\r\n    if (!expr.length) {return [{path: path, value: val}];}\r\n\r\n    var loc = expr[0], x = expr.slice(1);\r\n    // The parent sel computation is handled in the frame above using the\r\n    // ancestor object of val\r\n    if (loc === '^') {return path.length ? [{path: path.slice(0, -1), expr: x, isParentSelector: true}] : [];}\r\n\r\n    // We need to gather the return value of recursive trace calls in order to\r\n    // do the parent sel computation.\r\n    var ret = [];\r\n    function addRet (elems) {ret = ret.concat(elems);}\r\n\r\n    if (val && val.hasOwnProperty(loc)) { // simple case, directly follow property\r\n        addRet(this._trace(x, val[loc], push(path, loc)));\r\n    }\r\n    else if (loc === '*') { // any property\r\n        this._walk(loc, x, val, path, function (m, l, x, v, p) {\r\n            addRet(self._trace(unshift(m, x), v, p));\r\n        });\r\n    }\r\n    else if (loc === '..') { // all child properties\r\n        addRet(this._trace(x, val, path));\r\n        this._walk(loc, x, val, path, function (m, l, x, v, p) {\r\n            if (typeof v[m] === 'object') {\r\n                addRet(self._trace(unshift('..', x), v[m], push(p, m)));\r\n            }\r\n        });\r\n    }\r\n    else if (loc[0] === '(') { // [(expr)]\r\n        addRet(this._trace(unshift(this._eval(loc, val, path[path.length], path), x), val, path));\r\n    }\r\n    else if (loc.indexOf('?(') === 0) { // [?(expr)]\r\n        this._walk(loc, x, val, path, function (m, l, x, v, p) {\r\n            if (self._eval(l.replace(/^\\?\\((.*?)\\)$/, '$1'), v[m], m, path)) {\r\n                addRet(self._trace(unshift(m, x), v, p));\r\n            }\r\n        });\r\n    }\r\n    else if (loc.indexOf(',') > -1) { // [name1,name2,...]\r\n        var parts, i;\r\n        for (parts = loc.split(','), i = 0; i < parts.length; i++) {\r\n            addRet(this._trace(unshift(parts[i], x), val, path));\r\n        }\r\n    }\r\n    else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) { // [start:end:step]  Python slice syntax\r\n        addRet(this._slice(loc, x, val, path));\r\n    }\r\n\r\n    // We check the resulting values for parent selections. For parent\r\n    // selections we discard the value object and continue the trace with the\r\n    // current val object\r\n    return ret.reduce(function (all, ea) {\r\n        return all.concat(ea.isParentSelector ? self._trace(ea.expr, val, ea.path) : [ea]);\r\n    }, []);\r\n};\r\n\r\nJSONPath.prototype._walk = function (loc, expr, val, path, f) {\r\n    var i, n, m;\r\n    if (Array.isArray(val)) {\r\n        for (i = 0, n = val.length; i < n; i++) {\r\n            f(i, loc, expr, val, path);\r\n        }\r\n    }\r\n    else if (typeof val === 'object') {\r\n        for (m in val) {\r\n            if (val.hasOwnProperty(m)) {\r\n                f(m, loc, expr, val, path);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nJSONPath.prototype._slice = function (loc, expr, val, path) {\r\n    if (!Array.isArray(val)) {return;}\r\n    var i,\r\n        len = val.length, parts = loc.split(':'),\r\n        start = (parts[0] && parseInt(parts[0], 10)) || 0,\r\n        end = (parts[1] && parseInt(parts[1], 10)) || len,\r\n        step = (parts[2] && parseInt(parts[2], 10)) || 1;\r\n    start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start);\r\n    end    = (end < 0)    ? Math.max(0, end + len) : Math.min(len, end);\r\n    var ret = [];\r\n    for (i = start; i < end; i += step) {\r\n        ret = ret.concat(this._trace(unshift(i, expr), val, path));\r\n    }\r\n    return ret;\r\n};\r\n\r\nJSONPath.prototype._eval = function (code, _v, _vname, path) {\r\n    if (!this.obj || !_v) {return false;}\r\n    if (code.indexOf('@path') > -1) {\r\n        this.sandbox._path = this._asPath(path.concat([_vname]));\r\n        code = code.replace(/@path/g, '_path');\r\n    }\r\n    if (code.indexOf('@') > -1) {\r\n        this.sandbox._v = _v;\r\n        code = code.replace(/@/g, '_v');\r\n    }\r\n    try {\r\n        return vm.runInNewContext(code, this.sandbox);\r\n    }\r\n    catch(e) {\r\n        console.log(e);\r\n        throw new Error('jsonPath: ' + e.message + ': ' + code);\r\n    }\r\n};\r\n\r\n// For backward compatibility (deprecated)\r\nJSONPath.eval = function (obj, expr, opts) {\r\n    return new JSONPath(opts, obj, expr);\r\n};\r\n\r\nif (typeof module === 'undefined') {\r\n    window.jsonPath = { // Deprecated\r\n        eval: JSONPath.eval\r\n    };\r\n    window.JSONPath = JSONPath;\r\n}\r\nelse {\r\n    module.exports = JSONPath;\r\n}\r\n\r\n}(typeof require === 'undefined' ? null : require));\r\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/package.json",
    "content": "{\n    \"author\": \"Stefan Goessner\",\n    \"name\": \"JSONPath\",\n    \"description\": \"A JS implementation of JSONPath\",\n    \"contributors\": [\n        {\n            \"name\": \"Prof. Gössner\",\n            \"email\": \"stefan.goessner@fh-dortmund.de\"\n        },\n        {\n            \"name\": \"Subbu Allamaraju\",\n            \"email\": \"subbu@subbu.org\"\n        },\n        {\n            \"name\": \"Mike Brevoort\",\n            \"email\": \"mike@brevoort.com\"\n        },\n        {\n            \"name\": \"Robert Krahn\",\n            \"email\": \"robert.krahn@gmail.com\"\n        }\n    ],\n    \"version\": \"0.11.0\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git://github.com/s3u/JSONPath.git\"\n    },\n    \"main\": \"./lib/jsonpath\",\n    \"dependencies\": {},\n    \"devDependencies\": {\n        \"nodeunit\": \"*\"\n    },\n    \"scripts\": {\"test\": \"node_modules/nodeunit/bin/nodeunit test/test.*.js\"}\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.arr.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\nvar json = {\n    \"store\": {\n        \"book\": { \"category\": \"reference\",\n            \"author\": \"Nigel Rees\",\n            \"title\": \"Sayings of the Century\",\n            \"price\": [8.95, 8.94, 8.93]\n        },\n        \"books\": [\n            { \"category\": \"reference\",\n                \"author\": \"Nigel Rees\",\n                \"title\": \"Sayings of the Century\",\n                \"price\": [8.95, 8.94, 8.93]\n            }\n        ]\n    }\n};\n\nmodule.exports = testCase({\n    'get single': function (test) {\n        var expected = json.store.book;\n        var result = JSONPath({json: json, path: 'store.book', flatten: true, wrap: false});\n        test.deepEqual(expected, result);\n        test.done();\n    },\n\n    'get arr': function (test) {\n        var expected = json.store.books;\n        var result = JSONPath({json: json, path: 'store.books', flatten: true, wrap: false});\n        test.deepEqual(expected, result);\n        test.done();\n    }\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.at_and_dollar.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\n\nvar t1 = {\n  simpleString: \"simpleString\",\n  \"@\" : \"@asPropertyName\",\n  \"$\" : \"$asPropertyName\",\n  \"a$a\": \"$inPropertyName\",\n  \"$\": {\n    \"@\": \"withboth\",\n  },\n  a: {\n    b: {\n      c: \"food\"\n    }\n  }\n};\n  \n\nmodule.exports = testCase({\n    \n\n    // ============================================================================    \n    'test undefined, null': function(test) {\n    // ============================================================================    \n        test.expect(5);\n        test.equal(undefined, JSONPath({json: undefined, path: 'foo'}));\n        test.equal(null, JSONPath({json: null, path: 'foo'}));\n        test.equal(undefined, JSONPath({json: {}, path: 'foo'})[0]);\n        test.equal(undefined, JSONPath({json: { a: 'b' }, path: 'foo'})[0]);\n        test.equal(undefined, JSONPath({json: { a: 'b' }, path: 'foo'})[100]);\n        test.done();\n    },\n\n    \n    // ============================================================================    \n    'test $ and @': function(test) {\n    // ============================================================================    \n        test.expect(7);\n        test.equal(t1['$'],   JSONPath({json: t1, path: '\\$'})[0]);\n        test.equal(t1['$'],   JSONPath({json: t1, path: '$'})[0]);\n        test.equal(t1['a$a'], JSONPath({json: t1, path: 'a$a'})[0]);\n        test.equal(t1['@'],   JSONPath({json: t1, path: '\\@'})[0]);\n        test.equal(t1['@'],   JSONPath({json: t1, path: '@'})[0]);\n        test.equal(t1['$']['@'], JSONPath({json: t1, path: '$.$.@'})[0]);\n        test.equal(undefined, JSONPath({json: t1, path: '\\@'})[1]);\n        \n        test.done();\n    }\n    \n});\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.eval.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\nvar json = {\n    \"store\": {\n        \"book\": {\n            \"category\": \"reference\",\n            \"author\": \"Nigel Rees\",\n            \"title\": \"Sayings of the Century\",\n            \"price\": [8.95, 8.94]\n        },\n        \"books\": [{\n            \"category\": \"fiction\",\n            \"author\": \"Evelyn Waugh\",\n            \"title\": \"Sword of Honour\",\n            \"price\": [10.99, 12.29]\n        }, {\n            \"category\": \"fiction\",\n            \"author\": \"Herman Melville\",\n            \"title\": \"Moby Dick\",\n            \"isbn\": \"0-553-21311-3\",\n            \"price\": [8.99, 6.95]\n        }]\n    }\n};\n\n\nmodule.exports = testCase({\n    'multi statement eval': function (test) {\n        var expected = json.store.books[0];\n        var selector = '$..[?('\n                     + 'var sum = @.price && @.price[0]+@.price[1];'\n                     + 'sum > 20;)]'\n        var result = JSONPath({json: json, path: selector, wrap: false});\n        test.deepEqual(expected, result);\n        test.done();\n    },\n\n    'accessing current path': function (test) {\n        var expected = json.store.books[1];\n        var result = JSONPath({json: json, path: \"$..[?(@path==\\\"$['store']['books'][1]\\\")]\", wrap: false});\n        test.deepEqual(expected, result);\n        test.done();\n    }\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.examples.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\n// tests based on examples at http://goessner.net/articles/JsonPath/\n\nvar json = {\"store\": {\n    \"book\": [\n      { \"category\": \"reference\",\n        \"author\": \"Nigel Rees\",\n        \"title\": \"Sayings of the Century\",\n        \"price\": 8.95\n      },\n      { \"category\": \"fiction\",\n        \"author\": \"Evelyn Waugh\",\n        \"title\": \"Sword of Honour\",\n        \"price\": 12.99\n      },\n      { \"category\": \"fiction\",\n        \"author\": \"Herman Melville\",\n        \"title\": \"Moby Dick\",\n        \"isbn\": \"0-553-21311-3\",\n        \"price\": 8.99\n      },\n      { \"category\": \"fiction\",\n        \"author\": \"J. R. R. Tolkien\",\n        \"title\": \"The Lord of the Rings\",\n        \"isbn\": \"0-395-19395-8\",\n        \"price\": 22.99\n      }\n    ],\n    \"bicycle\": {\n      \"color\": \"red\",\n      \"price\": 19.95\n    }\n  }\n};\n\n\nmodule.exports = testCase({\n\n    // ============================================================================\n    'wildcards': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[0].author, books[1].author, books[2].author, books[3].author];\n        var result = JSONPath({json: json, path: '$.store.book[*].author'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'all properties, entire tree': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[0].author, books[1].author, books[2].author, books[3].author];\n        var result = JSONPath({json: json, path: '$..author'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'all sub properties, single level': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var expected = [json.store.book, json.store.bicycle];\n        var result = JSONPath({json: json, path: '$.store.*'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'all sub properties, entire tree': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[0].price, books[1].price, books[2].price, books[3].price, json.store.bicycle.price];\n        var result = JSONPath({json: json, path: '$.store..price'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'n property of entire tree': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[2]];\n        var result = JSONPath({json: json, path: '$..book[2]'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'last property of entire tree': function(test) {\n    // ============================================================================\n        test.expect(2);\n        var books = json.store.book;\n        var expected = [books[3]];\n        var result = JSONPath({json: json, path: '$..book[(@.length-1)]'});\n        test.deepEqual(expected, result);\n\n        result = JSONPath({json: json, path: '$..book[-1:]'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'range of property of entire tree': function(test) {\n    // ============================================================================\n        test.expect(2);\n        var books = json.store.book;\n        var expected = [books[0], books[1]];\n        var result = JSONPath({json: json, path: '$..book[0,1]'});\n        test.deepEqual(expected, result);\n\n        result = JSONPath({json: json, path: '$..book[:2]'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'filter all properties if sub property exists, of entire tree': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[2], books[3]];\n        var result = JSONPath({json: json, path: '$..book[?(@.isbn)]'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'filter all properties if sub property greater than of entire tree': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[0], books[2]];\n        var result = JSONPath({json: json, path: '$..book[?(@.price<10)]'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    },\n\n    // ============================================================================\n    'all properties of a JSON structure': function(test) {\n    // ============================================================================\n        // test.expect(1);\n        var expected = [\n          json.store,\n          json.store.book,\n          json.store.bicycle,\n        ];\n        json.store.book.forEach(function(book) { expected.push(book); });\n        json.store.book.forEach(function(book) { Object.keys(book).forEach(function(p) { expected.push(book[p]); })});\n        expected.push(json.store.bicycle.color);\n        expected.push(json.store.bicycle.price);\n\n        var result = JSONPath({json: json, path: '$..*'});\n        test.deepEqual(expected, result);\n\n        test.done();\n    }\n\n\n\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"utf-8\" />\n        <title>JSONPath Tests</title>\n        <link rel=\"stylesheet\" href=\"../node_modules/nodeunit/dist/browser/nodeunit.css\" type=\"text/css\" />\n        <script src=\"../node_modules/nodeunit/dist/browser/nodeunit.js\"></script>\n        <script src=\"../lib/jsonpath.js\"></script>\n        <script>\n            /*jslint nomen: true, white: true, browser:true, plusplus: true, evil:true*/\n            /*global nodeunit, JSONPath, ActiveXObject*/\n            // helper to get all the test cases\n            'use strict';\n            var suites = [], _testCase = nodeunit.testCase;\n            nodeunit.testCase = function(tc) {\n                suites.push(tc);\n                return _testCase(tc);\n            };\n            // stubs to load nodejs tests\n            function require(path) {\n                if (path === 'nodeunit') {return nodeunit;}\n                if (path.match(/^\\.\\.\\/?$/)) {return JSONPath;}\n            }\n            var module = {exports: {}};\n\n\n            // synchronous load function for JS code, uses XMLHttpRequest abstraction from\n            // http://www.quirksmode.org/js/xmlhttp.html\n            // Since the tests are written in node.js style we need to wrap their code into\n            // a function, otherwise they would pollute the global NS and interfere with each\n            // other\n            function get(url, callback) {\n                function createXMLHTTPObject() {\n                    var i, XMLHttpFactories = [\n                    \tfunction () {return new XMLHttpRequest();},\n                    \tfunction () {return new ActiveXObject('Msxml2.XMLHTTP');},\n                    \tfunction () {return new ActiveXObject('Msxml3.XMLHTTP');},\n                    \tfunction () {return new ActiveXObject('Microsoft.XMLHTTP');}];\n                \tfor (i = 0; i < XMLHttpFactories.length; i++) {\n                \t\ttry {return XMLHttpFactories[i]();}\n                        catch (ignore) {}\n                    }\n                \treturn false;\n                }\n                function sendRequest(url,callback) {\n                \tvar req = createXMLHTTPObject();\n                \treq.open('GET', url, false /*sync*/);\n                \treq.onreadystatechange = function () { if (req.readyState === 4) { callback(req); } };\n                \tif (req.readyState !== 4) {req.send();}\n                }\n                sendRequest(url, callback);\n            }\n            function loadJS(url) { get(url, function(req) { new Function(req.responseText)(); });}\n        </script>\n    </head>\n    <body>\n        <h1 id=\"nodeunit-header\">JSONPath Tests</h1>\n        <script>\n            loadJS('test.arr.js');\n            loadJS('test.at_and_dollar.js');\n            loadJS('test.eval.js');\n            loadJS('test.examples.js');\n            loadJS('test.intermixed.arr.js');\n            loadJS('test.parent-selector.js');\n            nodeunit.run(suites);\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.intermixed.arr.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\n// tests based on examples at http://goessner.net/articles/JsonPath/\n\nvar json = {\"store\":{\n    \"book\":[\n        { \"category\":\"reference\",\n            \"author\":\"Nigel Rees\",\n            \"title\":\"Sayings of the Century\",\n            \"price\":[8.95, 8.94, 8.93]\n        },\n        { \"category\":\"fiction\",\n            \"author\":\"Evelyn Waugh\",\n            \"title\":\"Sword of Honour\",\n            \"price\":12.99\n        },\n        { \"category\":\"fiction\",\n            \"author\":\"Herman Melville\",\n            \"title\":\"Moby Dick\",\n            \"isbn\":\"0-553-21311-3\",\n            \"price\":8.99\n        },\n        { \"category\":\"fiction\",\n            \"author\":\"J. R. R. Tolkien\",\n            \"title\":\"The Lord of the Rings\",\n            \"isbn\":\"0-395-19395-8\",\n            \"price\":22.99\n        }\n    ],\n    \"bicycle\":{\n        \"color\":\"red\",\n        \"price\":19.95\n    }\n}\n};\n\n\nmodule.exports = testCase({\n\n    // ============================================================================\n    'all sub properties, entire tree': function (test) {\n        // ============================================================================\n        test.expect(1);\n        var books = json.store.book;\n        var expected = [books[1].price, books[2].price, books[3].price, json.store.bicycle.price];\n        expected = books[0].price.concat(expected);\n        var result = JSONPath({json: json, path: '$.store..price', flatten: true});\n        test.deepEqual(expected, result);\n\n        test.done();\n    }\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/jsonpath/test/test.parent-selector.js",
    "content": "var JSONPath = require('../'),\n    testCase = require('nodeunit').testCase\n\nvar json = {\n    \"name\": \"root\",\n    \"children\": [\n        {\"name\": \"child1\", \"children\": [{\"name\": \"child1_1\"},{\"name\": \"child1_2\"}]},\n        {\"name\": \"child2\", \"children\": [{\"name\": \"child2_1\"}]},\n        {\"name\": \"child3\", \"children\": [{\"name\": \"child3_1\"}, {\"name\": \"child3_2\"}]}\n    ]\n};\n\n\nmodule.exports = testCase({\n\n    // ============================================================================\n    'simple parent selection': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var result = JSONPath({json: json, path: '$.children[0]^', flatten: true});\n        test.deepEqual(json.children, result);\n        test.done();\n    },\n\n    // ============================================================================\n    'parent selection with multiple matches': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var expected = [json.children,json.children];\n        var result = JSONPath({json: json, path: '$.children[1:3]^'});\n        test.deepEqual(expected, result);\n        test.done();\n    },\n\n    // ============================================================================\n    'select sibling via parent': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var expected = [{\"name\": \"child3_2\"}];\n        var result = JSONPath({json: json, path: '$..[?(@.name && @.name.match(/3_1$/))]^[?(@.name.match(/_2$/))]'});\n        test.deepEqual(expected, result);\n        test.done();\n    },\n\n    // ============================================================================\n    'parent parent parent': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var expected = json.children[0].children;\n        var result = JSONPath({json: json, path: '$..[?(@.name && @.name.match(/1_1$/))].name^^', flatten: true});\n        test.deepEqual(expected, result);\n        test.done();\n    },\n\n    // ============================================================================\n    'no such parent': function(test) {\n    // ============================================================================\n        test.expect(1);\n        var result = JSONPath({json: json, path: 'name^^'});\n        test.deepEqual([], result);\n        test.done();\n    }\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/lodash/.bower.json",
    "content": "{\n  \"name\": \"lodash\",\n  \"version\": \"2.4.1\",\n  \"main\": \"dist/lodash.compat.js\",\n  \"ignore\": [\n    \".*\",\n    \"*.custom.*\",\n    \"*.template.*\",\n    \"*.map\",\n    \"*.md\",\n    \"/*.min.*\",\n    \"/lodash.js\",\n    \"index.js\",\n    \"component.json\",\n    \"package.json\",\n    \"doc\",\n    \"modularize\",\n    \"node_modules\",\n    \"perf\",\n    \"test\",\n    \"vendor\"\n  ],\n  \"homepage\": \"https://github.com/lodash/lodash\",\n  \"_release\": \"2.4.1\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"2.4.1\",\n    \"commit\": \"e231b6c48811b0bfc2ace842dea636b2ede7f337\"\n  },\n  \"_source\": \"git://github.com/lodash/lodash.git\",\n  \"_target\": \"~2.4.1\",\n  \"_originalSource\": \"lodash\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/lodash/LICENSE.txt",
    "content": "Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\nBased on Underscore.js 1.5.2, copyright 2009-2013 Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "third_party/ui/bower_components/lodash/bower.json",
    "content": "{\n  \"name\": \"lodash\",\n  \"version\": \"2.4.1\",\n  \"main\": \"dist/lodash.compat.js\",\n  \"ignore\": [\n    \".*\",\n    \"*.custom.*\",\n    \"*.template.*\",\n    \"*.map\",\n    \"*.md\",\n    \"/*.min.*\",\n    \"/lodash.js\",\n    \"index.js\",\n    \"component.json\",\n    \"package.json\",\n    \"doc\",\n    \"modularize\",\n    \"node_modules\",\n    \"perf\",\n    \"test\",\n    \"vendor\"\n  ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/lodash/dist/lodash.compat.js",
    "content": "/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\n * Build: `lodash -o ./dist/lodash.compat.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <http://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used internally to indicate various things */\n  var indicatorObject = {};\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to fix the JScript [[DontEnum]] bug */\n  var shadowedProps = [\n    'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n    'toLocaleString', 'toString', 'valueOf'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      errorClass = '[object Error]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used as the data object for `iteratorTemplate` */\n  var iteratorData = {\n    'args': '',\n    'array': null,\n    'bottom': '',\n    'firstArg': '',\n    'init': '',\n    'keys': null,\n    'loop': '',\n    'shadowedProps': null,\n    'support': null,\n    'top': '',\n    'useHas': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Checks if `value` is a DOM node in IE < 9.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a DOM node, else `false`.\n   */\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var errorProto = Error.prototype,\n        objectProto = Object.prototype,\n        stringProto = String.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /** Used to avoid iterating non-enumerable properties in IE < 9 */\n    var nonEnumProps = {};\n    nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n    nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n    nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n    nonEnumProps[objectClass] = { 'constructor': true };\n\n    (function() {\n      var length = shadowedProps.length;\n      while (length--) {\n        var key = shadowedProps[length];\n        for (var className in nonEnumProps) {\n          if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) {\n            nonEnumProps[className][key] = false;\n          }\n        }\n      }\n    }());\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    (function() {\n      var ctor = function() { this.x = 1; },\n          object = { '0': 1, 'length': 1 },\n          props = [];\n\n      ctor.prototype = { 'valueOf': 1, 'y': 1 };\n      for (var key in new ctor) { props.push(key); }\n      for (key in arguments) { }\n\n      /**\n       * Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.argsClass = toString.call(arguments) == argsClass;\n\n      /**\n       * Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.argsObject = arguments.constructor == Object && !(arguments instanceof Array);\n\n      /**\n       * Detect if `name` or `message` properties of `Error.prototype` are\n       * enumerable by default. (IE < 9, Safari < 5.1)\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n      /**\n       * Detect if `prototype` properties are enumerable by default.\n       *\n       * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n       * (if the prototype or a property on the prototype has been set)\n       * incorrectly sets a function's `prototype` property [[Enumerable]]\n       * value to `true`.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n      /**\n       * Detect if functions can be decompiled by `Function#toString`\n       * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n      /**\n       * Detect if `Function#name` is supported (all but IE).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcNames = typeof Function.name == 'string';\n\n      /**\n       * Detect if `arguments` object indexes are non-enumerable\n       * (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.nonEnumArgs = key != 0;\n\n      /**\n       * Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n       *\n       * In IE < 9 an objects own properties, shadowing non-enumerable ones, are\n       * made non-enumerable as well (a.k.a the JScript [[DontEnum]] bug).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.nonEnumShadows = !/valueOf/.test(props);\n\n      /**\n       * Detect if own properties are iterated after inherited properties (all but IE < 9).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.ownLast = props[0] != 'x';\n\n      /**\n       * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly.\n       *\n       * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`\n       * and `splice()` functions that fail to remove the last element, `value[0]`,\n       * of array-like objects even though the `length` property is set to `0`.\n       * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`\n       * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]);\n\n      /**\n       * Detect lack of support for accessing string characters by index.\n       *\n       * IE < 8 can't access characters by index and IE 8 can only access\n       * characters by index on string literals.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';\n\n      /**\n       * Detect if a DOM node's [[Class]] is resolvable (all but IE < 9)\n       * and that the JS engine errors when attempting to coerce an object to\n       * a string without a `toString` function.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      try {\n        support.nodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n      } catch(e) {\n        support.nodeClass = true;\n      }\n    }(1));\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The template used to create iterator functions.\n     *\n     * @private\n     * @param {Object} data The data object used to populate the text.\n     * @returns {string} Returns the interpolated text.\n     */\n    var iteratorTemplate = function(obj) {\n\n      var __p = 'var index, iterable = ' +\n      (obj.firstArg) +\n      ', result = ' +\n      (obj.init) +\n      ';\\nif (!iterable) return result;\\n' +\n      (obj.top) +\n      ';';\n       if (obj.array) {\n      __p += '\\nvar length = iterable.length; index = -1;\\nif (' +\n      (obj.array) +\n      ') {  ';\n       if (support.unindexedChars) {\n      __p += '\\n  if (isString(iterable)) {\\n    iterable = iterable.split(\\'\\')\\n  }  ';\n       }\n      __p += '\\n  while (++index < length) {\\n    ' +\n      (obj.loop) +\n      ';\\n  }\\n}\\nelse {  ';\n       } else if (support.nonEnumArgs) {\n      __p += '\\n  var length = iterable.length; index = -1;\\n  if (length && isArguments(iterable)) {\\n    while (++index < length) {\\n      index += \\'\\';\\n      ' +\n      (obj.loop) +\n      ';\\n    }\\n  } else {  ';\n       }\n\n       if (support.enumPrototypes) {\n      __p += '\\n  var skipProto = typeof iterable == \\'function\\';\\n  ';\n       }\n\n       if (support.enumErrorProps) {\n      __p += '\\n  var skipErrorProps = iterable === errorProto || iterable instanceof Error;\\n  ';\n       }\n\n          var conditions = [];    if (support.enumPrototypes) { conditions.push('!(skipProto && index == \"prototype\")'); }    if (support.enumErrorProps)  { conditions.push('!(skipErrorProps && (index == \"message\" || index == \"name\"))'); }\n\n       if (obj.useHas && obj.keys) {\n      __p += '\\n  var ownIndex = -1,\\n      ownProps = objectTypes[typeof iterable] && keys(iterable),\\n      length = ownProps ? ownProps.length : 0;\\n\\n  while (++ownIndex < length) {\\n    index = ownProps[ownIndex];\\n';\n          if (conditions.length) {\n      __p += '    if (' +\n      (conditions.join(' && ')) +\n      ') {\\n  ';\n       }\n      __p +=\n      (obj.loop) +\n      ';    ';\n       if (conditions.length) {\n      __p += '\\n    }';\n       }\n      __p += '\\n  }  ';\n       } else {\n      __p += '\\n  for (index in iterable) {\\n';\n          if (obj.useHas) { conditions.push(\"hasOwnProperty.call(iterable, index)\"); }    if (conditions.length) {\n      __p += '    if (' +\n      (conditions.join(' && ')) +\n      ') {\\n  ';\n       }\n      __p +=\n      (obj.loop) +\n      ';    ';\n       if (conditions.length) {\n      __p += '\\n    }';\n       }\n      __p += '\\n  }    ';\n       if (support.nonEnumShadows) {\n      __p += '\\n\\n  if (iterable !== objectProto) {\\n    var ctor = iterable.constructor,\\n        isProto = iterable === (ctor && ctor.prototype),\\n        className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\\n        nonEnum = nonEnumProps[className];\\n      ';\n       for (k = 0; k < 7; k++) {\n      __p += '\\n    index = \\'' +\n      (obj.shadowedProps[k]) +\n      '\\';\\n    if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))';\n              if (!obj.useHas) {\n      __p += ' || (!nonEnum[index] && iterable[index] !== objectProto[index])';\n       }\n      __p += ') {\\n      ' +\n      (obj.loop) +\n      ';\\n    }      ';\n       }\n      __p += '\\n  }    ';\n       }\n\n       }\n\n       if (obj.array || support.nonEnumArgs) {\n      __p += '\\n}';\n       }\n      __p +=\n      (obj.bottom) +\n      ';\\nreturn result';\n\n      return __p\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? baseEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n            ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        if (isArray(collection)) {\n          var index = -1,\n              length = collection.length;\n\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          baseEach(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Creates compiled iteration functions.\n     *\n     * @private\n     * @param {...Object} [options] The compile options object(s).\n     * @param {string} [options.array] Code to determine if the iterable is an array or array-like.\n     * @param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.\n     * @param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.\n     * @param {string} [options.args] A comma separated string of iteration function arguments.\n     * @param {string} [options.top] Code to execute before the iteration branches.\n     * @param {string} [options.loop] Code to execute in the object loop.\n     * @param {string} [options.bottom] Code to execute after the iteration branches.\n     * @returns {Function} Returns the compiled function.\n     */\n    function createIterator() {\n      // data properties\n      iteratorData.shadowedProps = shadowedProps;\n\n      // iterator options\n      iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = '';\n      iteratorData.init = 'iterable';\n      iteratorData.useHas = true;\n\n      // merge options into a template data object\n      for (var object, index = 0; object = arguments[index]; index++) {\n        for (var key in object) {\n          iteratorData[key] = object[key];\n        }\n      }\n      var args = iteratorData.args;\n      iteratorData.firstArg = /^[^,]+/.exec(args)[0];\n\n      // create the function factory\n      var factory = Function(\n          'baseCreateCallback, errorClass, errorProto, hasOwnProperty, ' +\n          'indicatorObject, isArguments, isArray, isString, keys, objectProto, ' +\n          'objectTypes, nonEnumProps, stringClass, stringProto, toString',\n        'return function(' + args + ') {\\n' + iteratorTemplate(iteratorData) + '\\n}'\n      );\n\n      // return the compiled function\n      return factory(\n        baseCreateCallback, errorClass, errorProto, hasOwnProperty,\n        indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,\n        objectTypes, nonEnumProps, stringClass, stringProto, toString\n      );\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||\n          (!support.argsClass && isArguments(value)) ||\n          (!support.nodeClass && isNode(value))) {\n        return false;\n      }\n      // IE < 9 iterates inherited properties before own properties. If the first\n      // iterated property is an object's own property then there are no inherited\n      // enumerable properties.\n      if (support.ownLast) {\n        forIn(value, function(value, key, object) {\n          result = hasOwnProperty.call(object, key);\n          return false;\n        });\n        return result !== false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n    // fallback for browsers that can't detect `arguments` objects by [[Class]]\n    if (!support.argsClass) {\n      isArguments = function(value) {\n        return value && typeof value == 'object' && typeof value.length == 'number' &&\n          hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;\n      };\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = createIterator({\n      'args': 'object',\n      'init': '[]',\n      'top': 'if (!(objectTypes[typeof object])) return result',\n      'loop': 'result.push(index)'\n    });\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      if ((support.enumPrototypes && typeof object == 'function') ||\n          (support.nonEnumArgs && object.length && isArguments(object))) {\n        return shimKeys(object);\n      }\n      return nativeKeys(object);\n    };\n\n    /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */\n    var eachIteratorOptions = {\n      'args': 'collection, callback, thisArg',\n      'top': \"callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)\",\n      'array': \"typeof length == 'number'\",\n      'keys': keys,\n      'loop': 'if (callback(iterable[index], index, collection) === false) return result'\n    };\n\n    /** Reusable iterator options for `assign` and `defaults` */\n    var defaultsIteratorOptions = {\n      'args': 'object, source, guard',\n      'top':\n        'var args = arguments,\\n' +\n        '    argsIndex = 0,\\n' +\n        \"    argsLength = typeof guard == 'number' ? 2 : args.length;\\n\" +\n        'while (++argsIndex < argsLength) {\\n' +\n        '  iterable = args[argsIndex];\\n' +\n        '  if (iterable && objectTypes[typeof iterable]) {',\n      'keys': keys,\n      'loop': \"if (typeof result[index] == 'undefined') result[index] = iterable[index]\",\n      'bottom': '  }\\n}'\n    };\n\n    /** Reusable iterator options for `forIn` and `forOwn` */\n    var forOwnIteratorOptions = {\n      'top': 'if (!objectTypes[typeof iterable]) return result;\\n' + eachIteratorOptions.top,\n      'array': false\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /**\n     * A function compiled to iterate `arguments` objects, arrays, objects, and\n     * strings consistenly across environments, executing the callback for each\n     * element in the collection. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index|key, collection). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @type Function\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEach = createIterator(eachIteratorOptions);\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = createIterator(defaultsIteratorOptions, {\n      'top':\n        defaultsIteratorOptions.top.replace(';',\n          ';\\n' +\n          \"if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\\n\" +\n          '  var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\\n' +\n          \"} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\\n\" +\n          '  callback = args[--argsLength];\\n' +\n          '}'\n        ),\n      'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]'\n    });\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = createIterator(defaultsIteratorOptions);\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {\n      'useHas': false\n    });\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass ||\n          (support.argsClass ? className == argsClass : isArguments(value))) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n    // fallback for older versions of Chrome and Safari\n    if (isFunction(/x/)) {\n      isFunction = function(value) {\n        return typeof value == 'function' && toString.call(value) == funcClass;\n      };\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? baseEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      if (support.unindexedChars && isString(collection)) {\n        collection = collection.split('');\n      }\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        baseEach(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      if (isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        baseEach(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      if (isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        baseEach(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      if (isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        baseEach(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      if (callback && typeof thisArg == 'undefined' && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        baseEach(collection, callback, thisArg);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var iterable = collection,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (isArray(collection)) {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        if (typeof length != 'number') {\n          var props = keys(collection);\n          length = props.length;\n        } else if (support.unindexedChars && isString(collection)) {\n          iterable = collection.split('');\n        }\n        baseEach(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(iterable[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (isArray(collection)) {\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        baseEach(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        baseEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        baseEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      if (isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        baseEach(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      } else if (support.unindexedChars && isString(collection)) {\n        collection = collection.split('');\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      if (isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        baseEach(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return (support.unindexedChars && isString(collection))\n          ? collection.split('')\n          : slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * http://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.1';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    baseEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    baseEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    baseEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    // avoid array-like object bugs with `Array#shift` and `Array#splice`\n    // in IE < 9, Firefox < 10, Narwhal, and RingoJS\n    if (!support.spliceObjects) {\n      baseEach(['pop', 'shift', 'splice'], function(methodName) {\n        var func = arrayRef[methodName],\n            isSplice = methodName == 'splice';\n\n        lodash.prototype[methodName] = function() {\n          var chainAll = this.__chain__,\n              value = this.__wrapped__,\n              result = func.apply(value, arguments);\n\n          if (value.length === 0) {\n            delete value[0];\n          }\n          return (chainAll || isSplice)\n            ? new lodashWrapper(result, chainAll)\n            : result;\n        };\n      });\n    }\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return _;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n"
  },
  {
    "path": "third_party/ui/bower_components/lodash/dist/lodash.js",
    "content": "/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <http://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function(object) {\n      var index, iterable = object, result = [];\n      if (!iterable) return result;\n      if (!(objectTypes[typeof object])) return result;\n        for (index in iterable) {\n          if (hasOwnProperty.call(iterable, index)) {\n            result.push(index);\n          }\n        }\n      return result\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        for (index in iterable) {\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * http://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.1';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return _;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n"
  },
  {
    "path": "third_party/ui/bower_components/lodash/dist/lodash.underscore.js",
    "content": "/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\n * Build: `lodash underscore exports=\"amd,commonjs,global,node\" -o ./dist/lodash.underscore.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <http://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used internally to indicate various things */\n  var indicatorObject = {};\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Used for `Array` method references.\n   *\n   * Normally `Array.prototype` would suffice, however, using an array literal\n   * avoids issues in Narwhal.\n   */\n  var arrayRef = [];\n\n  /** Used for native method references */\n  var objectProto = Object.prototype;\n\n  /** Used to restore the original `_` reference in `noConflict` */\n  var oldDash = root._;\n\n  /** Used to resolve the internal [[Class]] of values */\n  var toString = objectProto.toString;\n\n  /** Used to detect if a method is native */\n  var reNative = RegExp('^' +\n    String(toString)\n      .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n      .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n  );\n\n  /** Native method shortcuts */\n  var ceil = Math.ceil,\n      floor = Math.floor,\n      hasOwnProperty = objectProto.hasOwnProperty,\n      push = arrayRef.push,\n      propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  /* Native method shortcuts for methods with the same name as other `lodash` methods */\n  var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n      nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n      nativeIsFinite = root.isFinite,\n      nativeIsNaN = root.isNaN,\n      nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n      nativeMax = Math.max,\n      nativeMin = Math.min,\n      nativeRandom = Math.random;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a `lodash` object which wraps the given value to enable intuitive\n   * method chaining.\n   *\n   * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n   * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n   * and `unshift`\n   *\n   * Chaining is supported in custom builds as long as the `value` method is\n   * implicitly or explicitly included in the build.\n   *\n   * The chainable wrapper functions are:\n   * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n   * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n   * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n   * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n   * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n   * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n   * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n   * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n   * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n   * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n   * and `zip`\n   *\n   * The non-chainable wrapper functions are:\n   * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n   * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n   * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n   * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n   * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n   * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n   * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n   * `template`, `unescape`, `uniqueId`, and `value`\n   *\n   * The wrapper functions `first` and `last` return wrapped values when `n` is\n   * provided, otherwise they return unwrapped values.\n   *\n   * Explicit chaining can be enabled by using the `_.chain` method.\n   *\n   * @name _\n   * @constructor\n   * @category Chaining\n   * @param {*} value The value to wrap in a `lodash` instance.\n   * @returns {Object} Returns a `lodash` instance.\n   * @example\n   *\n   * var wrapped = _([1, 2, 3]);\n   *\n   * // returns an unwrapped value\n   * wrapped.reduce(function(sum, num) {\n   *   return sum + num;\n   * });\n   * // => 6\n   *\n   * // returns a wrapped value\n   * var squares = wrapped.map(function(num) {\n   *   return num * num;\n   * });\n   *\n   * _.isArray(squares);\n   * // => false\n   *\n   * _.isArray(squares.value());\n   * // => true\n   */\n  function lodash(value) {\n    return (value instanceof lodash)\n      ? value\n      : new lodashWrapper(value);\n  }\n\n  /**\n   * A fast path for creating `lodash` wrapper objects.\n   *\n   * @private\n   * @param {*} value The value to wrap in a `lodash` instance.\n   * @param {boolean} chainAll A flag to enable chaining for all methods\n   * @returns {Object} Returns a `lodash` instance.\n   */\n  function lodashWrapper(value, chainAll) {\n    this.__chain__ = !!chainAll;\n    this.__wrapped__ = value;\n  }\n  // ensure `new lodashWrapper` is an instance of `lodash`\n  lodashWrapper.prototype = lodash.prototype;\n\n  /**\n   * An object used to flag environments features.\n   *\n   * @static\n   * @memberOf _\n   * @type Object\n   */\n  var support = {};\n\n  (function() {\n    var object = { '0': 1, 'length': 1 };\n\n    /**\n     * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly.\n     *\n     * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`\n     * and `splice()` functions that fail to remove the last element, `value[0]`,\n     * of array-like objects even though the `length` property is set to `0`.\n     * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`\n     * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]);\n  }(1));\n\n  /**\n   * By default, the template delimiters used by Lo-Dash are similar to those in\n   * embedded Ruby (ERB). Change the following template settings to use alternative\n   * delimiters.\n   *\n   * @static\n   * @memberOf _\n   * @type Object\n   */\n  lodash.templateSettings = {\n\n    /**\n     * Used to detect `data` property values to be HTML-escaped.\n     *\n     * @memberOf _.templateSettings\n     * @type RegExp\n     */\n    'escape': /<%-([\\s\\S]+?)%>/g,\n\n    /**\n     * Used to detect code to be evaluated.\n     *\n     * @memberOf _.templateSettings\n     * @type RegExp\n     */\n    'evaluate': /<%([\\s\\S]+?)%>/g,\n\n    /**\n     * Used to detect `data` property values to inject.\n     *\n     * @memberOf _.templateSettings\n     * @type RegExp\n     */\n    'interpolate': reInterpolate,\n\n    /**\n     * Used to reference the data object in the template text.\n     *\n     * @memberOf _.templateSettings\n     * @type string\n     */\n    'variable': ''\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.bind` that creates the bound function and\n   * sets its meta data.\n   *\n   * @private\n   * @param {Array} bindData The bind data array.\n   * @returns {Function} Returns the new bound function.\n   */\n  function baseBind(bindData) {\n    var func = bindData[0],\n        partialArgs = bindData[2],\n        thisArg = bindData[4];\n\n    function bound() {\n      // `Function#bind` spec\n      // http://es5.github.io/#x15.3.4.5\n      if (partialArgs) {\n        // avoid `arguments` object deoptimizations by using `slice` instead\n        // of `Array.prototype.slice.call` and not assigning `arguments` to a\n        // variable as a ternary expression\n        var args = slice(partialArgs);\n        push.apply(args, arguments);\n      }\n      // mimic the constructor's `return` behavior\n      // http://es5.github.io/#x13.2.2\n      if (this instanceof bound) {\n        // ensure `new bound` is an instance of `func`\n        var thisBinding = baseCreate(func.prototype),\n            result = func.apply(thisBinding, args || arguments);\n        return isObject(result) ? result : thisBinding;\n      }\n      return func.apply(thisArg, args || arguments);\n    }\n    return bound;\n  }\n\n  /**\n   * The base implementation of `_.create` without support for assigning\n   * properties to the created object.\n   *\n   * @private\n   * @param {Object} prototype The object to inherit from.\n   * @returns {Object} Returns the new object.\n   */\n  function baseCreate(prototype, properties) {\n    return isObject(prototype) ? nativeCreate(prototype) : {};\n  }\n  // fallback for browsers without `Object.create`\n  if (!nativeCreate) {\n    baseCreate = (function() {\n      function Object() {}\n      return function(prototype) {\n        if (isObject(prototype)) {\n          Object.prototype = prototype;\n          var result = new Object;\n          Object.prototype = null;\n        }\n        return result || root.Object();\n      };\n    }());\n  }\n\n  /**\n   * The base implementation of `_.createCallback` without support for creating\n   * \"_.pluck\" or \"_.where\" style callbacks.\n   *\n   * @private\n   * @param {*} [func=identity] The value to convert to a callback.\n   * @param {*} [thisArg] The `this` binding of the created callback.\n   * @param {number} [argCount] The number of arguments the callback accepts.\n   * @returns {Function} Returns a callback function.\n   */\n  function baseCreateCallback(func, thisArg, argCount) {\n    if (typeof func != 'function') {\n      return identity;\n    }\n    // exit early for no `thisArg` or already bound by `Function#bind`\n    if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n      return func;\n    }\n    switch (argCount) {\n      case 1: return function(value) {\n        return func.call(thisArg, value);\n      };\n      case 2: return function(a, b) {\n        return func.call(thisArg, a, b);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(thisArg, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(thisArg, accumulator, value, index, collection);\n      };\n    }\n    return bind(func, thisArg);\n  }\n\n  /**\n   * The base implementation of `createWrapper` that creates the wrapper and\n   * sets its meta data.\n   *\n   * @private\n   * @param {Array} bindData The bind data array.\n   * @returns {Function} Returns the new function.\n   */\n  function baseCreateWrapper(bindData) {\n    var func = bindData[0],\n        bitmask = bindData[1],\n        partialArgs = bindData[2],\n        partialRightArgs = bindData[3],\n        thisArg = bindData[4],\n        arity = bindData[5];\n\n    var isBind = bitmask & 1,\n        isBindKey = bitmask & 2,\n        isCurry = bitmask & 4,\n        isCurryBound = bitmask & 8,\n        key = func;\n\n    function bound() {\n      var thisBinding = isBind ? thisArg : this;\n      if (partialArgs) {\n        var args = slice(partialArgs);\n        push.apply(args, arguments);\n      }\n      if (partialRightArgs || isCurry) {\n        args || (args = slice(arguments));\n        if (partialRightArgs) {\n          push.apply(args, partialRightArgs);\n        }\n        if (isCurry && args.length < arity) {\n          bitmask |= 16 & ~32;\n          return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n        }\n      }\n      args || (args = arguments);\n      if (isBindKey) {\n        func = thisBinding[key];\n      }\n      if (this instanceof bound) {\n        thisBinding = baseCreate(func.prototype);\n        var result = func.apply(thisBinding, args);\n        return isObject(result) ? result : thisBinding;\n      }\n      return func.apply(thisBinding, args);\n    }\n    return bound;\n  }\n\n  /**\n   * The base implementation of `_.difference` that accepts a single array\n   * of values to exclude.\n   *\n   * @private\n   * @param {Array} array The array to process.\n   * @param {Array} [values] The array of values to exclude.\n   * @returns {Array} Returns a new array of filtered values.\n   */\n  function baseDifference(array, values) {\n    var index = -1,\n        indexOf = getIndexOf(),\n        length = array ? array.length : 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (indexOf(values, value) < 0) {\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.flatten` without support for callback\n   * shorthands or `thisArg` binding.\n   *\n   * @private\n   * @param {Array} array The array to flatten.\n   * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n   * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n   * @param {number} [fromIndex=0] The index to start from.\n   * @returns {Array} Returns a new flattened array.\n   */\n  function baseFlatten(array, isShallow, isStrict, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n\n      if (value && typeof value == 'object' && typeof value.length == 'number'\n          && (isArray(value) || isArguments(value))) {\n        // recursively flatten arrays (susceptible to call stack limits)\n        if (!isShallow) {\n          value = baseFlatten(value, isShallow, isStrict);\n        }\n        var valIndex = -1,\n            valLength = value.length,\n            resIndex = result.length;\n\n        result.length += valLength;\n        while (++valIndex < valLength) {\n          result[resIndex++] = value[valIndex];\n        }\n      } else if (!isStrict) {\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n   * that allows partial \"_.where\" style comparisons.\n   *\n   * @private\n   * @param {*} a The value to compare.\n   * @param {*} b The other value to compare.\n   * @param {Function} [callback] The function to customize comparing values.\n   * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n   * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n   * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   */\n  function baseIsEqual(a, b, stackA, stackB) {\n    if (a === b) {\n      return a !== 0 || (1 / a == 1 / b);\n    }\n    var type = typeof a,\n        otherType = typeof b;\n\n    if (a === a &&\n        !(a && objectTypes[type]) &&\n        !(b && objectTypes[otherType])) {\n      return false;\n    }\n    if (a == null || b == null) {\n      return a === b;\n    }\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        return +a == +b;\n\n      case numberClass:\n        return a != +a\n          ? b != +b\n          : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n      var aWrapped = a instanceof lodash,\n          bWrapped = b instanceof lodash;\n\n      if (aWrapped || bWrapped) {\n        return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, stackA, stackB);\n      }\n      if (className != objectClass) {\n        return false;\n      }\n      var ctorA = a.constructor,\n          ctorB = b.constructor;\n\n      if (ctorA != ctorB &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var result = true,\n        size = 0;\n\n    stackA.push(a);\n    stackB.push(b);\n\n    if (isArr) {\n      size = b.length;\n      result = size == a.length;\n\n      if (result) {\n        while (size--) {\n          if (!(result = baseIsEqual(a[size], b[size], stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      forIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          size++;\n          return !(result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, stackA, stackB)) && indicatorObject;\n        }\n      });\n\n      if (result) {\n        forIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            return !(result = --size > -1) && indicatorObject;\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.random` without argument juggling or support\n   * for returning floating-point numbers.\n   *\n   * @private\n   * @param {number} min The minimum possible value.\n   * @param {number} max The maximum possible value.\n   * @returns {number} Returns a random number.\n   */\n  function baseRandom(min, max) {\n    return min + floor(nativeRandom() * (max - min + 1));\n  }\n\n  /**\n   * The base implementation of `_.uniq` without support for callback shorthands\n   * or `thisArg` binding.\n   *\n   * @private\n   * @param {Array} array The array to process.\n   * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n   * @param {Function} [callback] The function called per iteration.\n   * @returns {Array} Returns a duplicate-value-free array.\n   */\n  function baseUniq(array, isSorted, callback) {\n    var index = -1,\n        indexOf = getIndexOf(),\n        length = array ? array.length : 0,\n        result = [],\n        seen = callback ? [] : result;\n\n    while (++index < length) {\n      var value = array[index],\n          computed = callback ? callback(value, index, array) : value;\n\n      if (isSorted\n            ? !index || seen[seen.length - 1] !== computed\n            : indexOf(seen, computed) < 0\n          ) {\n        if (callback) {\n          seen.push(computed);\n        }\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates a function that aggregates a collection, creating an object composed\n   * of keys generated from the results of running each element of the collection\n   * through a callback. The given `setter` function sets the keys and values\n   * of the composed object.\n   *\n   * @private\n   * @param {Function} setter The setter function.\n   * @returns {Function} Returns the new aggregator function.\n   */\n  function createAggregator(setter) {\n    return function(collection, callback, thisArg) {\n      var result = {};\n      callback = createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          setter(result, value, callback(value, index, collection), collection);\n        }\n      } else {\n        forOwn(collection, function(value, key, collection) {\n          setter(result, value, callback(value, key, collection), collection);\n        });\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Creates a function that, when called, either curries or invokes `func`\n   * with an optional `this` binding and partially applied arguments.\n   *\n   * @private\n   * @param {Function|string} func The function or method name to reference.\n   * @param {number} bitmask The bitmask of method flags to compose.\n   *  The bitmask may be composed of the following flags:\n   *  1 - `_.bind`\n   *  2 - `_.bindKey`\n   *  4 - `_.curry`\n   *  8 - `_.curry` (bound)\n   *  16 - `_.partial`\n   *  32 - `_.partialRight`\n   * @param {Array} [partialArgs] An array of arguments to prepend to those\n   *  provided to the new function.\n   * @param {Array} [partialRightArgs] An array of arguments to append to those\n   *  provided to the new function.\n   * @param {*} [thisArg] The `this` binding of `func`.\n   * @param {number} [arity] The arity of `func`.\n   * @returns {Function} Returns the new function.\n   */\n  function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n    var isBind = bitmask & 1,\n        isBindKey = bitmask & 2,\n        isCurry = bitmask & 4,\n        isCurryBound = bitmask & 8,\n        isPartial = bitmask & 16,\n        isPartialRight = bitmask & 32;\n\n    if (!isBindKey && !isFunction(func)) {\n      throw new TypeError;\n    }\n    if (isPartial && !partialArgs.length) {\n      bitmask &= ~16;\n      isPartial = partialArgs = false;\n    }\n    if (isPartialRight && !partialRightArgs.length) {\n      bitmask &= ~32;\n      isPartialRight = partialRightArgs = false;\n    }\n    // fast path for `_.bind`\n    var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n    return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n  }\n\n  /**\n   * Used by `escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeHtmlChar(match) {\n    return htmlEscapes[match];\n  }\n\n  /**\n   * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n   * customized, this method returns the custom method, otherwise it returns\n   * the `baseIndexOf` function.\n   *\n   * @private\n   * @returns {Function} Returns the \"indexOf\" function.\n   */\n  function getIndexOf() {\n    var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n    return result;\n  }\n\n  /**\n   * Checks if `value` is a native function.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n   */\n  function isNative(value) {\n    return typeof value == 'function' && reNative.test(value);\n  }\n\n  /**\n   * Used by `unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} match The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  function unescapeHtmlChar(match) {\n    return htmlUnescapes[match];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Checks if `value` is an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n   * @example\n   *\n   * (function() { return _.isArguments(arguments); })(1, 2, 3);\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  function isArguments(value) {\n    return value && typeof value == 'object' && typeof value.length == 'number' &&\n      toString.call(value) == argsClass || false;\n  }\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!isArguments(arguments)) {\n    isArguments = function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;\n    };\n  }\n\n  /**\n   * Checks if `value` is an array.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n   * @example\n   *\n   * (function() { return _.isArray(arguments); })();\n   * // => false\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   */\n  var isArray = nativeIsArray || function(value) {\n    return value && typeof value == 'object' && typeof value.length == 'number' &&\n      toString.call(value) == arrayClass || false;\n  };\n\n  /**\n   * A fallback implementation of `Object.keys` which produces an array of the\n   * given object's own enumerable property names.\n   *\n   * @private\n   * @type Function\n   * @param {Object} object The object to inspect.\n   * @returns {Array} Returns an array of property names.\n   */\n  var shimKeys = function(object) {\n    var index, iterable = object, result = [];\n    if (!iterable) return result;\n    if (!(objectTypes[typeof object])) return result;\n      for (index in iterable) {\n        if (hasOwnProperty.call(iterable, index)) {\n          result.push(index);\n        }\n      }\n    return result\n  };\n\n  /**\n   * Creates an array composed of the own enumerable property names of an object.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The object to inspect.\n   * @returns {Array} Returns an array of property names.\n   * @example\n   *\n   * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n   * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n   */\n  var keys = !nativeKeys ? shimKeys : function(object) {\n    if (!isObject(object)) {\n      return [];\n    }\n    return nativeKeys(object);\n  };\n\n  /**\n   * Used to convert characters to HTML entities:\n   *\n   * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n   * don't require escaping in HTML and have no special meaning unless they're part\n   * of a tag or an unquoted attribute value.\n   * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n   */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;'\n  };\n\n  /** Used to convert HTML entities to characters */\n  var htmlUnescapes = invert(htmlEscapes);\n\n  /** Used to match HTML entities and HTML characters */\n  var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n      reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Assigns own enumerable properties of source object(s) to the destination\n   * object. Subsequent sources will overwrite property assignments of previous\n   * sources. If a callback is provided it will be executed to produce the\n   * assigned values. The callback is bound to `thisArg` and invoked with two\n   * arguments; (objectValue, sourceValue).\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @alias extend\n   * @category Objects\n   * @param {Object} object The destination object.\n   * @param {...Object} [source] The source objects.\n   * @param {Function} [callback] The function to customize assigning values.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns the destination object.\n   * @example\n   *\n   * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n   * // => { 'name': 'fred', 'employer': 'slate' }\n   *\n   * var defaults = _.partialRight(_.assign, function(a, b) {\n   *   return typeof a == 'undefined' ? b : a;\n   * });\n   *\n   * var object = { 'name': 'barney' };\n   * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n   * // => { 'name': 'barney', 'employer': 'slate' }\n   */\n  function assign(object) {\n    if (!object) {\n      return object;\n    }\n    for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {\n      var iterable = arguments[argsIndex];\n      if (iterable) {\n        for (var key in iterable) {\n          object[key] = iterable[key];\n        }\n      }\n    }\n    return object;\n  }\n\n  /**\n   * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n   * be cloned, otherwise they will be assigned by reference. If a callback\n   * is provided it will be executed to produce the cloned values. If the\n   * callback returns `undefined` cloning will be handled by the method instead.\n   * The callback is bound to `thisArg` and invoked with one argument; (value).\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to clone.\n   * @param {boolean} [isDeep=false] Specify a deep clone.\n   * @param {Function} [callback] The function to customize cloning values.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the cloned value.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * var shallow = _.clone(characters);\n   * shallow[0] === characters[0];\n   * // => true\n   *\n   * var deep = _.clone(characters, true);\n   * deep[0] === characters[0];\n   * // => false\n   *\n   * _.mixin({\n   *   'clone': _.partialRight(_.clone, function(value) {\n   *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n   *   })\n   * });\n   *\n   * var clone = _.clone(document.body);\n   * clone.childNodes.length;\n   * // => 0\n   */\n  function clone(value) {\n    return isObject(value)\n      ? (isArray(value) ? slice(value) : assign({}, value))\n      : value;\n  }\n\n  /**\n   * Assigns own enumerable properties of source object(s) to the destination\n   * object for all destination properties that resolve to `undefined`. Once a\n   * property is set, additional defaults of the same property will be ignored.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Objects\n   * @param {Object} object The destination object.\n   * @param {...Object} [source] The source objects.\n   * @param- {Object} [guard] Allows working with `_.reduce` without using its\n   *  `key` and `object` arguments as sources.\n   * @returns {Object} Returns the destination object.\n   * @example\n   *\n   * var object = { 'name': 'barney' };\n   * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n   * // => { 'name': 'barney', 'employer': 'slate' }\n   */\n  function defaults(object) {\n    if (!object) {\n      return object;\n    }\n    for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {\n      var iterable = arguments[argsIndex];\n      if (iterable) {\n        for (var key in iterable) {\n          if (typeof object[key] == 'undefined') {\n            object[key] = iterable[key];\n          }\n        }\n      }\n    }\n    return object;\n  }\n\n  /**\n   * Iterates over own and inherited enumerable properties of an object,\n   * executing the callback for each property. The callback is bound to `thisArg`\n   * and invoked with three arguments; (value, key, object). Callbacks may exit\n   * iteration early by explicitly returning `false`.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Objects\n   * @param {Object} object The object to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns `object`.\n   * @example\n   *\n   * function Shape() {\n   *   this.x = 0;\n   *   this.y = 0;\n   * }\n   *\n   * Shape.prototype.move = function(x, y) {\n   *   this.x += x;\n   *   this.y += y;\n   * };\n   *\n   * _.forIn(new Shape, function(value, key) {\n   *   console.log(key);\n   * });\n   * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n   */\n  var forIn = function(collection, callback) {\n    var index, iterable = collection, result = iterable;\n    if (!iterable) return result;\n    if (!objectTypes[typeof iterable]) return result;\n      for (index in iterable) {\n        if (callback(iterable[index], index, collection) === indicatorObject) return result;\n      }\n    return result\n  };\n\n  /**\n   * Iterates over own enumerable properties of an object, executing the callback\n   * for each property. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, key, object). Callbacks may exit iteration early by\n   * explicitly returning `false`.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Objects\n   * @param {Object} object The object to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns `object`.\n   * @example\n   *\n   * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n   *   console.log(key);\n   * });\n   * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n   */\n  var forOwn = function(collection, callback) {\n    var index, iterable = collection, result = iterable;\n    if (!iterable) return result;\n    if (!objectTypes[typeof iterable]) return result;\n      for (index in iterable) {\n        if (hasOwnProperty.call(iterable, index)) {\n          if (callback(iterable[index], index, collection) === indicatorObject) return result;\n        }\n      }\n    return result\n  };\n\n  /**\n   * Creates a sorted array of property names of all enumerable properties,\n   * own and inherited, of `object` that have function values.\n   *\n   * @static\n   * @memberOf _\n   * @alias methods\n   * @category Objects\n   * @param {Object} object The object to inspect.\n   * @returns {Array} Returns an array of property names that have function values.\n   * @example\n   *\n   * _.functions(_);\n   * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n   */\n  function functions(object) {\n    var result = [];\n    forIn(object, function(value, key) {\n      if (isFunction(value)) {\n        result.push(key);\n      }\n    });\n    return result.sort();\n  }\n\n  /**\n   * Checks if the specified property name exists as a direct property of `object`,\n   * instead of an inherited property.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The object to inspect.\n   * @param {string} key The name of the property to check.\n   * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n   * @example\n   *\n   * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n   * // => true\n   */\n  function has(object, key) {\n    return object ? hasOwnProperty.call(object, key) : false;\n  }\n\n  /**\n   * Creates an object composed of the inverted keys and values of the given object.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The object to invert.\n   * @returns {Object} Returns the created inverted object.\n   * @example\n   *\n   * _.invert({ 'first': 'fred', 'second': 'barney' });\n   * // => { 'fred': 'first', 'barney': 'second' }\n   */\n  function invert(object) {\n    var index = -1,\n        props = keys(object),\n        length = props.length,\n        result = {};\n\n    while (++index < length) {\n      var key = props[index];\n      result[object[key]] = key;\n    }\n    return result;\n  }\n\n  /**\n   * Checks if `value` is a boolean value.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n   * @example\n   *\n   * _.isBoolean(null);\n   * // => false\n   */\n  function isBoolean(value) {\n    return value === true || value === false ||\n      value && typeof value == 'object' && toString.call(value) == boolClass || false;\n  }\n\n  /**\n   * Checks if `value` is a date.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n   * @example\n   *\n   * _.isDate(new Date);\n   * // => true\n   */\n  function isDate(value) {\n    return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n  }\n\n  /**\n   * Checks if `value` is a DOM element.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n   * @example\n   *\n   * _.isElement(document.body);\n   * // => true\n   */\n  function isElement(value) {\n    return value && value.nodeType === 1 || false;\n  }\n\n  /**\n   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n   * length of `0` and objects with no own enumerable properties are considered\n   * \"empty\".\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Array|Object|string} value The value to inspect.\n   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n   * @example\n   *\n   * _.isEmpty([1, 2, 3]);\n   * // => false\n   *\n   * _.isEmpty({});\n   * // => true\n   *\n   * _.isEmpty('');\n   * // => true\n   */\n  function isEmpty(value) {\n    if (!value) {\n      return true;\n    }\n    if (isArray(value) || isString(value)) {\n      return !value.length;\n    }\n    for (var key in value) {\n      if (hasOwnProperty.call(value, key)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Performs a deep comparison between two values to determine if they are\n   * equivalent to each other. If a callback is provided it will be executed\n   * to compare values. If the callback returns `undefined` comparisons will\n   * be handled by the method instead. The callback is bound to `thisArg` and\n   * invoked with two arguments; (a, b).\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} a The value to compare.\n   * @param {*} b The other value to compare.\n   * @param {Function} [callback] The function to customize comparing values.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'name': 'fred' };\n   * var copy = { 'name': 'fred' };\n   *\n   * object == copy;\n   * // => false\n   *\n   * _.isEqual(object, copy);\n   * // => true\n   *\n   * var words = ['hello', 'goodbye'];\n   * var otherWords = ['hi', 'goodbye'];\n   *\n   * _.isEqual(words, otherWords, function(a, b) {\n   *   var reGreet = /^(?:hello|hi)$/i,\n   *       aGreet = _.isString(a) && reGreet.test(a),\n   *       bGreet = _.isString(b) && reGreet.test(b);\n   *\n   *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n   * });\n   * // => true\n   */\n  function isEqual(a, b) {\n    return baseIsEqual(a, b);\n  }\n\n  /**\n   * Checks if `value` is, or can be coerced to, a finite number.\n   *\n   * Note: This is not the same as native `isFinite` which will return true for\n   * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n   * @example\n   *\n   * _.isFinite(-101);\n   * // => true\n   *\n   * _.isFinite('10');\n   * // => true\n   *\n   * _.isFinite(true);\n   * // => false\n   *\n   * _.isFinite('');\n   * // => false\n   *\n   * _.isFinite(Infinity);\n   * // => false\n   */\n  function isFinite(value) {\n    return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n  }\n\n  /**\n   * Checks if `value` is a function.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   */\n  function isFunction(value) {\n    return typeof value == 'function';\n  }\n  // fallback for older versions of Chrome and Safari\n  if (isFunction(/x/)) {\n    isFunction = function(value) {\n      return typeof value == 'function' && toString.call(value) == funcClass;\n    };\n  }\n\n  /**\n   * Checks if `value` is the language type of Object.\n   * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(1);\n   * // => false\n   */\n  function isObject(value) {\n    // check if the value is the ECMAScript language type of Object\n    // http://es5.github.io/#x8\n    // and avoid a V8 bug\n    // http://code.google.com/p/v8/issues/detail?id=2291\n    return !!(value && objectTypes[typeof value]);\n  }\n\n  /**\n   * Checks if `value` is `NaN`.\n   *\n   * Note: This is not the same as native `isNaN` which will return `true` for\n   * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n   * @example\n   *\n   * _.isNaN(NaN);\n   * // => true\n   *\n   * _.isNaN(new Number(NaN));\n   * // => true\n   *\n   * isNaN(undefined);\n   * // => true\n   *\n   * _.isNaN(undefined);\n   * // => false\n   */\n  function isNaN(value) {\n    // `NaN` as a primitive is the only value that is not equal to itself\n    // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n    return isNumber(value) && value != +value;\n  }\n\n  /**\n   * Checks if `value` is `null`.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n   * @example\n   *\n   * _.isNull(null);\n   * // => true\n   *\n   * _.isNull(undefined);\n   * // => false\n   */\n  function isNull(value) {\n    return value === null;\n  }\n\n  /**\n   * Checks if `value` is a number.\n   *\n   * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n   * @example\n   *\n   * _.isNumber(8.4 * 5);\n   * // => true\n   */\n  function isNumber(value) {\n    return typeof value == 'number' ||\n      value && typeof value == 'object' && toString.call(value) == numberClass || false;\n  }\n\n  /**\n   * Checks if `value` is a regular expression.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n   * @example\n   *\n   * _.isRegExp(/fred/);\n   * // => true\n   */\n  function isRegExp(value) {\n    return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;\n  }\n\n  /**\n   * Checks if `value` is a string.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n   * @example\n   *\n   * _.isString('fred');\n   * // => true\n   */\n  function isString(value) {\n    return typeof value == 'string' ||\n      value && typeof value == 'object' && toString.call(value) == stringClass || false;\n  }\n\n  /**\n   * Checks if `value` is `undefined`.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n   * @example\n   *\n   * _.isUndefined(void 0);\n   * // => true\n   */\n  function isUndefined(value) {\n    return typeof value == 'undefined';\n  }\n\n  /**\n   * Creates a shallow clone of `object` excluding the specified properties.\n   * Property names may be specified as individual arguments or as arrays of\n   * property names. If a callback is provided it will be executed for each\n   * property of `object` omitting the properties the callback returns truey\n   * for. The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, key, object).\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The source object.\n   * @param {Function|...string|string[]} [callback] The properties to omit or the\n   *  function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns an object without the omitted properties.\n   * @example\n   *\n   * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n   * // => { 'name': 'fred' }\n   *\n   * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n   *   return typeof value == 'number';\n   * });\n   * // => { 'name': 'fred' }\n   */\n  function omit(object) {\n    var props = [];\n    forIn(object, function(value, key) {\n      props.push(key);\n    });\n    props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n    var index = -1,\n        length = props.length,\n        result = {};\n\n    while (++index < length) {\n      var key = props[index];\n      result[key] = object[key];\n    }\n    return result;\n  }\n\n  /**\n   * Creates a two dimensional array of an object's key-value pairs,\n   * i.e. `[[key1, value1], [key2, value2]]`.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The object to inspect.\n   * @returns {Array} Returns new array of key-value pairs.\n   * @example\n   *\n   * _.pairs({ 'barney': 36, 'fred': 40 });\n   * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n   */\n  function pairs(object) {\n    var index = -1,\n        props = keys(object),\n        length = props.length,\n        result = Array(length);\n\n    while (++index < length) {\n      var key = props[index];\n      result[index] = [key, object[key]];\n    }\n    return result;\n  }\n\n  /**\n   * Creates a shallow clone of `object` composed of the specified properties.\n   * Property names may be specified as individual arguments or as arrays of\n   * property names. If a callback is provided it will be executed for each\n   * property of `object` picking the properties the callback returns truey\n   * for. The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, key, object).\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The source object.\n   * @param {Function|...string|string[]} [callback] The function called per\n   *  iteration or property names to pick, specified as individual property\n   *  names or arrays of property names.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns an object composed of the picked properties.\n   * @example\n   *\n   * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n   * // => { 'name': 'fred' }\n   *\n   * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n   *   return key.charAt(0) != '_';\n   * });\n   * // => { 'name': 'fred' }\n   */\n  function pick(object) {\n    var index = -1,\n        props = baseFlatten(arguments, true, false, 1),\n        length = props.length,\n        result = {};\n\n    while (++index < length) {\n      var key = props[index];\n      if (key in object) {\n        result[key] = object[key];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates an array composed of the own enumerable property values of `object`.\n   *\n   * @static\n   * @memberOf _\n   * @category Objects\n   * @param {Object} object The object to inspect.\n   * @returns {Array} Returns an array of property values.\n   * @example\n   *\n   * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n   * // => [1, 2, 3] (property order is not guaranteed across environments)\n   */\n  function values(object) {\n    var index = -1,\n        props = keys(object),\n        length = props.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = object[props[index]];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Checks if a given value is present in a collection using strict equality\n   * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n   * offset from the end of the collection.\n   *\n   * @static\n   * @memberOf _\n   * @alias include\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {*} target The value to check for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n   * @example\n   *\n   * _.contains([1, 2, 3], 1);\n   * // => true\n   *\n   * _.contains([1, 2, 3], 1, 2);\n   * // => false\n   *\n   * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n   * // => true\n   *\n   * _.contains('pebbles', 'eb');\n   * // => true\n   */\n  function contains(collection, target) {\n    var indexOf = getIndexOf(),\n        length = collection ? collection.length : 0,\n        result = false;\n    if (length && typeof length == 'number') {\n      result = indexOf(collection, target) > -1;\n    } else {\n      forOwn(collection, function(value) {\n        return (result = value === target) && indicatorObject;\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Creates an object composed of keys generated from the results of running\n   * each element of `collection` through the callback. The corresponding value\n   * of each key is the number of times the key was returned by the callback.\n   * The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns the composed aggregate object.\n   * @example\n   *\n   * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n   * // => { '4': 1, '6': 2 }\n   *\n   * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n   * // => { '4': 1, '6': 2 }\n   *\n   * _.countBy(['one', 'two', 'three'], 'length');\n   * // => { '3': 2, '5': 1 }\n   */\n  var countBy = createAggregator(function(result, value, key) {\n    (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n  });\n\n  /**\n   * Checks if the given callback returns truey value for **all** elements of\n   * a collection. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias all\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {boolean} Returns `true` if all elements passed the callback check,\n   *  else `false`.\n   * @example\n   *\n   * _.every([true, 1, null, 'yes']);\n   * // => false\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.every(characters, 'age');\n   * // => true\n   *\n   * // using \"_.where\" callback shorthand\n   * _.every(characters, { 'age': 36 });\n   * // => false\n   */\n  function every(collection, callback, thisArg) {\n    var result = true;\n    callback = createCallback(callback, thisArg, 3);\n\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (typeof length == 'number') {\n      while (++index < length) {\n        if (!(result = !!callback(collection[index], index, collection))) {\n          break;\n        }\n      }\n    } else {\n      forOwn(collection, function(value, index, collection) {\n        return !(result = !!callback(value, index, collection)) && indicatorObject;\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Iterates over elements of a collection, returning an array of all elements\n   * the callback returns truey for. The callback is bound to `thisArg` and\n   * invoked with three arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias select\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a new array of elements that passed the callback check.\n   * @example\n   *\n   * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n   * // => [2, 4, 6]\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36, 'blocked': false },\n   *   { 'name': 'fred',   'age': 40, 'blocked': true }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.filter(characters, 'blocked');\n   * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n   *\n   * // using \"_.where\" callback shorthand\n   * _.filter(characters, { 'age': 36 });\n   * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n   */\n  function filter(collection, callback, thisArg) {\n    var result = [];\n    callback = createCallback(callback, thisArg, 3);\n\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (typeof length == 'number') {\n      while (++index < length) {\n        var value = collection[index];\n        if (callback(value, index, collection)) {\n          result.push(value);\n        }\n      }\n    } else {\n      forOwn(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result.push(value);\n        }\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Iterates over elements of a collection, returning the first element that\n   * the callback returns truey for. The callback is bound to `thisArg` and\n   * invoked with three arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias detect, findWhere\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the found element, else `undefined`.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'age': 36, 'blocked': false },\n   *   { 'name': 'fred',    'age': 40, 'blocked': true },\n   *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n   * ];\n   *\n   * _.find(characters, function(chr) {\n   *   return chr.age < 40;\n   * });\n   * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n   *\n   * // using \"_.where\" callback shorthand\n   * _.find(characters, { 'age': 1 });\n   * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.find(characters, 'blocked');\n   * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n   */\n  function find(collection, callback, thisArg) {\n    callback = createCallback(callback, thisArg, 3);\n\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (typeof length == 'number') {\n      while (++index < length) {\n        var value = collection[index];\n        if (callback(value, index, collection)) {\n          return value;\n        }\n      }\n    } else {\n      var result;\n      forOwn(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return indicatorObject;\n        }\n      });\n      return result;\n    }\n  }\n\n  /**\n   * Examines each element in a `collection`, returning the first that\n   * has the given properties. When checking `properties`, this method\n   * performs a deep comparison between values to determine if they are\n   * equivalent to each other.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Object} properties The object of property values to filter by.\n   * @returns {*} Returns the found element, else `undefined`.\n   * @example\n   *\n   * var food = [\n   *   { 'name': 'apple',  'organic': false, 'type': 'fruit' },\n   *   { 'name': 'banana', 'organic': true,  'type': 'fruit' },\n   *   { 'name': 'beet',   'organic': false, 'type': 'vegetable' }\n   * ];\n   *\n   * _.findWhere(food, { 'type': 'vegetable' });\n   * // => { 'name': 'beet', 'organic': false, 'type': 'vegetable' }\n   */\n  function findWhere(object, properties) {\n    return where(object, properties, true);\n  }\n\n  /**\n   * Iterates over elements of a collection, executing the callback for each\n   * element. The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, index|key, collection). Callbacks may exit iteration early by\n   * explicitly returning `false`.\n   *\n   * Note: As with other \"Collections\" methods, objects with a `length` property\n   * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n   * may be used for object iteration.\n   *\n   * @static\n   * @memberOf _\n   * @alias each\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array|Object|string} Returns `collection`.\n   * @example\n   *\n   * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n   * // => logs each number and returns '1,2,3'\n   *\n   * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n   * // => logs each number and returns the object (property order is not guaranteed across environments)\n   */\n  function forEach(collection, callback, thisArg) {\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n    if (typeof length == 'number') {\n      while (++index < length) {\n        if (callback(collection[index], index, collection) === indicatorObject) {\n          break;\n        }\n      }\n    } else {\n      forOwn(collection, callback);\n    }\n  }\n\n  /**\n   * This method is like `_.forEach` except that it iterates over elements\n   * of a `collection` from right to left.\n   *\n   * @static\n   * @memberOf _\n   * @alias eachRight\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array|Object|string} Returns `collection`.\n   * @example\n   *\n   * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n   * // => logs each number from right to left and returns '3,2,1'\n   */\n  function forEachRight(collection, callback) {\n    var length = collection ? collection.length : 0;\n    if (typeof length == 'number') {\n      while (length--) {\n        if (callback(collection[length], length, collection) === false) {\n          break;\n        }\n      }\n    } else {\n      var props = keys(collection);\n      length = props.length;\n      forOwn(collection, function(value, key, collection) {\n        key = props ? props[--length] : --length;\n        return callback(collection[key], key, collection) === false && indicatorObject;\n      });\n    }\n  }\n\n  /**\n   * Creates an object composed of keys generated from the results of running\n   * each element of a collection through the callback. The corresponding value\n   * of each key is an array of the elements responsible for generating the key.\n   * The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns the composed aggregate object.\n   * @example\n   *\n   * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n   * // => { '4': [4.2], '6': [6.1, 6.4] }\n   *\n   * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n   * // => { '4': [4.2], '6': [6.1, 6.4] }\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.groupBy(['one', 'two', 'three'], 'length');\n   * // => { '3': ['one', 'two'], '5': ['three'] }\n   */\n  var groupBy = createAggregator(function(result, value, key) {\n    (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n  });\n\n  /**\n   * Creates an object composed of keys generated from the results of running\n   * each element of the collection through the given callback. The corresponding\n   * value of each key is the last element responsible for generating the key.\n   * The callback is bound to `thisArg` and invoked with three arguments;\n   * (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Object} Returns the composed aggregate object.\n   * @example\n   *\n   * var keys = [\n   *   { 'dir': 'left', 'code': 97 },\n   *   { 'dir': 'right', 'code': 100 }\n   * ];\n   *\n   * _.indexBy(keys, 'dir');\n   * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n   *\n   * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n   * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n   *\n   * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n   * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n   */\n  var indexBy = createAggregator(function(result, value, key) {\n    result[key] = value;\n  });\n\n  /**\n   * Invokes the method named by `methodName` on each element in the `collection`\n   * returning an array of the results of each invoked method. Additional arguments\n   * will be provided to each invoked method. If `methodName` is a function it\n   * will be invoked for, and `this` bound to, each element in the `collection`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|string} methodName The name of the method to invoke or\n   *  the function invoked per iteration.\n   * @param {...*} [arg] Arguments to invoke the method with.\n   * @returns {Array} Returns a new array of the results of each invoked method.\n   * @example\n   *\n   * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n   * // => [[1, 5, 7], [1, 2, 3]]\n   *\n   * _.invoke([123, 456], String.prototype.split, '');\n   * // => [['1', '2', '3'], ['4', '5', '6']]\n   */\n  function invoke(collection, methodName) {\n    var args = slice(arguments, 2),\n        index = -1,\n        isFunc = typeof methodName == 'function',\n        length = collection ? collection.length : 0,\n        result = Array(typeof length == 'number' ? length : 0);\n\n    forEach(collection, function(value) {\n      result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n    });\n    return result;\n  }\n\n  /**\n   * Creates an array of values by running each element in the collection\n   * through the callback. The callback is bound to `thisArg` and invoked with\n   * three arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias collect\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a new array of the results of each `callback` execution.\n   * @example\n   *\n   * _.map([1, 2, 3], function(num) { return num * 3; });\n   * // => [3, 6, 9]\n   *\n   * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n   * // => [3, 6, 9] (property order is not guaranteed across environments)\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.map(characters, 'name');\n   * // => ['barney', 'fred']\n   */\n  function map(collection, callback, thisArg) {\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    callback = createCallback(callback, thisArg, 3);\n    if (typeof length == 'number') {\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = callback(collection[index], index, collection);\n      }\n    } else {\n      result = [];\n      forOwn(collection, function(value, key, collection) {\n        result[++index] = callback(value, key, collection);\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Retrieves the maximum value of a collection. If the collection is empty or\n   * falsey `-Infinity` is returned. If a callback is provided it will be executed\n   * for each value in the collection to generate the criterion by which the value\n   * is ranked. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, index, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the maximum value.\n   * @example\n   *\n   * _.max([4, 2, 8, 6]);\n   * // => 8\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * _.max(characters, function(chr) { return chr.age; });\n   * // => { 'name': 'fred', 'age': 40 };\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.max(characters, 'age');\n   * // => { 'name': 'fred', 'age': 40 };\n   */\n  function max(collection, callback, thisArg) {\n    var computed = -Infinity,\n        result = computed;\n\n    // allows working with functions like `_.map` without using\n    // their `index` argument as a callback\n    if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n      callback = null;\n    }\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (callback == null && typeof length == 'number') {\n      while (++index < length) {\n        var value = collection[index];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      callback = createCallback(callback, thisArg, 3);\n\n      forEach(collection, function(value, index, collection) {\n        var current = callback(value, index, collection);\n        if (current > computed) {\n          computed = current;\n          result = value;\n        }\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Retrieves the minimum value of a collection. If the collection is empty or\n   * falsey `Infinity` is returned. If a callback is provided it will be executed\n   * for each value in the collection to generate the criterion by which the value\n   * is ranked. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, index, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the minimum value.\n   * @example\n   *\n   * _.min([4, 2, 8, 6]);\n   * // => 2\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * _.min(characters, function(chr) { return chr.age; });\n   * // => { 'name': 'barney', 'age': 36 };\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.min(characters, 'age');\n   * // => { 'name': 'barney', 'age': 36 };\n   */\n  function min(collection, callback, thisArg) {\n    var computed = Infinity,\n        result = computed;\n\n    // allows working with functions like `_.map` without using\n    // their `index` argument as a callback\n    if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n      callback = null;\n    }\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (callback == null && typeof length == 'number') {\n      while (++index < length) {\n        var value = collection[index];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      callback = createCallback(callback, thisArg, 3);\n\n      forEach(collection, function(value, index, collection) {\n        var current = callback(value, index, collection);\n        if (current < computed) {\n          computed = current;\n          result = value;\n        }\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Retrieves the value of a specified property from all elements in the collection.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {string} property The name of the property to pluck.\n   * @returns {Array} Returns a new array of property values.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * _.pluck(characters, 'name');\n   * // => ['barney', 'fred']\n   */\n  var pluck = map;\n\n  /**\n   * Reduces a collection to a value which is the accumulated result of running\n   * each element in the collection through the callback, where each successive\n   * callback execution consumes the return value of the previous execution. If\n   * `accumulator` is not provided the first element of the collection will be\n   * used as the initial `accumulator` value. The callback is bound to `thisArg`\n   * and invoked with four arguments; (accumulator, value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @alias foldl, inject\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [accumulator] Initial value of the accumulator.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the accumulated value.\n   * @example\n   *\n   * var sum = _.reduce([1, 2, 3], function(sum, num) {\n   *   return sum + num;\n   * });\n   * // => 6\n   *\n   * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n   *   result[key] = num * 3;\n   *   return result;\n   * }, {});\n   * // => { 'a': 3, 'b': 6, 'c': 9 }\n   */\n  function reduce(collection, callback, accumulator, thisArg) {\n    if (!collection) return accumulator;\n    var noaccum = arguments.length < 3;\n    callback = createCallback(callback, thisArg, 4);\n\n    var index = -1,\n        length = collection.length;\n\n    if (typeof length == 'number') {\n      if (noaccum) {\n        accumulator = collection[++index];\n      }\n      while (++index < length) {\n        accumulator = callback(accumulator, collection[index], index, collection);\n      }\n    } else {\n      forOwn(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection)\n      });\n    }\n    return accumulator;\n  }\n\n  /**\n   * This method is like `_.reduce` except that it iterates over elements\n   * of a `collection` from right to left.\n   *\n   * @static\n   * @memberOf _\n   * @alias foldr\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function} [callback=identity] The function called per iteration.\n   * @param {*} [accumulator] Initial value of the accumulator.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the accumulated value.\n   * @example\n   *\n   * var list = [[0, 1], [2, 3], [4, 5]];\n   * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n   * // => [4, 5, 2, 3, 0, 1]\n   */\n  function reduceRight(collection, callback, accumulator, thisArg) {\n    var noaccum = arguments.length < 3;\n    callback = createCallback(callback, thisArg, 4);\n    forEachRight(collection, function(value, index, collection) {\n      accumulator = noaccum\n        ? (noaccum = false, value)\n        : callback(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The opposite of `_.filter` this method returns the elements of a\n   * collection that the callback does **not** return truey for.\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a new array of elements that failed the callback check.\n   * @example\n   *\n   * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n   * // => [1, 3, 5]\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36, 'blocked': false },\n   *   { 'name': 'fred',   'age': 40, 'blocked': true }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.reject(characters, 'blocked');\n   * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n   *\n   * // using \"_.where\" callback shorthand\n   * _.reject(characters, { 'age': 36 });\n   * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n   */\n  function reject(collection, callback, thisArg) {\n    callback = createCallback(callback, thisArg, 3);\n    return filter(collection, function(value, index, collection) {\n      return !callback(value, index, collection);\n    });\n  }\n\n  /**\n   * Retrieves a random element or `n` random elements from a collection.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to sample.\n   * @param {number} [n] The number of elements to sample.\n   * @param- {Object} [guard] Allows working with functions like `_.map`\n   *  without using their `index` arguments as `n`.\n   * @returns {Array} Returns the random sample(s) of `collection`.\n   * @example\n   *\n   * _.sample([1, 2, 3, 4]);\n   * // => 2\n   *\n   * _.sample([1, 2, 3, 4], 2);\n   * // => [3, 1]\n   */\n  function sample(collection, n, guard) {\n    if (collection && typeof collection.length != 'number') {\n      collection = values(collection);\n    }\n    if (n == null || guard) {\n      return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n    }\n    var result = shuffle(collection);\n    result.length = nativeMin(nativeMax(0, n), result.length);\n    return result;\n  }\n\n  /**\n   * Creates an array of shuffled values, using a version of the Fisher-Yates\n   * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to shuffle.\n   * @returns {Array} Returns a new shuffled collection.\n   * @example\n   *\n   * _.shuffle([1, 2, 3, 4, 5, 6]);\n   * // => [4, 1, 6, 3, 5, 2]\n   */\n  function shuffle(collection) {\n    var index = -1,\n        length = collection ? collection.length : 0,\n        result = Array(typeof length == 'number' ? length : 0);\n\n    forEach(collection, function(value) {\n      var rand = baseRandom(0, ++index);\n      result[index] = result[rand];\n      result[rand] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Gets the size of the `collection` by returning `collection.length` for arrays\n   * and array-like objects or the number of own enumerable properties for objects.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to inspect.\n   * @returns {number} Returns `collection.length` or number of own enumerable properties.\n   * @example\n   *\n   * _.size([1, 2]);\n   * // => 2\n   *\n   * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n   * // => 3\n   *\n   * _.size('pebbles');\n   * // => 7\n   */\n  function size(collection) {\n    var length = collection ? collection.length : 0;\n    return typeof length == 'number' ? length : keys(collection).length;\n  }\n\n  /**\n   * Checks if the callback returns a truey value for **any** element of a\n   * collection. The function returns as soon as it finds a passing value and\n   * does not iterate over the entire collection. The callback is bound to\n   * `thisArg` and invoked with three arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias any\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {boolean} Returns `true` if any element passed the callback check,\n   *  else `false`.\n   * @example\n   *\n   * _.some([null, 0, 'yes', false], Boolean);\n   * // => true\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36, 'blocked': false },\n   *   { 'name': 'fred',   'age': 40, 'blocked': true }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.some(characters, 'blocked');\n   * // => true\n   *\n   * // using \"_.where\" callback shorthand\n   * _.some(characters, { 'age': 1 });\n   * // => false\n   */\n  function some(collection, callback, thisArg) {\n    var result;\n    callback = createCallback(callback, thisArg, 3);\n\n    var index = -1,\n        length = collection ? collection.length : 0;\n\n    if (typeof length == 'number') {\n      while (++index < length) {\n        if ((result = callback(collection[index], index, collection))) {\n          break;\n        }\n      }\n    } else {\n      forOwn(collection, function(value, index, collection) {\n        return (result = callback(value, index, collection)) && indicatorObject;\n      });\n    }\n    return !!result;\n  }\n\n  /**\n   * Creates an array of elements, sorted in ascending order by the results of\n   * running each element in a collection through the callback. This method\n   * performs a stable sort, that is, it will preserve the original sort order\n   * of equal elements. The callback is bound to `thisArg` and invoked with\n   * three arguments; (value, index|key, collection).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an array of property names is provided for `callback` the collection\n   * will be sorted by each property value.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Array|Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a new array of sorted elements.\n   * @example\n   *\n   * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n   * // => [3, 1, 2]\n   *\n   * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n   * // => [3, 1, 2]\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'age': 36 },\n   *   { 'name': 'fred',    'age': 40 },\n   *   { 'name': 'barney',  'age': 26 },\n   *   { 'name': 'fred',    'age': 30 }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.map(_.sortBy(characters, 'age'), _.values);\n   * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n   *\n   * // sorting by multiple properties\n   * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n   * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n   */\n  function sortBy(collection, callback, thisArg) {\n    var index = -1,\n        length = collection ? collection.length : 0,\n        result = Array(typeof length == 'number' ? length : 0);\n\n    callback = createCallback(callback, thisArg, 3);\n    forEach(collection, function(value, key, collection) {\n      result[++index] = {\n        'criteria': [callback(value, key, collection)],\n        'index': index,\n        'value': value\n      };\n    });\n\n    length = result.length;\n    result.sort(compareAscending);\n    while (length--) {\n      result[length] = result[length].value;\n    }\n    return result;\n  }\n\n  /**\n   * Converts the `collection` to an array.\n   *\n   * @static\n   * @memberOf _\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to convert.\n   * @returns {Array} Returns the new converted array.\n   * @example\n   *\n   * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n   * // => [2, 3, 4]\n   */\n  function toArray(collection) {\n    if (isArray(collection)) {\n      return slice(collection);\n    }\n    if (collection && typeof collection.length == 'number') {\n      return map(collection);\n    }\n    return values(collection);\n  }\n\n  /**\n   * Performs a deep comparison of each element in a `collection` to the given\n   * `properties` object, returning an array of all elements that have equivalent\n   * property values.\n   *\n   * @static\n   * @memberOf _\n   * @type Function\n   * @category Collections\n   * @param {Array|Object|string} collection The collection to iterate over.\n   * @param {Object} props The object of property values to filter by.\n   * @returns {Array} Returns a new array of elements that have the given properties.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n   *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n   * ];\n   *\n   * _.where(characters, { 'age': 36 });\n   * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n   *\n   * _.where(characters, { 'pets': ['dino'] });\n   * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n   */\n  function where(collection, properties, first) {\n    return (first && isEmpty(properties))\n      ? undefined\n      : (first ? find : filter)(collection, properties);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates an array with all falsey values removed. The values `false`, `null`,\n   * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to compact.\n   * @returns {Array} Returns a new array of filtered values.\n   * @example\n   *\n   * _.compact([0, 1, false, 2, '', 3]);\n   * // => [1, 2, 3]\n   */\n  function compact(array) {\n    var index = -1,\n        length = array ? array.length : 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value) {\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates an array excluding all values of the provided arrays using strict\n   * equality for comparisons, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to process.\n   * @param {...Array} [values] The arrays of values to exclude.\n   * @returns {Array} Returns a new array of filtered values.\n   * @example\n   *\n   * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n   * // => [1, 3, 4]\n   */\n  function difference(array) {\n    return baseDifference(array, baseFlatten(arguments, true, true, 1));\n  }\n\n  /**\n   * Gets the first element or first `n` elements of an array. If a callback\n   * is provided elements at the beginning of the array are returned as long\n   * as the callback returns truey. The callback is bound to `thisArg` and\n   * invoked with three arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias head, take\n   * @category Arrays\n   * @param {Array} array The array to query.\n   * @param {Function|Object|number|string} [callback] The function called\n   *  per element or the number of elements to return. If a property name or\n   *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n   *  style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the first element(s) of `array`.\n   * @example\n   *\n   * _.first([1, 2, 3]);\n   * // => 1\n   *\n   * _.first([1, 2, 3], 2);\n   * // => [1, 2]\n   *\n   * _.first([1, 2, 3], function(num) {\n   *   return num < 3;\n   * });\n   * // => [1, 2]\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n   *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n   *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.first(characters, 'blocked');\n   * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n   *\n   * // using \"_.where\" callback shorthand\n   * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n   * // => ['barney', 'fred']\n   */\n  function first(array, callback, thisArg) {\n    var n = 0,\n        length = array ? array.length : 0;\n\n    if (typeof callback != 'number' && callback != null) {\n      var index = -1;\n      callback = createCallback(callback, thisArg, 3);\n      while (++index < length && callback(array[index], index, array)) {\n        n++;\n      }\n    } else {\n      n = callback;\n      if (n == null || thisArg) {\n        return array ? array[0] : undefined;\n      }\n    }\n    return slice(array, 0, nativeMin(nativeMax(0, n), length));\n  }\n\n  /**\n   * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n   * is truey, the array will only be flattened a single level. If a callback\n   * is provided each element of the array is passed through the callback before\n   * flattening. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to flatten.\n   * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a new flattened array.\n   * @example\n   *\n   * _.flatten([1, [2], [3, [[4]]]]);\n   * // => [1, 2, 3, 4];\n   *\n   * _.flatten([1, [2], [3, [[4]]]], true);\n   * // => [1, 2, 3, [[4]]];\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n   *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.flatten(characters, 'pets');\n   * // => ['hoppy', 'baby puss', 'dino']\n   */\n  function flatten(array, isShallow) {\n    return baseFlatten(array, isShallow);\n  }\n\n  /**\n   * Gets the index at which the first occurrence of `value` is found using\n   * strict equality for comparisons, i.e. `===`. If the array is already sorted\n   * providing `true` for `fromIndex` will run a faster binary search.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n   *  to perform a binary search on a sorted array.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   * @example\n   *\n   * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n   * // => 1\n   *\n   * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n   * // => 4\n   *\n   * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n   * // => 2\n   */\n  function indexOf(array, value, fromIndex) {\n    if (typeof fromIndex == 'number') {\n      var length = array ? array.length : 0;\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n    } else if (fromIndex) {\n      var index = sortedIndex(array, value);\n      return array[index] === value ? index : -1;\n    }\n    return baseIndexOf(array, value, fromIndex);\n  }\n\n  /**\n   * Gets all but the last element or last `n` elements of an array. If a\n   * callback is provided elements at the end of the array are excluded from\n   * the result as long as the callback returns truey. The callback is bound\n   * to `thisArg` and invoked with three arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to query.\n   * @param {Function|Object|number|string} [callback=1] The function called\n   *  per element or the number of elements to exclude. If a property name or\n   *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n   *  style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a slice of `array`.\n   * @example\n   *\n   * _.initial([1, 2, 3]);\n   * // => [1, 2]\n   *\n   * _.initial([1, 2, 3], 2);\n   * // => [1]\n   *\n   * _.initial([1, 2, 3], function(num) {\n   *   return num > 1;\n   * });\n   * // => [1]\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n   *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n   *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.initial(characters, 'blocked');\n   * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n   *\n   * // using \"_.where\" callback shorthand\n   * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n   * // => ['barney', 'fred']\n   */\n  function initial(array, callback, thisArg) {\n    var n = 0,\n        length = array ? array.length : 0;\n\n    if (typeof callback != 'number' && callback != null) {\n      var index = length;\n      callback = createCallback(callback, thisArg, 3);\n      while (index-- && callback(array[index], index, array)) {\n        n++;\n      }\n    } else {\n      n = (callback == null || thisArg) ? 1 : callback || n;\n    }\n    return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n  }\n\n  /**\n   * Creates an array of unique values present in all provided arrays using\n   * strict equality for comparisons, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {...Array} [array] The arrays to inspect.\n   * @returns {Array} Returns an array of shared values.\n   * @example\n   *\n   * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n   * // => [1, 2]\n   */\n  function intersection() {\n    var args = [],\n        argsIndex = -1,\n        argsLength = arguments.length;\n\n    while (++argsIndex < argsLength) {\n      var value = arguments[argsIndex];\n       if (isArray(value) || isArguments(value)) {\n         args.push(value);\n       }\n    }\n    var array = args[0],\n        index = -1,\n        indexOf = getIndexOf(),\n        length = array ? array.length : 0,\n        result = [];\n\n    outer:\n    while (++index < length) {\n      value = array[index];\n      if (indexOf(result, value) < 0) {\n        var argsIndex = argsLength;\n        while (--argsIndex) {\n          if (indexOf(args[argsIndex], value) < 0) {\n            continue outer;\n          }\n        }\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Gets the last element or last `n` elements of an array. If a callback is\n   * provided elements at the end of the array are returned as long as the\n   * callback returns truey. The callback is bound to `thisArg` and invoked\n   * with three arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to query.\n   * @param {Function|Object|number|string} [callback] The function called\n   *  per element or the number of elements to return. If a property name or\n   *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n   *  style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {*} Returns the last element(s) of `array`.\n   * @example\n   *\n   * _.last([1, 2, 3]);\n   * // => 3\n   *\n   * _.last([1, 2, 3], 2);\n   * // => [2, 3]\n   *\n   * _.last([1, 2, 3], function(num) {\n   *   return num > 1;\n   * });\n   * // => [2, 3]\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n   *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n   *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.pluck(_.last(characters, 'blocked'), 'name');\n   * // => ['fred', 'pebbles']\n   *\n   * // using \"_.where\" callback shorthand\n   * _.last(characters, { 'employer': 'na' });\n   * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n   */\n  function last(array, callback, thisArg) {\n    var n = 0,\n        length = array ? array.length : 0;\n\n    if (typeof callback != 'number' && callback != null) {\n      var index = length;\n      callback = createCallback(callback, thisArg, 3);\n      while (index-- && callback(array[index], index, array)) {\n        n++;\n      }\n    } else {\n      n = callback;\n      if (n == null || thisArg) {\n        return array ? array[length - 1] : undefined;\n      }\n    }\n    return slice(array, nativeMax(0, length - n));\n  }\n\n  /**\n   * Gets the index at which the last occurrence of `value` is found using strict\n   * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n   * as the offset from the end of the collection.\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=array.length-1] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   * @example\n   *\n   * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n   * // => 4\n   *\n   * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n   * // => 1\n   */\n  function lastIndexOf(array, value, fromIndex) {\n    var index = array ? array.length : 0;\n    if (typeof fromIndex == 'number') {\n      index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n    }\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Creates an array of numbers (positive and/or negative) progressing from\n   * `start` up to but not including `end`. If `start` is less than `stop` a\n   * zero-length range is created unless a negative `step` is specified.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {number} [start=0] The start of the range.\n   * @param {number} end The end of the range.\n   * @param {number} [step=1] The value to increment or decrement by.\n   * @returns {Array} Returns a new range array.\n   * @example\n   *\n   * _.range(4);\n   * // => [0, 1, 2, 3]\n   *\n   * _.range(1, 5);\n   * // => [1, 2, 3, 4]\n   *\n   * _.range(0, 20, 5);\n   * // => [0, 5, 10, 15]\n   *\n   * _.range(0, -4, -1);\n   * // => [0, -1, -2, -3]\n   *\n   * _.range(1, 4, 0);\n   * // => [1, 1, 1]\n   *\n   * _.range(0);\n   * // => []\n   */\n  function range(start, end, step) {\n    start = +start || 0;\n    step =  (+step || 1);\n\n    if (end == null) {\n      end = start;\n      start = 0;\n    }\n    // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n    // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n    var index = -1,\n        length = nativeMax(0, ceil((end - start) / step)),\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = start;\n      start += step;\n    }\n    return result;\n  }\n\n  /**\n   * The opposite of `_.initial` this method gets all but the first element or\n   * first `n` elements of an array. If a callback function is provided elements\n   * at the beginning of the array are excluded from the result as long as the\n   * callback returns truey. The callback is bound to `thisArg` and invoked\n   * with three arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias drop, tail\n   * @category Arrays\n   * @param {Array} array The array to query.\n   * @param {Function|Object|number|string} [callback=1] The function called\n   *  per element or the number of elements to exclude. If a property name or\n   *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n   *  style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a slice of `array`.\n   * @example\n   *\n   * _.rest([1, 2, 3]);\n   * // => [2, 3]\n   *\n   * _.rest([1, 2, 3], 2);\n   * // => [3]\n   *\n   * _.rest([1, 2, 3], function(num) {\n   *   return num < 3;\n   * });\n   * // => [3]\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n   *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n   *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n   * ];\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.pluck(_.rest(characters, 'blocked'), 'name');\n   * // => ['fred', 'pebbles']\n   *\n   * // using \"_.where\" callback shorthand\n   * _.rest(characters, { 'employer': 'slate' });\n   * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n   */\n  function rest(array, callback, thisArg) {\n    if (typeof callback != 'number' && callback != null) {\n      var n = 0,\n          index = -1,\n          length = array ? array.length : 0;\n\n      callback = createCallback(callback, thisArg, 3);\n      while (++index < length && callback(array[index], index, array)) {\n        n++;\n      }\n    } else {\n      n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n    }\n    return slice(array, n);\n  }\n\n  /**\n   * Uses a binary search to determine the smallest index at which a value\n   * should be inserted into a given sorted array in order to maintain the sort\n   * order of the array. If a callback is provided it will be executed for\n   * `value` and each element of `array` to compute their sort ranking. The\n   * callback is bound to `thisArg` and invoked with one argument; (value).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to evaluate.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {number} Returns the index at which `value` should be inserted\n   *  into `array`.\n   * @example\n   *\n   * _.sortedIndex([20, 30, 50], 40);\n   * // => 2\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n   * // => 2\n   *\n   * var dict = {\n   *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n   * };\n   *\n   * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n   *   return dict.wordToNumber[word];\n   * });\n   * // => 2\n   *\n   * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n   *   return this.wordToNumber[word];\n   * }, dict);\n   * // => 2\n   */\n  function sortedIndex(array, value, callback, thisArg) {\n    var low = 0,\n        high = array ? array.length : low;\n\n    // explicitly reference `identity` for better inlining in Firefox\n    callback = callback ? createCallback(callback, thisArg, 1) : identity;\n    value = callback(value);\n\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      (callback(array[mid]) < value)\n        ? low = mid + 1\n        : high = mid;\n    }\n    return low;\n  }\n\n  /**\n   * Creates an array of unique values, in order, of the provided arrays using\n   * strict equality for comparisons, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {...Array} [array] The arrays to inspect.\n   * @returns {Array} Returns an array of combined values.\n   * @example\n   *\n   * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n   * // => [1, 2, 3, 5, 4]\n   */\n  function union() {\n    return baseUniq(baseFlatten(arguments, true, true));\n  }\n\n  /**\n   * Creates a duplicate-value-free version of an array using strict equality\n   * for comparisons, i.e. `===`. If the array is sorted, providing\n   * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n   * each element of `array` is passed through the callback before uniqueness\n   * is computed. The callback is bound to `thisArg` and invoked with three\n   * arguments; (value, index, array).\n   *\n   * If a property name is provided for `callback` the created \"_.pluck\" style\n   * callback will return the property value of the given element.\n   *\n   * If an object is provided for `callback` the created \"_.where\" style callback\n   * will return `true` for elements that have the properties of the given object,\n   * else `false`.\n   *\n   * @static\n   * @memberOf _\n   * @alias unique\n   * @category Arrays\n   * @param {Array} array The array to process.\n   * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n   * @param {Function|Object|string} [callback=identity] The function called\n   *  per iteration. If a property name or object is provided it will be used\n   *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns a duplicate-value-free array.\n   * @example\n   *\n   * _.uniq([1, 2, 1, 3, 1]);\n   * // => [1, 2, 3]\n   *\n   * _.uniq([1, 1, 2, 2, 3], true);\n   * // => [1, 2, 3]\n   *\n   * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n   * // => ['A', 'b', 'C']\n   *\n   * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n   * // => [1, 2.5, 3]\n   *\n   * // using \"_.pluck\" callback shorthand\n   * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n   * // => [{ 'x': 1 }, { 'x': 2 }]\n   */\n  function uniq(array, isSorted, callback, thisArg) {\n    // juggle arguments\n    if (typeof isSorted != 'boolean' && isSorted != null) {\n      thisArg = callback;\n      callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n      isSorted = false;\n    }\n    if (callback != null) {\n      callback = createCallback(callback, thisArg, 3);\n    }\n    return baseUniq(array, isSorted, callback);\n  }\n\n  /**\n   * Creates an array excluding all provided values using strict equality for\n   * comparisons, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @category Arrays\n   * @param {Array} array The array to filter.\n   * @param {...*} [value] The values to exclude.\n   * @returns {Array} Returns a new array of filtered values.\n   * @example\n   *\n   * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n   * // => [2, 3, 4]\n   */\n  function without(array) {\n    return baseDifference(array, slice(arguments, 1));\n  }\n\n  /**\n   * Creates an array of grouped elements, the first of which contains the first\n   * elements of the given arrays, the second of which contains the second\n   * elements of the given arrays, and so on.\n   *\n   * @static\n   * @memberOf _\n   * @alias unzip\n   * @category Arrays\n   * @param {...Array} [array] Arrays to process.\n   * @returns {Array} Returns a new array of grouped elements.\n   * @example\n   *\n   * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n   * // => [['fred', 30, true], ['barney', 40, false]]\n   */\n  function zip() {\n    var index = -1,\n        length = max(pluck(arguments, 'length')),\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = pluck(arguments, index);\n    }\n    return result;\n  }\n\n  /**\n   * Creates an object composed from arrays of `keys` and `values`. Provide\n   * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n   * or two arrays, one of `keys` and one of corresponding `values`.\n   *\n   * @static\n   * @memberOf _\n   * @alias object\n   * @category Arrays\n   * @param {Array} keys The array of keys.\n   * @param {Array} [values=[]] The array of values.\n   * @returns {Object} Returns an object composed of the given keys and\n   *  corresponding values.\n   * @example\n   *\n   * _.zipObject(['fred', 'barney'], [30, 40]);\n   * // => { 'fred': 30, 'barney': 40 }\n   */\n  function zipObject(keys, values) {\n    var index = -1,\n        length = keys ? keys.length : 0,\n        result = {};\n\n    if (!values && length && !isArray(keys[0])) {\n      values = [];\n    }\n    while (++index < length) {\n      var key = keys[index];\n      if (values) {\n        result[key] = values[index];\n      } else if (key) {\n        result[key[0]] = key[1];\n      }\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a function that executes `func`, with  the `this` binding and\n   * arguments of the created function, only after being called `n` times.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {number} n The number of times the function must be called before\n   *  `func` is executed.\n   * @param {Function} func The function to restrict.\n   * @returns {Function} Returns the new restricted function.\n   * @example\n   *\n   * var saves = ['profile', 'settings'];\n   *\n   * var done = _.after(saves.length, function() {\n   *   console.log('Done saving!');\n   * });\n   *\n   * _.forEach(saves, function(type) {\n   *   asyncSave({ 'type': type, 'complete': done });\n   * });\n   * // => logs 'Done saving!', after all saves have completed\n   */\n  function after(n, func) {\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    return function() {\n      if (--n < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  }\n\n  /**\n   * Creates a function that, when called, invokes `func` with the `this`\n   * binding of `thisArg` and prepends any additional `bind` arguments to those\n   * provided to the bound function.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to bind.\n   * @param {*} [thisArg] The `this` binding of `func`.\n   * @param {...*} [arg] Arguments to be partially applied.\n   * @returns {Function} Returns the new bound function.\n   * @example\n   *\n   * var func = function(greeting) {\n   *   return greeting + ' ' + this.name;\n   * };\n   *\n   * func = _.bind(func, { 'name': 'fred' }, 'hi');\n   * func();\n   * // => 'hi fred'\n   */\n  function bind(func, thisArg) {\n    return arguments.length > 2\n      ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n      : createWrapper(func, 1, null, null, thisArg);\n  }\n\n  /**\n   * Binds methods of an object to the object itself, overwriting the existing\n   * method. Method names may be specified as individual arguments or as arrays\n   * of method names. If no method names are provided all the function properties\n   * of `object` will be bound.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Object} object The object to bind and assign the bound methods to.\n   * @param {...string} [methodName] The object method names to\n   *  bind, specified as individual method names or arrays of method names.\n   * @returns {Object} Returns `object`.\n   * @example\n   *\n   * var view = {\n   *   'label': 'docs',\n   *   'onClick': function() { console.log('clicked ' + this.label); }\n   * };\n   *\n   * _.bindAll(view);\n   * jQuery('#docs').on('click', view.onClick);\n   * // => logs 'clicked docs', when the button is clicked\n   */\n  function bindAll(object) {\n    var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n        index = -1,\n        length = funcs.length;\n\n    while (++index < length) {\n      var key = funcs[index];\n      object[key] = createWrapper(object[key], 1, null, null, object);\n    }\n    return object;\n  }\n\n  /**\n   * Creates a function that is the composition of the provided functions,\n   * where each function consumes the return value of the function that follows.\n   * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n   * Each function is executed with the `this` binding of the composed function.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {...Function} [func] Functions to compose.\n   * @returns {Function} Returns the new composed function.\n   * @example\n   *\n   * var realNameMap = {\n   *   'pebbles': 'penelope'\n   * };\n   *\n   * var format = function(name) {\n   *   name = realNameMap[name.toLowerCase()] || name;\n   *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n   * };\n   *\n   * var greet = function(formatted) {\n   *   return 'Hiya ' + formatted + '!';\n   * };\n   *\n   * var welcome = _.compose(greet, format);\n   * welcome('pebbles');\n   * // => 'Hiya Penelope!'\n   */\n  function compose() {\n    var funcs = arguments,\n        length = funcs.length;\n\n    while (length--) {\n      if (!isFunction(funcs[length])) {\n        throw new TypeError;\n      }\n    }\n    return function() {\n      var args = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        args = [funcs[length].apply(this, args)];\n      }\n      return args[0];\n    };\n  }\n\n  /**\n   * Creates a function that will delay the execution of `func` until after\n   * `wait` milliseconds have elapsed since the last time it was invoked.\n   * Provide an options object to indicate that `func` should be invoked on\n   * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n   * to the debounced function will return the result of the last `func` call.\n   *\n   * Note: If `leading` and `trailing` options are `true` `func` will be called\n   * on the trailing edge of the timeout only if the the debounced function is\n   * invoked more than once during the `wait` timeout.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to debounce.\n   * @param {number} wait The number of milliseconds to delay.\n   * @param {Object} [options] The options object.\n   * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n   * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n   * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n   * @returns {Function} Returns the new debounced function.\n   * @example\n   *\n   * // avoid costly calculations while the window size is in flux\n   * var lazyLayout = _.debounce(calculateLayout, 150);\n   * jQuery(window).on('resize', lazyLayout);\n   *\n   * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n   * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n   *   'leading': true,\n   *   'trailing': false\n   * });\n   *\n   * // ensure `batchLog` is executed once after 1 second of debounced calls\n   * var source = new EventSource('/stream');\n   * source.addEventListener('message', _.debounce(batchLog, 250, {\n   *   'maxWait': 1000\n   * }, false);\n   */\n  function debounce(func, wait, options) {\n    var args,\n        maxTimeoutId,\n        result,\n        stamp,\n        thisArg,\n        timeoutId,\n        trailingCall,\n        lastCalled = 0,\n        maxWait = false,\n        trailing = true;\n\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    wait = nativeMax(0, wait) || 0;\n    if (options === true) {\n      var leading = true;\n      trailing = false;\n    } else if (isObject(options)) {\n      leading = options.leading;\n      maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n      trailing = 'trailing' in options ? options.trailing : trailing;\n    }\n    var delayed = function() {\n      var remaining = wait - (now() - stamp);\n      if (remaining <= 0) {\n        if (maxTimeoutId) {\n          clearTimeout(maxTimeoutId);\n        }\n        var isCalled = trailingCall;\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (isCalled) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      } else {\n        timeoutId = setTimeout(delayed, remaining);\n      }\n    };\n\n    var maxDelayed = function() {\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n      maxTimeoutId = timeoutId = trailingCall = undefined;\n      if (trailing || (maxWait !== wait)) {\n        lastCalled = now();\n        result = func.apply(thisArg, args);\n        if (!timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n      }\n    };\n\n    return function() {\n      args = arguments;\n      stamp = now();\n      thisArg = this;\n      trailingCall = trailing && (timeoutId || !leading);\n\n      if (maxWait === false) {\n        var leadingCall = leading && !timeoutId;\n      } else {\n        if (!maxTimeoutId && !leading) {\n          lastCalled = stamp;\n        }\n        var remaining = maxWait - (stamp - lastCalled),\n            isCalled = remaining <= 0;\n\n        if (isCalled) {\n          if (maxTimeoutId) {\n            maxTimeoutId = clearTimeout(maxTimeoutId);\n          }\n          lastCalled = stamp;\n          result = func.apply(thisArg, args);\n        }\n        else if (!maxTimeoutId) {\n          maxTimeoutId = setTimeout(maxDelayed, remaining);\n        }\n      }\n      if (isCalled && timeoutId) {\n        timeoutId = clearTimeout(timeoutId);\n      }\n      else if (!timeoutId && wait !== maxWait) {\n        timeoutId = setTimeout(delayed, wait);\n      }\n      if (leadingCall) {\n        isCalled = true;\n        result = func.apply(thisArg, args);\n      }\n      if (isCalled && !timeoutId && !maxTimeoutId) {\n        args = thisArg = null;\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Defers executing the `func` function until the current call stack has cleared.\n   * Additional arguments will be provided to `func` when it is invoked.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to defer.\n   * @param {...*} [arg] Arguments to invoke the function with.\n   * @returns {number} Returns the timer id.\n   * @example\n   *\n   * _.defer(function(text) { console.log(text); }, 'deferred');\n   * // logs 'deferred' after one or more milliseconds\n   */\n  function defer(func) {\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    var args = slice(arguments, 1);\n    return setTimeout(function() { func.apply(undefined, args); }, 1);\n  }\n\n  /**\n   * Executes the `func` function after `wait` milliseconds. Additional arguments\n   * will be provided to `func` when it is invoked.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to delay.\n   * @param {number} wait The number of milliseconds to delay execution.\n   * @param {...*} [arg] Arguments to invoke the function with.\n   * @returns {number} Returns the timer id.\n   * @example\n   *\n   * _.delay(function(text) { console.log(text); }, 1000, 'later');\n   * // => logs 'later' after one second\n   */\n  function delay(func, wait) {\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    var args = slice(arguments, 2);\n    return setTimeout(function() { func.apply(undefined, args); }, wait);\n  }\n\n  /**\n   * Creates a function that memoizes the result of `func`. If `resolver` is\n   * provided it will be used to determine the cache key for storing the result\n   * based on the arguments provided to the memoized function. By default, the\n   * first argument provided to the memoized function is used as the cache key.\n   * The `func` is executed with the `this` binding of the memoized function.\n   * The result cache is exposed as the `cache` property on the memoized function.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to have its output memoized.\n   * @param {Function} [resolver] A function used to resolve the cache key.\n   * @returns {Function} Returns the new memoizing function.\n   * @example\n   *\n   * var fibonacci = _.memoize(function(n) {\n   *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n   * });\n   *\n   * fibonacci(9)\n   * // => 34\n   *\n   * var data = {\n   *   'fred': { 'name': 'fred', 'age': 40 },\n   *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n   * };\n   *\n   * // modifying the result cache\n   * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n   * get('pebbles');\n   * // => { 'name': 'pebbles', 'age': 1 }\n   *\n   * get.cache.pebbles.name = 'penelope';\n   * get('pebbles');\n   * // => { 'name': 'penelope', 'age': 1 }\n   */\n  function memoize(func, resolver) {\n    var cache = {};\n    return function() {\n      var key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n      return hasOwnProperty.call(cache, key)\n        ? cache[key]\n        : (cache[key] = func.apply(this, arguments));\n    };\n  }\n\n  /**\n   * Creates a function that is restricted to execute `func` once. Repeat calls to\n   * the function will return the value of the first call. The `func` is executed\n   * with the `this` binding of the created function.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to restrict.\n   * @returns {Function} Returns the new restricted function.\n   * @example\n   *\n   * var initialize = _.once(createApplication);\n   * initialize();\n   * initialize();\n   * // `initialize` executes `createApplication` once\n   */\n  function once(func) {\n    var ran,\n        result;\n\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    return function() {\n      if (ran) {\n        return result;\n      }\n      ran = true;\n      result = func.apply(this, arguments);\n\n      // clear the `func` variable so the function may be garbage collected\n      func = null;\n      return result;\n    };\n  }\n\n  /**\n   * Creates a function that, when called, invokes `func` with any additional\n   * `partial` arguments prepended to those provided to the new function. This\n   * method is similar to `_.bind` except it does **not** alter the `this` binding.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to partially apply arguments to.\n   * @param {...*} [arg] Arguments to be partially applied.\n   * @returns {Function} Returns the new partially applied function.\n   * @example\n   *\n   * var greet = function(greeting, name) { return greeting + ' ' + name; };\n   * var hi = _.partial(greet, 'hi');\n   * hi('fred');\n   * // => 'hi fred'\n   */\n  function partial(func) {\n    return createWrapper(func, 16, slice(arguments, 1));\n  }\n\n  /**\n   * Creates a function that, when executed, will only call the `func` function\n   * at most once per every `wait` milliseconds. Provide an options object to\n   * indicate that `func` should be invoked on the leading and/or trailing edge\n   * of the `wait` timeout. Subsequent calls to the throttled function will\n   * return the result of the last `func` call.\n   *\n   * Note: If `leading` and `trailing` options are `true` `func` will be called\n   * on the trailing edge of the timeout only if the the throttled function is\n   * invoked more than once during the `wait` timeout.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {Function} func The function to throttle.\n   * @param {number} wait The number of milliseconds to throttle executions to.\n   * @param {Object} [options] The options object.\n   * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n   * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n   * @returns {Function} Returns the new throttled function.\n   * @example\n   *\n   * // avoid excessively updating the position while scrolling\n   * var throttled = _.throttle(updatePosition, 100);\n   * jQuery(window).on('scroll', throttled);\n   *\n   * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n   * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n   *   'trailing': false\n   * }));\n   */\n  function throttle(func, wait, options) {\n    var leading = true,\n        trailing = true;\n\n    if (!isFunction(func)) {\n      throw new TypeError;\n    }\n    if (options === false) {\n      leading = false;\n    } else if (isObject(options)) {\n      leading = 'leading' in options ? options.leading : leading;\n      trailing = 'trailing' in options ? options.trailing : trailing;\n    }\n    options = {};\n    options.leading = leading;\n    options.maxWait = wait;\n    options.trailing = trailing;\n\n    return debounce(func, wait, options);\n  }\n\n  /**\n   * Creates a function that provides `value` to the wrapper function as its\n   * first argument. Additional arguments provided to the function are appended\n   * to those provided to the wrapper function. The wrapper is executed with\n   * the `this` binding of the created function.\n   *\n   * @static\n   * @memberOf _\n   * @category Functions\n   * @param {*} value The value to wrap.\n   * @param {Function} wrapper The wrapper function.\n   * @returns {Function} Returns the new function.\n   * @example\n   *\n   * var p = _.wrap(_.escape, function(func, text) {\n   *   return '<p>' + func(text) + '</p>';\n   * });\n   *\n   * p('Fred, Wilma, & Pebbles');\n   * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n   */\n  function wrap(value, wrapper) {\n    return createWrapper(wrapper, 16, [value]);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Produces a callback bound to an optional `thisArg`. If `func` is a property\n   * name the created callback will return the property value for a given element.\n   * If `func` is an object the created callback will return `true` for elements\n   * that contain the equivalent object properties, otherwise it will return `false`.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {*} [func=identity] The value to convert to a callback.\n   * @param {*} [thisArg] The `this` binding of the created callback.\n   * @param {number} [argCount] The number of arguments the callback accepts.\n   * @returns {Function} Returns a callback function.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * // wrap to create custom callback shorthands\n   * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n   *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n   *   return !match ? func(callback, thisArg) : function(object) {\n   *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n   *   };\n   * });\n   *\n   * _.filter(characters, 'age__gt38');\n   * // => [{ 'name': 'fred', 'age': 40 }]\n   */\n  function createCallback(func, thisArg, argCount) {\n    var type = typeof func;\n    if (func == null || type == 'function') {\n      return baseCreateCallback(func, thisArg, argCount);\n    }\n    // handle \"_.pluck\" style callback shorthands\n    if (type != 'object') {\n      return property(func);\n    }\n    var props = keys(func);\n    return function(object) {\n      var length = props.length,\n          result = false;\n\n      while (length--) {\n        if (!(result = object[props[length]] === func[props[length]])) {\n          break;\n        }\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n   * corresponding HTML entities.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {string} string The string to escape.\n   * @returns {string} Returns the escaped string.\n   * @example\n   *\n   * _.escape('Fred, Wilma, & Pebbles');\n   * // => 'Fred, Wilma, &amp; Pebbles'\n   */\n  function escape(string) {\n    return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n  }\n\n  /**\n   * This method returns the first argument provided to it.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {*} value Any value.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * var object = { 'name': 'fred' };\n   * _.identity(object) === object;\n   * // => true\n   */\n  function identity(value) {\n    return value;\n  }\n\n  /**\n   * Adds function properties of a source object to the destination object.\n   * If `object` is a function methods will be added to its prototype as well.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Function|Object} [object=lodash] object The destination object.\n   * @param {Object} source The object of functions to add.\n   * @param {Object} [options] The options object.\n   * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n   * @example\n   *\n   * function capitalize(string) {\n   *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n   * }\n   *\n   * _.mixin({ 'capitalize': capitalize });\n   * _.capitalize('fred');\n   * // => 'Fred'\n   *\n   * _('fred').capitalize().value();\n   * // => 'Fred'\n   *\n   * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n   * _('fred').capitalize();\n   * // => 'Fred'\n   */\n  function mixin(object) {\n    forEach(functions(object), function(methodName) {\n      var func = lodash[methodName] = object[methodName];\n\n      lodash.prototype[methodName] = function() {\n        var args = [this.__wrapped__];\n        push.apply(args, arguments);\n\n        var result = func.apply(lodash, args);\n        return this.__chain__\n          ? new lodashWrapper(result, true)\n          : result;\n      };\n    });\n  }\n\n  /**\n   * Reverts the '_' variable to its previous value and returns a reference to\n   * the `lodash` function.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @returns {Function} Returns the `lodash` function.\n   * @example\n   *\n   * var lodash = _.noConflict();\n   */\n  function noConflict() {\n    root._ = oldDash;\n    return this;\n  }\n\n  /**\n   * A no-operation function.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @example\n   *\n   * var object = { 'name': 'fred' };\n   * _.noop(object) === undefined;\n   * // => true\n   */\n  function noop() {\n    // no operation performed\n  }\n\n  /**\n   * Gets the number of milliseconds that have elapsed since the Unix epoch\n   * (1 January 1970 00:00:00 UTC).\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @example\n   *\n   * var stamp = _.now();\n   * _.defer(function() { console.log(_.now() - stamp); });\n   * // => logs the number of milliseconds it took for the deferred function to be called\n   */\n  var now = isNative(now = Date.now) && now || function() {\n    return new Date().getTime();\n  };\n\n  /**\n   * Creates a \"_.pluck\" style function, which returns the `key` value of a\n   * given object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {string} key The name of the property to retrieve.\n   * @returns {Function} Returns the new function.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'fred',   'age': 40 },\n   *   { 'name': 'barney', 'age': 36 }\n   * ];\n   *\n   * var getName = _.property('name');\n   *\n   * _.map(characters, getName);\n   * // => ['barney', 'fred']\n   *\n   * _.sortBy(characters, getName);\n   * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n   */\n  function property(key) {\n    return function(object) {\n      return object[key];\n    };\n  }\n\n  /**\n   * Produces a random number between `min` and `max` (inclusive). If only one\n   * argument is provided a number between `0` and the given number will be\n   * returned. If `floating` is truey or either `min` or `max` are floats a\n   * floating-point number will be returned instead of an integer.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {number} [min=0] The minimum possible value.\n   * @param {number} [max=1] The maximum possible value.\n   * @param {boolean} [floating=false] Specify returning a floating-point number.\n   * @returns {number} Returns a random number.\n   * @example\n   *\n   * _.random(0, 5);\n   * // => an integer between 0 and 5\n   *\n   * _.random(5);\n   * // => also an integer between 0 and 5\n   *\n   * _.random(5, true);\n   * // => a floating-point number between 0 and 5\n   *\n   * _.random(1.2, 5.2);\n   * // => a floating-point number between 1.2 and 5.2\n   */\n  function random(min, max) {\n    if (min == null && max == null) {\n      max = 1;\n    }\n    min = +min || 0;\n    if (max == null) {\n      max = min;\n      min = 0;\n    } else {\n      max = +max || 0;\n    }\n    return min + floor(nativeRandom() * (max - min + 1));\n  }\n\n  /**\n   * Resolves the value of property `key` on `object`. If `key` is a function\n   * it will be invoked with the `this` binding of `object` and its result returned,\n   * else the property value is returned. If `object` is falsey then `undefined`\n   * is returned.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} object The object to inspect.\n   * @param {string} key The name of the property to resolve.\n   * @returns {*} Returns the resolved value.\n   * @example\n   *\n   * var object = {\n   *   'cheese': 'crumpets',\n   *   'stuff': function() {\n   *     return 'nonsense';\n   *   }\n   * };\n   *\n   * _.result(object, 'cheese');\n   * // => 'crumpets'\n   *\n   * _.result(object, 'stuff');\n   * // => 'nonsense'\n   */\n  function result(object, key) {\n    if (object) {\n      var value = object[key];\n      return isFunction(value) ? object[key]() : value;\n    }\n  }\n\n  /**\n   * A micro-templating method that handles arbitrary delimiters, preserves\n   * whitespace, and correctly escapes quotes within interpolated code.\n   *\n   * Note: In the development build, `_.template` utilizes sourceURLs for easier\n   * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n   *\n   * For more information on precompiling templates see:\n   * http://lodash.com/custom-builds\n   *\n   * For more information on Chrome extension sandboxes see:\n   * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {string} text The template text.\n   * @param {Object} data The data object used to populate the text.\n   * @param {Object} [options] The options object.\n   * @param {RegExp} [options.escape] The \"escape\" delimiter.\n   * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n   * @param {Object} [options.imports] An object to import into the template as local variables.\n   * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n   * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n   * @param {string} [variable] The data object variable name.\n   * @returns {Function|string} Returns a compiled function when no `data` object\n   *  is given, else it returns the interpolated text.\n   * @example\n   *\n   * // using the \"interpolate\" delimiter to create a compiled template\n   * var compiled = _.template('hello <%= name %>');\n   * compiled({ 'name': 'fred' });\n   * // => 'hello fred'\n   *\n   * // using the \"escape\" delimiter to escape HTML in data property values\n   * _.template('<b><%- value %></b>', { 'value': '<script>' });\n   * // => '<b>&lt;script&gt;</b>'\n   *\n   * // using the \"evaluate\" delimiter to generate HTML\n   * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n   * _.template(list, { 'people': ['fred', 'barney'] });\n   * // => '<li>fred</li><li>barney</li>'\n   *\n   * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n   * _.template('hello ${ name }', { 'name': 'pebbles' });\n   * // => 'hello pebbles'\n   *\n   * // using the internal `print` function in \"evaluate\" delimiters\n   * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n   * // => 'hello barney!'\n   *\n   * // using a custom template delimiters\n   * _.templateSettings = {\n   *   'interpolate': /{{([\\s\\S]+?)}}/g\n   * };\n   *\n   * _.template('hello {{ name }}!', { 'name': 'mustache' });\n   * // => 'hello mustache!'\n   *\n   * // using the `imports` option to import jQuery\n   * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n   * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n   * // => '<li>fred</li><li>barney</li>'\n   *\n   * // using the `sourceURL` option to specify a custom sourceURL for the template\n   * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n   * compiled(data);\n   * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n   *\n   * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n   * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n   * compiled.source;\n   * // => function(data) {\n   *   var __t, __p = '', __e = _.escape;\n   *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n   *   return __p;\n   * }\n   *\n   * // using the `source` property to inline compiled templates for meaningful\n   * // line numbers in error messages and a stack trace\n   * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n   *   var JST = {\\\n   *     \"main\": ' + _.template(mainText).source + '\\\n   *   };\\\n   * ');\n   */\n  function template(text, data, options) {\n    var _ = lodash,\n        settings = _.templateSettings;\n\n    text = String(text || '');\n    options = defaults({}, options, settings);\n\n    var index = 0,\n        source = \"__p += '\",\n        variable = options.variable;\n\n    var reDelimiters = RegExp(\n      (options.escape || reNoMatch).source + '|' +\n      (options.interpolate || reNoMatch).source + '|' +\n      (options.evaluate || reNoMatch).source + '|$'\n    , 'g');\n\n    text.replace(reDelimiters, function(match, escapeValue, interpolateValue, evaluateValue, offset) {\n      source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n      if (escapeValue) {\n        source += \"' +\\n_.escape(\" + escapeValue + \") +\\n'\";\n      }\n      if (evaluateValue) {\n        source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n      }\n      if (interpolateValue) {\n        source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n\n    source += \"';\\n\";\n    if (!variable) {\n      variable = 'obj';\n      source = 'with (' + variable + ' || {}) {\\n' + source + '\\n}\\n';\n    }\n    source = 'function(' + variable + ') {\\n' +\n      \"var __t, __p = '', __j = Array.prototype.join;\\n\" +\n      \"function print() { __p += __j.call(arguments, '') }\\n\" +\n      source +\n      'return __p\\n}';\n\n    try {\n      var result = Function('_', 'return ' + source)(_);\n    } catch(e) {\n      e.source = source;\n      throw e;\n    }\n    if (data) {\n      return result(data);\n    }\n    result.source = source;\n    return result;\n  }\n\n  /**\n   * Executes the callback `n` times, returning an array of the results\n   * of each callback execution. The callback is bound to `thisArg` and invoked\n   * with one argument; (index).\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {number} n The number of times to execute the callback.\n   * @param {Function} callback The function called per iteration.\n   * @param {*} [thisArg] The `this` binding of `callback`.\n   * @returns {Array} Returns an array of the results of each `callback` execution.\n   * @example\n   *\n   * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n   * // => [3, 6, 4]\n   *\n   * _.times(3, function(n) { mage.castSpell(n); });\n   * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n   *\n   * _.times(3, function(n) { this.cast(n); }, mage);\n   * // => also calls `mage.castSpell(n)` three times\n   */\n  function times(n, callback, thisArg) {\n    n = (n = +n) > -1 ? n : 0;\n    var index = -1,\n        result = Array(n);\n\n    callback = baseCreateCallback(callback, thisArg, 1);\n    while (++index < n) {\n      result[index] = callback(index);\n    }\n    return result;\n  }\n\n  /**\n   * The inverse of `_.escape` this method converts the HTML entities\n   * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n   * corresponding characters.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {string} string The string to unescape.\n   * @returns {string} Returns the unescaped string.\n   * @example\n   *\n   * _.unescape('Fred, Barney &amp; Pebbles');\n   * // => 'Fred, Barney & Pebbles'\n   */\n  function unescape(string) {\n    return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n  }\n\n  /**\n   * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {string} [prefix] The value to prefix the ID with.\n   * @returns {string} Returns the unique ID.\n   * @example\n   *\n   * _.uniqueId('contact_');\n   * // => 'contact_104'\n   *\n   * _.uniqueId();\n   * // => '105'\n   */\n  function uniqueId(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a `lodash` object that wraps the given value with explicit\n   * method chaining enabled.\n   *\n   * @static\n   * @memberOf _\n   * @category Chaining\n   * @param {*} value The value to wrap.\n   * @returns {Object} Returns the wrapper object.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney',  'age': 36 },\n   *   { 'name': 'fred',    'age': 40 },\n   *   { 'name': 'pebbles', 'age': 1 }\n   * ];\n   *\n   * var youngest = _.chain(characters)\n   *     .sortBy('age')\n   *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n   *     .first()\n   *     .value();\n   * // => 'pebbles is 1'\n   */\n  function chain(value) {\n    value = new lodashWrapper(value);\n    value.__chain__ = true;\n    return value;\n  }\n\n  /**\n   * Invokes `interceptor` with the `value` as the first argument and then\n   * returns `value`. The purpose of this method is to \"tap into\" a method\n   * chain in order to perform operations on intermediate results within\n   * the chain.\n   *\n   * @static\n   * @memberOf _\n   * @category Chaining\n   * @param {*} value The value to provide to `interceptor`.\n   * @param {Function} interceptor The function to invoke.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * _([1, 2, 3, 4])\n   *  .tap(function(array) { array.pop(); })\n   *  .reverse()\n   *  .value();\n   * // => [3, 2, 1]\n   */\n  function tap(value, interceptor) {\n    interceptor(value);\n    return value;\n  }\n\n  /**\n   * Enables explicit method chaining on the wrapper object.\n   *\n   * @name chain\n   * @memberOf _\n   * @category Chaining\n   * @returns {*} Returns the wrapper object.\n   * @example\n   *\n   * var characters = [\n   *   { 'name': 'barney', 'age': 36 },\n   *   { 'name': 'fred',   'age': 40 }\n   * ];\n   *\n   * // without explicit chaining\n   * _(characters).first();\n   * // => { 'name': 'barney', 'age': 36 }\n   *\n   * // with explicit chaining\n   * _(characters).chain()\n   *   .first()\n   *   .pick('age')\n   *   .value();\n   * // => { 'age': 36 }\n   */\n  function wrapperChain() {\n    this.__chain__ = true;\n    return this;\n  }\n\n  /**\n   * Extracts the wrapped value.\n   *\n   * @name valueOf\n   * @memberOf _\n   * @alias value\n   * @category Chaining\n   * @returns {*} Returns the wrapped value.\n   * @example\n   *\n   * _([1, 2, 3]).valueOf();\n   * // => [1, 2, 3]\n   */\n  function wrapperValueOf() {\n    return this.__wrapped__;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // add functions that return wrapped values when chaining\n  lodash.after = after;\n  lodash.bind = bind;\n  lodash.bindAll = bindAll;\n  lodash.chain = chain;\n  lodash.compact = compact;\n  lodash.compose = compose;\n  lodash.countBy = countBy;\n  lodash.debounce = debounce;\n  lodash.defaults = defaults;\n  lodash.defer = defer;\n  lodash.delay = delay;\n  lodash.difference = difference;\n  lodash.filter = filter;\n  lodash.flatten = flatten;\n  lodash.forEach = forEach;\n  lodash.functions = functions;\n  lodash.groupBy = groupBy;\n  lodash.indexBy = indexBy;\n  lodash.initial = initial;\n  lodash.intersection = intersection;\n  lodash.invert = invert;\n  lodash.invoke = invoke;\n  lodash.keys = keys;\n  lodash.map = map;\n  lodash.max = max;\n  lodash.memoize = memoize;\n  lodash.min = min;\n  lodash.omit = omit;\n  lodash.once = once;\n  lodash.pairs = pairs;\n  lodash.partial = partial;\n  lodash.pick = pick;\n  lodash.pluck = pluck;\n  lodash.range = range;\n  lodash.reject = reject;\n  lodash.rest = rest;\n  lodash.shuffle = shuffle;\n  lodash.sortBy = sortBy;\n  lodash.tap = tap;\n  lodash.throttle = throttle;\n  lodash.times = times;\n  lodash.toArray = toArray;\n  lodash.union = union;\n  lodash.uniq = uniq;\n  lodash.values = values;\n  lodash.where = where;\n  lodash.without = without;\n  lodash.wrap = wrap;\n  lodash.zip = zip;\n\n  // add aliases\n  lodash.collect = map;\n  lodash.drop = rest;\n  lodash.each = forEach;\n  lodash.extend = assign;\n  lodash.methods = functions;\n  lodash.object = zipObject;\n  lodash.select = filter;\n  lodash.tail = rest;\n  lodash.unique = uniq;\n\n  /*--------------------------------------------------------------------------*/\n\n  // add functions that return unwrapped values when chaining\n  lodash.clone = clone;\n  lodash.contains = contains;\n  lodash.escape = escape;\n  lodash.every = every;\n  lodash.find = find;\n  lodash.has = has;\n  lodash.identity = identity;\n  lodash.indexOf = indexOf;\n  lodash.isArguments = isArguments;\n  lodash.isArray = isArray;\n  lodash.isBoolean = isBoolean;\n  lodash.isDate = isDate;\n  lodash.isElement = isElement;\n  lodash.isEmpty = isEmpty;\n  lodash.isEqual = isEqual;\n  lodash.isFinite = isFinite;\n  lodash.isFunction = isFunction;\n  lodash.isNaN = isNaN;\n  lodash.isNull = isNull;\n  lodash.isNumber = isNumber;\n  lodash.isObject = isObject;\n  lodash.isRegExp = isRegExp;\n  lodash.isString = isString;\n  lodash.isUndefined = isUndefined;\n  lodash.lastIndexOf = lastIndexOf;\n  lodash.mixin = mixin;\n  lodash.noConflict = noConflict;\n  lodash.random = random;\n  lodash.reduce = reduce;\n  lodash.reduceRight = reduceRight;\n  lodash.result = result;\n  lodash.size = size;\n  lodash.some = some;\n  lodash.sortedIndex = sortedIndex;\n  lodash.template = template;\n  lodash.unescape = unescape;\n  lodash.uniqueId = uniqueId;\n\n  // add aliases\n  lodash.all = every;\n  lodash.any = some;\n  lodash.detect = find;\n  lodash.findWhere = findWhere;\n  lodash.foldl = reduce;\n  lodash.foldr = reduceRight;\n  lodash.include = contains;\n  lodash.inject = reduce;\n\n  /*--------------------------------------------------------------------------*/\n\n  // add functions capable of returning wrapped and unwrapped values when chaining\n  lodash.first = first;\n  lodash.last = last;\n  lodash.sample = sample;\n\n  // add aliases\n  lodash.take = first;\n  lodash.head = first;\n\n  /*--------------------------------------------------------------------------*/\n\n  // add functions to `lodash.prototype`\n  mixin(lodash);\n\n  /**\n   * The semantic version number.\n   *\n   * @static\n   * @memberOf _\n   * @type string\n   */\n  lodash.VERSION = '2.4.1';\n\n  // add \"Chaining\" functions to the wrapper\n  lodash.prototype.chain = wrapperChain;\n  lodash.prototype.value = wrapperValueOf;\n\n    // add `Array` mutator functions to the wrapper\n    forEach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__;\n        func.apply(value, arguments);\n\n        // avoid array-like object bugs with `Array#shift` and `Array#splice`\n        // in Firefox < 10 and IE < 9\n        if (!support.spliceObjects && value.length === 0) {\n          delete value[0];\n        }\n        return this;\n      };\n    });\n\n    // add `Array` accessor functions to the wrapper\n    forEach(['concat', 'join', 'slice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            result = func.apply(value, arguments);\n\n        if (this.__chain__) {\n          result = new lodashWrapper(result);\n          result.__chain__ = true;\n        }\n        return result;\n      };\n    });\n\n  /*--------------------------------------------------------------------------*/\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = lodash;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return lodash;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = lodash)._ = lodash;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = lodash;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = lodash;\n  }\n}.call(this));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/.bower.json",
    "content": "{\n  \"name\": \"modernizr\",\n  \"homepage\": \"https://github.com/Modernizr/Modernizr\",\n  \"version\": \"2.8.3\",\n  \"_release\": \"2.8.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v2.8.3\",\n    \"commit\": \"d6bb30c0f12ebb3ddd01e90b0bf435e1c34e6f11\"\n  },\n  \"_source\": \"git://github.com/Modernizr/Modernizr.git\",\n  \"_target\": \"2.8.3\",\n  \"_originalSource\": \"modernizr\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/.editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/.gitignore",
    "content": "modernizr.min.js\n.DS_Store"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - 0.8\nbefore_script:\n  - npm install grunt\nscript: grunt travis --verbose"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/a-download.js",
    "content": "\n// a[download] attribute\n// When used on an <a>, this attribute signifies that the resource it\n// points to should be downloaded by the browser rather than navigating to it.\n// http://developers.whatwg.org/links.html#downloading-resources\n// By Addy Osmani\n\nModernizr.addTest('adownload', 'download' in document.createElement('a'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/audio-audiodata-api.js",
    "content": "// Mozilla Audio Data API\n// https://wiki.mozilla.org/Audio_Data_API\n// by Addy Osmani\nModernizr.addTest('audiodata', !!(window.Audio));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/audio-webaudio-api.js",
    "content": "// Web Audio API\n// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html\n// By Addy Osmani\nModernizr.addTest('webaudio', !!(window.webkitAudioContext || window.AudioContext));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/battery-api.js",
    "content": "\n// Battery API\n// https://developer.mozilla.org/en/DOM/window.navigator.mozBattery\n// By: Paul Sayre\n\nModernizr.addTest('battery',\n\t!!Modernizr.prefixed('battery', navigator)\n);"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/battery-level.js",
    "content": "\n// Low Battery Level\n// Enable a developer to remove CPU intensive CSS/JS when battery is low\n// developer.mozilla.org/en/DOM/window.navigator.mozBattery\n// By: Paul Sayre\n\nModernizr.addTest('lowbattery', function () {\n\tvar minLevel = 0.20,\n\t\tbattery = Modernizr.prefixed('battery', navigator);\n\treturn !!(battery && !battery.charging && battery.level <= minLevel);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/blob-constructor.js",
    "content": "// Blob constructor\n// http://dev.w3.org/2006/webapi/FileAPI/#constructorBlob\n\nModernizr.addTest('blobconstructor', function () {\n    try {\n        return !!new Blob();\n    } catch (e) {\n        return false;\n    }\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/canvas-todataurl-type.js",
    "content": "// canvas.toDataURL type support\n// http://www.w3.org/TR/html5/the-canvas-element.html#dom-canvas-todataurl\n\n// This test is asynchronous. Watch out.\n\n(function () {\n\n    if (!Modernizr.canvas) {\n        return false;\n    }\n\n    var image = new Image(),\n        canvas = document.createElement('canvas'),\n        ctx = canvas.getContext('2d');\n\n    image.onload = function() {\n        ctx.drawImage(image, 0, 0);\n\n        Modernizr.addTest('todataurljpeg', function() {\n            return canvas.toDataURL('image/jpeg').indexOf('data:image/jpeg') === 0;\n        });\n        Modernizr.addTest('todataurlwebp', function() {\n            return canvas.toDataURL('image/webp').indexOf('data:image/webp') === 0;\n        });\n    };\n\n    image.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==';\n}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/contenteditable.js",
    "content": "// contentEditable\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#contenteditable\n\n// this is known to false positive in some mobile browsers\n// here is a whitelist of verified working browsers:\n// https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083\n\nModernizr.addTest('contenteditable',\n        'contentEditable' in document.documentElement);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/contentsecuritypolicy.js",
    "content": "// Test for (experimental) Content Security Policy 1.1 support.\n//\n// This feature is still quite experimental, but is available now in Chrome 22.\n// If the `SecurityPolicy` property is available, you can be sure the browser\n// supports CSP. If it's not available, the browser still might support an\n// earlier version of the CSP spec.\n//\n// Editor's Draft: https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html\n\nModernizr.addTest('contentsecuritypolicy', ('securityPolicy' in document || 'SecurityPolicy' in document));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/contextmenu.js",
    "content": "// http://www.w3.org/TR/html5/interactive-elements.html#context-menus\n// Demo at http://thewebrocks.com/demos/context-menu/\nModernizr.addTest(\n  'contextmenu', \n  ('contextMenu' in document.documentElement && 'HTMLMenuItemElement' in window) \n);\n\n\n\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/cookies.js",
    "content": "\n// by tauren\n// https://github.com/Modernizr/Modernizr/issues/191\n\nModernizr.addTest('cookies', function () {\n  // Quick test if browser has cookieEnabled host property\n  if (navigator.cookieEnabled) return true;\n  // Create cookie\n  document.cookie = \"cookietest=1\";\n  var ret = document.cookie.indexOf(\"cookietest=\") != -1;\n  // Delete cookie\n  document.cookie = \"cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT\";\n  return ret;\n});\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/cors.js",
    "content": "// cors\n// By Theodoor van Donge\nModernizr.addTest('cors', !!(window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-backgroundposition-shorthand.js",
    "content": "/*\n    https://developer.mozilla.org/en/CSS/background-position\n    http://www.w3.org/TR/css3-background/#background-position\n\n    Example: http://jsfiddle.net/Blink/bBXvt/\n*/\n\n(function() {\n\n    var elem = document.createElement('a'),\n        eStyle = elem.style,\n        val = \"right 10px bottom 10px\";\n\n    Modernizr.addTest('bgpositionshorthand', function(){\n        eStyle.cssText = \"background-position: \" + val + \";\";\n        return (eStyle.backgroundPosition === val);\n    });\n\n}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-backgroundposition-xy.js",
    "content": "/*\n\tAllan Lei https://github.com/allanlei\n\t\n\tCheck adapted from https://github.com/brandonaaron/jquery-cssHooks/blob/master/bgpos.js\n\t\n\tTest: http://jsfiddle.net/allanlei/R8AYS/\n*/\nModernizr.addTest('bgpositionxy', function() {\n    return Modernizr.testStyles('#modernizr {background-position: 3px 5px;}', function(elem) {\n        var cssStyleDeclaration = window.getComputedStyle ? getComputedStyle(elem, null) : elem.currentStyle;\n        var xSupport = (cssStyleDeclaration.backgroundPositionX == '3px') || (cssStyleDeclaration['background-position-x'] == '3px');\n        var ySupport = (cssStyleDeclaration.backgroundPositionY == '5px') || (cssStyleDeclaration['background-position-y'] == '5px');\n        return xSupport && ySupport;\n    });\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-backgroundrepeat.js",
    "content": "// developer.mozilla.org/en/CSS/background-repeat\n\n// test page: jsbin.com/uzesun/\n// http://jsfiddle.net/ryanseddon/yMLTQ/6/    \n\n(function(){\n\n\nfunction getBgRepeatValue(elem){\n    return (window.getComputedStyle ?\n             getComputedStyle(elem, null).getPropertyValue('background') :\n             elem.currentStyle['background']);\n}\n  \n\nModernizr.testStyles(' #modernizr { background-repeat: round; } ', function(elem, rule){ \n\n  Modernizr.addTest('bgrepeatround', getBgRepeatValue(elem) == 'round');\n\n});\n\n\n\nModernizr.testStyles(' #modernizr { background-repeat: space; } ', function(elem, rule){ \n\n  Modernizr.addTest('bgrepeatspace', getBgRepeatValue(elem) == 'space');\n\n});\n\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-backgroundsizecover.js",
    "content": "\n// developer.mozilla.org/en/CSS/background-size\n\nModernizr.testStyles( '#modernizr{background-size:cover}', function( elem ) {\n\tvar style = window.getComputedStyle ?\n\t\twindow.getComputedStyle( elem, null )\n\t\t: elem.currentStyle;\n\t\t\n\tModernizr.addTest( 'bgsizecover', style.backgroundSize == 'cover' );\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-boxsizing.js",
    "content": "\n// developer.mozilla.org/en/CSS/box-sizing\n// github.com/Modernizr/Modernizr/issues/248\n\nModernizr.addTest(\"boxsizing\",function(){\n    return Modernizr.testAllProps(\"boxSizing\") && (document.documentMode === undefined || document.documentMode > 7);\n});\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-calc.js",
    "content": "// Method of allowing calculated values for length units, i.e. width: calc(100%-3em) http://caniuse.com/#search=calc\n// By @calvein\n\nModernizr.addTest('csscalc', function() {\n    var prop = 'width:';\n    var value = 'calc(10px);';\n    var el = document.createElement('div');\n\n    el.style.cssText = prop + Modernizr._prefixes.join(value + prop);\n\n    return !!el.style.length;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-cubicbezierrange.js",
    "content": "// cubic-bezier values can't be > 1 for Webkit until bug #45761 (https://bugs.webkit.org/show_bug.cgi?id=45761) is fixed\n// By @calvein\n\nModernizr.addTest('cubicbezierrange', function() {\n    var el = document.createElement('div');\n    el.style.cssText = Modernizr._prefixes.join('transition-timing-function' + ':cubic-bezier(1,0,0,1.1); ');\n    return !!el.style.length;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-displayrunin.js",
    "content": "\n// by alanhogan\n\n// https://github.com/Modernizr/Modernizr/issues/198\n// http://css-tricks.com/596-run-in/\n\n\n\nModernizr.testStyles(' #modernizr { display: run-in; } ', function(elem, rule){ \n\n  var ret = (window.getComputedStyle ?\n         getComputedStyle(elem, null).getPropertyValue('display') :\n         elem.currentStyle['display']);\n\n  Modernizr.addTest('display-runin', ret == 'run-in');\n\n});\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-displaytable.js",
    "content": "// display: table and table-cell test. (both are tested under one name \"table-cell\" )\n// By @scottjehl\n\n// all additional table display values are here: http://pastebin.com/Gk9PeVaQ though Scott has seen some IE false positives with that sort of weak detection.\n// more testing neccessary perhaps.\n\nModernizr.addTest( \"display-table\",function(){\n  \n  var doc   = window.document,\n      docElem = doc.documentElement,   \n      parent  = doc.createElement( \"div\" ),\n      child = doc.createElement( \"div\" ),\n      childb  = doc.createElement( \"div\" ),\n      ret;\n  \n  parent.style.cssText = \"display: table\";\n  child.style.cssText = childb.style.cssText = \"display: table-cell; padding: 10px\";    \n          \n  parent.appendChild( child );\n  parent.appendChild( childb );\n  docElem.insertBefore( parent, docElem.firstChild );\n  \n  ret = child.offsetLeft < childb.offsetLeft;\n  docElem.removeChild(parent);\n  return ret; \n});\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-filters.js",
    "content": "// https://github.com/Modernizr/Modernizr/issues/615\n// documentMode is needed for false positives in oldIE, please see issue above\nModernizr.addTest('cssfilters', function() {\n    var el = document.createElement('div');\n    el.style.cssText = Modernizr._prefixes.join('filter' + ':blur(2px); ');\n    return !!el.style.length && ((document.documentMode === undefined || document.documentMode > 9));\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-hyphens.js",
    "content": "/* see http://davidnewton.ca/the-current-state-of-hyphenation-on-the-web\n   http://davidnewton.ca/demos/hyphenation/test.html\n\n\nThere are three tests:\n   1. csshyphens      - tests hyphens:auto actually adds hyphens to text\n   2. softhyphens     - tests that &shy; does its job\n   3. softhyphensfind - tests that in-browser Find functionality still works correctly with &shy;\n\nThese tests currently require document.body to be present\n\nHyphenation is language specific, sometimes.\n  See for more details: http://code.google.com/p/hyphenator/source/diff?spec=svn975&r=975&format=side&path=/trunk/Hyphenator.js#sc_svn975_313\n\nIf loading Hyphenator.js via Modernizr.load, be cautious of issue 158: http://code.google.com/p/hyphenator/issues/detail?id=158\n\nMore details at https://github.com/Modernizr/Modernizr/issues/312\n\n*/\n\n(function() {\n\n\tif (!document.body){\n\t\twindow.console && console.warn('document.body doesn\\'t exist. Modernizr hyphens test needs it.');\n\t\treturn;\n\t}\n\n\t// functional test of adding hyphens:auto\n\tfunction test_hyphens_css() {\n\t\ttry {\n\t\t\t/* create a div container and a span within that\n\t\t\t * these have to be appended to document.body, otherwise some browsers can give false negative */\n\t\t\tvar div = document.createElement('div'),\n\t\t\t\tspan = document.createElement('span'),\n\t\t\t\tdivStyle = div.style,\n\t\t\t\tspanHeight = 0,\n\t\t\t\tspanWidth = 0,\n\t\t\t\tresult = false,\n\t\t\t\tfirstChild = document.body.firstElementChild || document.body.firstChild;\n\n\t\t\tdiv.appendChild(span);\n\t\t\tspan.innerHTML = 'Bacon ipsum dolor sit amet jerky velit in culpa hamburger et. Laborum dolor proident, enim dolore duis commodo et strip steak. Salami anim et, veniam consectetur dolore qui tenderloin jowl velit sirloin. Et ad culpa, fatback cillum jowl ball tip ham hock nulla short ribs pariatur aute. Pig pancetta ham bresaola, ut boudin nostrud commodo flank esse cow tongue culpa. Pork belly bresaola enim pig, ea consectetur nisi. Fugiat officia turkey, ea cow jowl pariatur ullamco proident do laborum velit sausage. Magna biltong sint tri-tip commodo sed bacon, esse proident aliquip. Ullamco ham sint fugiat, velit in enim sed mollit nulla cow ut adipisicing nostrud consectetur. Proident dolore beef ribs, laborum nostrud meatball ea laboris rump cupidatat labore culpa. Shankle minim beef, velit sint cupidatat fugiat tenderloin pig et ball tip. Ut cow fatback salami, bacon ball tip et in shank strip steak bresaola. In ut pork belly sed mollit tri-tip magna culpa veniam, short ribs qui in andouille ham consequat. Dolore bacon t-bone, velit short ribs enim strip steak nulla. Voluptate labore ut, biltong swine irure jerky. Cupidatat excepteur aliquip salami dolore. Ball tip strip steak in pork dolor. Ad in esse biltong. Dolore tenderloin exercitation ad pork loin t-bone, dolore in chicken ball tip qui pig. Ut culpa tongue, sint ribeye dolore ex shank voluptate hamburger. Jowl et tempor, boudin pork chop labore ham hock drumstick consectetur tri-tip elit swine meatball chicken ground round. Proident shankle mollit dolore. Shoulder ut duis t-bone quis reprehenderit. Meatloaf dolore minim strip steak, laboris ea aute bacon beef ribs elit shank in veniam drumstick qui. Ex laboris meatball cow tongue pork belly. Ea ball tip reprehenderit pig, sed fatback boudin dolore flank aliquip laboris eu quis. Beef ribs duis beef, cow corned beef adipisicing commodo nisi deserunt exercitation. Cillum dolor t-bone spare ribs, ham hock est sirloin. Brisket irure meatloaf in, boudin pork belly sirloin ball tip. Sirloin sint irure nisi nostrud aliqua. Nostrud nulla aute, enim officia culpa ham hock. Aliqua reprehenderit dolore sunt nostrud sausage, ea boudin pork loin ut t-bone ham tempor. Tri-tip et pancetta drumstick laborum. Ham hock magna do nostrud in proident. Ex ground round fatback, venison non ribeye in.';\n\n\t\t\tdocument.body.insertBefore(div, firstChild);\n\n\t\t\t/* get size of unhyphenated text */\n\t\t\tdivStyle.cssText = 'position:absolute;top:0;left:0;width:5em;text-align:justify;text-justification:newspaper;';\n\t\t\tspanHeight = span.offsetHeight;\n\t\t\tspanWidth = span.offsetWidth;\n\n\t\t\t/* compare size with hyphenated text */\n\t\t\tdivStyle.cssText = 'position:absolute;top:0;left:0;width:5em;text-align:justify;'+\n\t\t\t\t\t\t\t\t\t\t\t\t 'text-justification:newspaper;'+\n\t\t\t\t\t\t\t\t\t\t\t\t Modernizr._prefixes.join('hyphens:auto; ');\n\n\t\t\tresult = (span.offsetHeight != spanHeight || span.offsetWidth != spanWidth);\n\n\t\t\t/* results and cleanup */\n\t\t\tdocument.body.removeChild(div);\n\t\t\tdiv.removeChild(span);\n\n\t\t\treturn result;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// for the softhyphens test\n\tfunction test_hyphens(delimiter, testWidth) {\n\t\ttry {\n\t\t\t/* create a div container and a span within that\n\t\t\t * these have to be appended to document.body, otherwise some browsers can give false negative */\n\t\t\tvar div = document.createElement('div'),\n\t\t\t\tspan = document.createElement('span'),\n\t\t\t\tdivStyle = div.style,\n\t\t\t\tspanSize = 0,\n\t\t\t\tresult = false,\n\t\t\t\tresult1 = false,\n\t\t\t\tresult2 = false,\n\t\t\t\tfirstChild = document.body.firstElementChild || document.body.firstChild;\n\n\t\t\tdivStyle.cssText = 'position:absolute;top:0;left:0;overflow:visible;width:1.25em;';\n\t\t\tdiv.appendChild(span);\n\t\t\tdocument.body.insertBefore(div, firstChild);\n\n\n\t\t\t/* get height of unwrapped text */\n\t\t\tspan.innerHTML = 'mm';\n\t\t\tspanSize = span.offsetHeight;\n\n\t\t\t/* compare height w/ delimiter, to see if it wraps to new line */\n\t\t\tspan.innerHTML = 'm' + delimiter + 'm';\n\t\t\tresult1 = (span.offsetHeight > spanSize);\n\n\t\t\t/* if we're testing the width too (i.e. for soft-hyphen, not zws),\n\t\t\t * this is because tested Blackberry devices will wrap the text but not display the hyphen */\n\t\t\tif (testWidth) {\n\t\t\t\t/* get width of wrapped, non-hyphenated text */\n\t\t\t\tspan.innerHTML = 'm<br />m';\n\t\t\t\tspanSize = span.offsetWidth;\n\n\t\t\t\t/* compare width w/ wrapped w/ delimiter to see if hyphen is present */\n\t\t\t\tspan.innerHTML = 'm' + delimiter + 'm';\n\t\t\t\tresult2 = (span.offsetWidth > spanSize);\n\t\t\t} else {\n\t\t\t\tresult2 = true;\n\t\t\t}\n\n\t\t\t/* results and cleanup */\n\t\t\tif (result1 === true && result2 === true) { result = true; }\n\t\t\tdocument.body.removeChild(div);\n\t\t\tdiv.removeChild(span);\n\n\t\t\treturn result;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// testing if in-browser Find functionality will work on hyphenated text\n\tfunction test_hyphens_find(delimiter) {\n\t\ttry {\n\t\t\t/* create a dummy input for resetting selection location, and a div container\n\t\t\t * these have to be appended to document.body, otherwise some browsers can give false negative\n\t\t\t * div container gets the doubled testword, separated by the delimiter\n\t\t\t * Note: giving a width to div gives false positive in iOS Safari */\n\t\t\tvar dummy = document.createElement('input'),\n\t\t\t\tdiv = document.createElement('div'),\n\t\t\t\ttestword = 'lebowski',\n\t\t\t\tresult = false,\n\t\t\t\ttextrange,\n\t\t\t\tfirstChild = document.body.firstElementChild || document.body.firstChild;\n\n\t\t\tdiv.innerHTML = testword + delimiter + testword;\n\n\t\t\tdocument.body.insertBefore(div, firstChild);\n\t\t\tdocument.body.insertBefore(dummy, div);\n\n\n\t\t\t/* reset the selection to the dummy input element, i.e. BEFORE the div container\n\t\t\t *   stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area */\n\t\t\tif (dummy.setSelectionRange) {\n\t\t\t\tdummy.focus();\n\t\t\t\tdummy.setSelectionRange(0,0);\n\t\t\t} else if (dummy.createTextRange) {\n\t\t\t\ttextrange = dummy.createTextRange();\n\t\t\t\ttextrange.collapse(true);\n\t\t\t\ttextrange.moveEnd('character', 0);\n\t\t\t\ttextrange.moveStart('character', 0);\n\t\t\t\ttextrange.select();\n\t\t\t}\n\n\t\t\t/* try to find the doubled testword, without the delimiter */\n\t\t\tif (window.find) {\n\t\t\t\tresult = window.find(testword + testword);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\ttextrange = window.self.document.body.createTextRange();\n\t\t\t\t\tresult = textrange.findText(testword + testword);\n\t\t\t\t} catch(e) {\n\t\t\t\t\tresult = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.body.removeChild(div);\n\t\t\tdocument.body.removeChild(dummy);\n\n\t\t\treturn result;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tModernizr.addTest(\"csshyphens\", function() {\n\n\t\tif (!Modernizr.testAllProps('hyphens')) return false;\n\n\t\t/* Chrome lies about its hyphens support so we need a more robust test\n\t\t\t\tcrbug.com/107111\n\t\t*/\n\t\ttry {\n\t\t\treturn test_hyphens_css();\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t});\n\n\tModernizr.addTest(\"softhyphens\", function() {\n\t\ttry {\n\t\t\t// use numeric entity instead of &shy; in case it's XHTML\n\t\t\treturn test_hyphens('&#173;', true) && test_hyphens('&#8203;', false);\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t});\n\n\tModernizr.addTest(\"softhyphensfind\", function() {\n\t\ttry {\n\t\t\treturn test_hyphens_find('&#173;') && test_hyphens_find('&#8203;');\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t});\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-lastchild.js",
    "content": "// last-child pseudo selector\n// https://github.com/Modernizr/Modernizr/pull/304\n\n\nModernizr.addTest('lastchild', function(){\n\n  return Modernizr.testStyles(\"#modernizr div {width:100px} #modernizr :last-child{width:200px;display:block}\", function (elem) {\n    return elem.lastChild.offsetWidth > elem.firstChild.offsetWidth;\n  }, 2);\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-mask.js",
    "content": "// this tests passes for webkit's proprietary `-webkit-mask` feature\n//   www.webkit.org/blog/181/css-masks/\n//   developer.apple.com/library/safari/#documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Masks/Masks.html\n\n// it does not pass mozilla's implementation of `mask` for SVG\n\n//   developer.mozilla.org/en/CSS/mask\n//   developer.mozilla.org/En/Applying_SVG_effects_to_HTML_content\n\n// Can combine with clippaths for awesomeness: http://generic.cx/for/webkit/test.html\n\nModernizr.addTest('cssmask', Modernizr.testAllProps('maskRepeat'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-mediaqueries.js",
    "content": "\n\nModernizr.addTest('mediaqueries', Modernizr.mq('only all'));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-objectfit.js",
    "content": "\n// dev.opera.com/articles/view/css3-object-fit-object-position/\n\nModernizr.addTest('object-fit',\n\t!!Modernizr.prefixed('objectFit')\n);"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-overflow-scrolling.js",
    "content": "\n// johanbrook.com/browsers/native-momentum-scrolling-ios-5/\n// introduced in iOS5b2. Possible API may change...\n\nModernizr.addTest(\"overflowscrolling\",function(){\n    return Modernizr.testAllProps(\"overflowScrolling\");\n});\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-pointerevents.js",
    "content": "\n// developer.mozilla.org/en/CSS/pointer-events\n\n// Test and project pages:\n// ausi.github.com/Feature-detection-technique-for-pointer-events/\n// github.com/ausi/Feature-detection-technique-for-pointer-events/wiki\n// github.com/Modernizr/Modernizr/issues/80\n\n\nModernizr.addTest('pointerevents', function(){\n    var element = document.createElement('x'),\n        documentElement = document.documentElement,\n        getComputedStyle = window.getComputedStyle,\n        supports;\n    if(!('pointerEvents' in element.style)){\n        return false;\n    }\n    element.style.pointerEvents = 'auto';\n    element.style.pointerEvents = 'x';\n    documentElement.appendChild(element);\n    supports = getComputedStyle &&\n        getComputedStyle(element, '').pointerEvents === 'auto';\n    documentElement.removeChild(element);\n    return !!supports;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-positionsticky.js",
    "content": "// Sticky positioning - constrains an element to be positioned inside the\n// intersection of its container box, and the viewport.\nModernizr.addTest('csspositionsticky', function () {\n\n    var prop = 'position:';\n    var value = 'sticky';\n    var el = document.createElement('modernizr');\n    var mStyle = el.style;\n\n    mStyle.cssText = prop + Modernizr._prefixes.join(value + ';' + prop).slice(0, -prop.length);\n\n    return mStyle.position.indexOf(value) !== -1;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-regions.js",
    "content": "// CSS Regions\n// http://www.w3.org/TR/css3-regions/\n// By: Mihai Balan\n\n// We start with a CSS parser test then we check page geometry to see if it's affected by regions\n// Later we might be able to retire the second part, as WebKit builds with the false positives die out\n\nModernizr.addTest('regions', function() {\n\n\t/* Get the 'flowFrom' property name available in the browser. Either default or vendor prefixed.\n\tIf the property name can't be found we'll get Boolean 'false' and fail quickly */\n\tvar flowFromProperty = Modernizr.prefixed(\"flowFrom\"),\n\t\tflowIntoProperty = Modernizr.prefixed(\"flowInto\");\n\n\tif (!flowFromProperty || !flowIntoProperty){\n\t\treturn false;\n\t}\n\n\t/* If CSS parsing is there, try to determine if regions actually work. */\n\tvar container\t\t= document.createElement('div'),\n\t\tcontent\t\t\t= document.createElement('div'),\n\t\tregion\t\t\t= document.createElement('div'),\n\n\t/* we create a random, unlikely to be generated flow number to make sure we don't\n\tclash with anything more vanilla, like 'flow', or 'article', or 'f1' */\n\tflowName = 'modernizr_flow_for_regions_check';\n\n\t/* First create a div with two adjacent divs inside it. The first will be the\n\tcontent, the second will be the region. To be able to distinguish between the two,\n\twe'll give the region a particular padding */\n\tcontent.innerText\t\t= 'M';\n\tcontainer.style.cssText\t= 'top: 150px; left: 150px; padding: 0px;';\n\tregion.style.cssText\t= 'width: 50px; height: 50px; padding: 42px;';\n\n\tregion.style[flowFromProperty] = flowName;\n\tcontainer.appendChild(content);\n\tcontainer.appendChild(region);\n\tdocument.documentElement.appendChild(container);\n\n\t/* Now compute the bounding client rect, before and after attempting to flow the\n\tcontent div in the region div. If regions are enabled, the after bounding rect\n\tshould reflect the padding of the region div.*/\n\tvar flowedRect, delta,\n\t\tplainRect = content.getBoundingClientRect();\n\n\n\tcontent.style[flowIntoProperty] = flowName;\n\tflowedRect = content.getBoundingClientRect();\n\n\tdelta = flowedRect.left - plainRect.left;\n\tdocument.documentElement.removeChild(container);\n\tcontent = region = container = undefined;\n\n\treturn (delta == 42);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-remunit.js",
    "content": "\n// test by github.com/nsfmc\n\n// \"The 'rem' unit ('root em') is relative to the computed\n// value of the 'font-size' value of the root element.\"\n// http://www.w3.org/TR/css3-values/#relative0\n// you can test by checking if the prop was ditched\n\n// http://snook.ca/archives/html_and_css/font-size-with-rem\n\nModernizr.addTest('cssremunit', function(){\n\n  var div = document.createElement('div');\n  try {\n    div.style.fontSize = '3rem';\n  } catch(er){}\n  return (/rem/).test(div.style.fontSize);\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-resize.js",
    "content": "\n// Test for CSS 3 UI \"resize\" property\n// http://www.w3.org/TR/css3-ui/#resize\n// https://developer.mozilla.org/en/CSS/resize\n\nModernizr.addTest('cssresize', Modernizr.testAllProps('resize'));\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-scrollbars.js",
    "content": "// Stylable scrollbars detection\nModernizr.addTest('cssscrollbar', function() {\n\n\tvar bool,\n\n\t\tstyles = \"#modernizr{overflow: scroll; width: 40px }#\" +\n\t\t\tModernizr._prefixes\n\t\t\t\t.join(\"scrollbar{width:0px}\"+' #modernizr::')\n\t\t\t\t.split('#')\n\t\t\t\t.slice(1)\n\t\t\t\t.join('#') + \"scrollbar{width:0px}\";\n\n\tModernizr.testStyles(styles, function(node) {\n\t\tbool = 'scrollWidth' in node && node.scrollWidth == 40;\n\t});\n\n\treturn bool;\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-shapes.js",
    "content": "\n// http://html.adobe.com/webplatform/layout/shapes\n\nModernizr.addTest('shapes', Modernizr.testAllProps('shapeOutside', 'content-box', true));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-subpixelfont.js",
    "content": "/*\n * Test for SubPixel Font Rendering\n * (to infer if GDI or DirectWrite is used on Windows)\n * Authors: @derSchepp, @gerritvanaaken, @rodneyrehm, @yatil, @ryanseddon\n * Web: https://github.com/gerritvanaaken/subpixeldetect\n */\nModernizr.addTest('subpixelfont', function() {\n    var bool,\n        styles = \"#modernizr{position: absolute; top: -10em; visibility:hidden; font: normal 10px arial;}#subpixel{float: left; font-size: 33.3333%;}\";\n    \n    // see https://github.com/Modernizr/Modernizr/blob/master/modernizr.js#L97\n    Modernizr.testStyles(styles, function(elem) {\n        var subpixel = elem.firstChild;\n\n        subpixel.innerHTML = 'This is a text written in Arial';\n\n        bool = window.getComputedStyle ?\n            window.getComputedStyle(subpixel, null).getPropertyValue(\"width\") !== '44px'\n            : false;\n    }, 1, ['subpixel']);\n\n    return bool;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-supports.js",
    "content": "// http://dev.w3.org/csswg/css3-conditional/#at-supports\n// github.com/Modernizr/Modernizr/issues/648\n// Relies on the fact that a browser vendor should expose the CSSSupportsRule interface\n// http://dev.w3.org/csswg/css3-conditional/#the-csssupportsrule-interface\n\nModernizr.addTest(\"supports\",\"CSSSupportsRule\" in window);"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-userselect.js",
    "content": "// -moz-user-select:none test.\n\n// by ryan seddon\n//https://github.com/Modernizr/Modernizr/issues/250\n\n\nModernizr.addTest(\"userselect\",function(){\n    return Modernizr.testAllProps(\"user-select\");\n});\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-vhunit.js",
    "content": "// https://github.com/Modernizr/Modernizr/issues/572\n// Similar to http://jsfiddle.net/FWeinb/etnYC/\nModernizr.addTest('cssvhunit', function() {\n    var bool;\n    Modernizr.testStyles(\"#modernizr { height: 50vh; }\", function(elem, rule) {   \n        var height = parseInt(window.innerHeight/2,10),\n            compStyle = parseInt((window.getComputedStyle ?\n                      getComputedStyle(elem, null) :\n                      elem.currentStyle)[\"height\"],10);\n        \n        bool= (compStyle == height);\n    });\n    return bool;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-vmaxunit.js",
    "content": "// https://github.com/Modernizr/Modernizr/issues/572\n// http://jsfiddle.net/glsee/JDsWQ/4/\nModernizr.addTest('cssvmaxunit', function(){\n    var bool;\n    Modernizr.testStyles(\"#modernizr { width: 50vmax; }\", function(elem, rule) {\n        var one_vw = window.innerWidth/100,\n            one_vh = window.innerHeight/100,\n            compWidth = parseInt((window.getComputedStyle ?\n                                  getComputedStyle(elem, null) :\n                                  elem.currentStyle)['width'],10);\n        bool = ( parseInt(Math.max(one_vw, one_vh)*50,10) == compWidth );\n    });\n    return bool;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-vminunit.js",
    "content": "// https://github.com/Modernizr/Modernizr/issues/572\n// http://jsfiddle.net/glsee/JRmdq/8/\nModernizr.addTest('cssvminunit', function(){\n    var bool;\n    Modernizr.testStyles(\"#modernizr { width: 50vmin; }\", function(elem, rule) {\n        var one_vw = window.innerWidth/100,\n            one_vh = window.innerHeight/100,\n            compWidth = parseInt((window.getComputedStyle ?\n                                  getComputedStyle(elem, null) :\n                                  elem.currentStyle)['width'],10);\n        bool = ( parseInt(Math.min(one_vw, one_vh)*50,10) == compWidth );\n    });\n    return bool;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/css-vwunit.js",
    "content": "// https://github.com/Modernizr/Modernizr/issues/572\n// http://jsfiddle.net/FWeinb/etnYC/\nModernizr.addTest('cssvwunit', function(){\n    var bool;\n    Modernizr.testStyles(\"#modernizr { width: 50vw; }\", function(elem, rule) {\n        var width = parseInt(window.innerWidth/2,10),\n            compStyle = parseInt((window.getComputedStyle ?\n                      getComputedStyle(elem, null) :\n                      elem.currentStyle)[\"width\"],10);\n        \n        bool= (compStyle == width);\n    });\n    return bool;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/custom-protocol-handler.js",
    "content": "/*\n\tCustom protocol handler support\n\thttp://developers.whatwg.org/timers.html#custom-handlers\n\t\n\tAdded by @benschwarz\n*/\n\nModernizr.addTest('customprotocolhandler', function () {\n    return !!navigator.registerProtocolHandler;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dart.js",
    "content": "// Dart\n// By Theodoor van Donge\n\n// https://chromiumcodereview.appspot.com/9232049/\n\nModernizr.addTest('dart', !!Modernizr.prefixed('startDart', navigator));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dataview-api.js",
    "content": "// DataView \n// https://developer.mozilla.org/en/JavaScript_typed_arrays/DataView\n// By Addy Osmani\nModernizr.addTest('dataview', (typeof DataView !== 'undefined' && 'getFloat64' in DataView.prototype));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dom-classlist.js",
    "content": "// classList\n// https://developer.mozilla.org/en/DOM/element.classList\n// By Addy Osmani\nModernizr.addTest('classlist', 'classList' in document.documentElement);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dom-createElement-attrs.js",
    "content": "// by james a rosen.\n// https://github.com/Modernizr/Modernizr/issues/258\n\nModernizr.addTest('createelement-attrs', function() {\n  try {\n    return document.createElement(\"<input name='test' />\").getAttribute('name') == 'test';\n  } catch(e) {\n    return false;\n  }\n});\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dom-dataset.js",
    "content": "\n// dataset API for data-* attributes\n// test by @phiggins42\n\nModernizr.addTest('dataset', function(){\n  var n = document.createElement(\"div\");\n  n.setAttribute(\"data-a-b\", \"c\");\n  return !!(n.dataset && n.dataset.aB === \"c\");\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/dom-microdata.js",
    "content": "// Microdata support\n// http://www.w3.org/TR/html5/microdata.html\n// By Addy Osmani\nModernizr.addTest('microdata', !!(document['getItems']));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-datalist.js",
    "content": "\n\n// lol. we already have a test for datalist built in! silly you.\n\n\n// Helpful links while you're here, though..\n\n// http://css-tricks.com/15346-relevant-dropdowns-polyfill-for-datalist/\n// http://miketaylr.com/test/datalist.html\n// http://miketaylr.com/code/datalist.html\n\nModernizr.addTest('datalistelem', Modernizr.input.list );\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-details.js",
    "content": "// By @mathias, based on http://mths.be/axh\nModernizr.addTest('details', function() {\n    var doc = document,\n        el = doc.createElement('details'),\n        fake,\n        root,\n        diff;\n    if (!('open' in el)) { // return early if possible; thanks @aFarkas!\n        return false;\n    }\n    root = doc.body || (function() {\n        var de = doc.documentElement;\n        fake = true;\n        return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);\n    }());\n    el.innerHTML = '<summary>a</summary>b';\n    el.style.display = 'block';\n    root.appendChild(el);\n    diff = el.offsetHeight;\n    el.open = true;\n    diff = diff != el.offsetHeight;\n    root.removeChild(el);\n    fake && root.parentNode.removeChild(root);\n    return diff;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-output.js",
    "content": "// <output>\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-output-element\n// by Addy Osmani\nModernizr.addTest('outputelem', 'value' in document.createElement('output'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-progress-meter.js",
    "content": "//By Stefan Wallin\n\n//tests for progressbar-support. All browsers that don't support progressbar returns undefined =)\nModernizr.addTest(\"progressbar\",function(){\n    return document.createElement('progress').max !== undefined;\n});\n\n//tests for meter-support. All browsers that don't support meters returns undefined =)\nModernizr.addTest(\"meter\",function(){\n    return document.createElement('meter').max !== undefined;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-ruby.js",
    "content": "// Browser support test for the HTML5 <ruby>, <rt> and <rp> elements\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-ruby-element\n//\n// by @alrra\n\nModernizr.addTest('ruby', function () {\n\n    var ruby = document.createElement('ruby'),\n        rt = document.createElement('rt'),\n        rp = document.createElement('rp'),\n        docElement = document.documentElement,\n        displayStyleProperty = 'display',\n        fontSizeStyleProperty = 'fontSize'; // 'fontSize' - because it`s only used for IE6 and IE7\n\n    ruby.appendChild(rp);\n    ruby.appendChild(rt);\n    docElement.appendChild(ruby);\n\n    // browsers that support <ruby> hide the <rp> via \"display:none\"\n    if ( getStyle(rp, displayStyleProperty) == 'none' ||                                                       // for non-IE browsers\n    // but in IE browsers <rp> has \"display:inline\" so, the test needs other conditions:\n        getStyle(ruby, displayStyleProperty) == 'ruby' && getStyle(rt, displayStyleProperty) == 'ruby-text' || // for IE8 & IE9\n        getStyle(rp, fontSizeStyleProperty) == '6pt' && getStyle(rt, fontSizeStyleProperty) == '6pt' ) {       // for IE6 & IE7\n\n        cleanUp();\n        return true;\n\n    } else {\n        cleanUp();\n        return false;\n    }\n\n    function getStyle( element, styleProperty ) {\n        var result;\n\n        if ( window.getComputedStyle ) {     // for non-IE browsers\n            result = document.defaultView.getComputedStyle(element,null).getPropertyValue(styleProperty);\n        } else if ( element.currentStyle ) { // for IE\n            result = element.currentStyle[styleProperty];\n        }\n\n        return result;\n    }\n\n    function cleanUp() {\n        docElement.removeChild(ruby);\n        // the removed child node still exists in memory, so ...\n        ruby = null;\n        rt = null;\n        rp = null;\n    }\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-time.js",
    "content": "// <time> element\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#the-time-element-0\n// by Addy Osmani\nModernizr.addTest('time', 'valueAsDate' in document.createElement('time'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/elem-track.js",
    "content": "// Track element + Timed Text Track API\n// http://www.w3.org/TR/html5/video.html#the-track-element\n// http://www.w3.org/TR/html5/media-elements.html#text-track-api\n//\n// While IE10 has implemented the track element, IE10 does not expose the underlying APIs to create timed text tracks by JS (really sad)\n// By Addy Osmani\nModernizr.addTest({\n\ttexttrackapi: (typeof (document.createElement('video').addTextTrack) === 'function'),\n\t// a more strict test for track including UI support: document.createElement('track').kind === 'subtitles'\n\ttrack: ('kind' in document.createElement('track'))\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/emoji.js",
    "content": "// Requires a Modernizr build with `canvastext` included\n// http://www.modernizr.com/download/#-canvas-canvastext\nModernizr.addTest('emoji', function() {\n  if (!Modernizr.canvastext) return false;\n  var node = document.createElement('canvas'),\n      ctx = node.getContext('2d');\n  ctx.textBaseline = 'top';\n  ctx.font = '32px Arial';\n  ctx.fillText('\\ud83d\\ude03', 0, 0); // \"smiling face with open mouth\" emoji\n  return ctx.getImageData(16, 16, 1, 1).data[0] !== 0;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/es5-strictmode.js",
    "content": "// strict mode\n\n// test by @kangax\n\nModernizr.addTest('strictmode', function(){\n\treturn (function(){ \"use strict\"; return !this; })(); \n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/event-deviceorientation-motion.js",
    "content": "//By Shi Chuan\n//Part of Device Access aspect of HTML5, same category as geolocation\n//W3C Editor's Draft at http://dev.w3.org/geo/api/spec-source-orientation.html\n//Implementation by iOS Safari at http://goo.gl/fhce3 and http://goo.gl/rLKz8\n\n\n//test for Device Motion Event support, returns boolean value true/false\nModernizr.addTest('devicemotion', ('DeviceMotionEvent' in window) );\n\n//test for Device Orientation Event support, returns boolean value true/false\nModernizr.addTest('deviceorientation', ('DeviceOrientationEvent' in window) );\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/exif-orientation.js",
    "content": "// EXIF Orientation test\n\n// iOS looks at the EXIF Orientation flag in jpgs and rotates the image\n// accordingly. Looks like most desktop browsers just ignore this data.\n\n// description: www.impulseadventure.com/photo/exif-orientation.html\n\n// Bug trackers:\n//    bugzil.la/298619 (unimplemented)\n//    crbug.com/56845 (looks incomplete)\n//    webk.it/19688 (available upstream but its up all ports to turn on individually)\n//\n\n// detect by Paul Sayre\n\n\n(function(){\n\n  var img = new Image();\n\n  img.onerror = function() {\n      Modernizr.addTest('exif-orientation', function () { return false; });\n  };\n\n  img.onload = function() {\n      Modernizr.addTest('exif-orientation', function () { return img.width !== 2; });\n  };\n\n  // There may be a way to shrink this more, it's a 1x2 white jpg with the orientation flag set to 6\n  img.src = \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAABgASAAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAABAAIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+/iiiigD/2Q==\";\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/file-api.js",
    "content": "/**\n * file tests for the File API specification\n *   Tests for objects specific to the File API W3C specification without\n *   being redundant (don't bother testing for Blob since it is assumed\n *   to be the File object's prototype.\n *\n *   Will fail in Safari 5 due to its lack of support for the standards\n *   defined FileReader object\n */\nModernizr.addTest('filereader', function () {\n    return !!(window.File && window.FileList && window.FileReader);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/file-filesystem.js",
    "content": "// Filesystem API\n// dev.w3.org/2009/dap/file-system/file-dir-sys.html\n\n// The API will be present in Chrome incognito, but will throw an exception.\n// See crbug.com/93417\n//\n// By Eric Bidelman (@ebidel)\n\nModernizr.addTest('filesystem', !!Modernizr.prefixed('requestFileSystem', window));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-fileinput.js",
    "content": "\n\n// Detects whether input type=\"file\" is available on the platform\n// E.g. iOS < 6 and some android version don't support this\n\n//  It's useful if you want to hide the upload feature of your app on devices that\n//  don't support it (iphone, ipad, etc).\n\nModernizr.addTest('fileinput', function() {\n    var elem = document.createElement('input');\n    elem.type = 'file';\n    return !elem.disabled;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-formattribute.js",
    "content": "// Detects whether input form=\"form_id\" is available on the platform\n// E.g. IE 10 (and below), don't support this\nModernizr.addTest(\"formattribute\", function() {\n\tvar form = document.createElement(\"form\"),\n\t\tinput = document.createElement(\"input\"),\n\t\tdiv = document.createElement(\"div\"),\n\t\tid = \"formtest\"+(new Date().getTime()),\n\t\tattr,\n\t\tbool = false;\n\n\t\tform.id = id;\n\n\t//IE6/7 confuses the form idl attribute and the form content attribute\n\tif(document.createAttribute){\n\t\tattr = document.createAttribute(\"form\");\n\t\tattr.nodeValue = id;\n\t\tinput.setAttributeNode(attr);\n\t\tdiv.appendChild(form);\n\t\tdiv.appendChild(input);\n\n\t\tdocument.documentElement.appendChild(div);\n\n\t\tbool = form.elements.length === 1 && input.form == form;\n\n\t\tdiv.parentNode.removeChild(div);\n\t}\n\n\treturn bool;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-inputnumber-l10n.js",
    "content": "// input[type=\"number\"] localized input/output\n// // Detects whether input type=\"number\" is capable of receiving and\n// // displaying localized numbers, e.g. with comma separator\n// // https://bugs.webkit.org/show_bug.cgi?id=42484\n// // Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/forms/script-tests/input-number-keyoperation.js?rev=80096#L9\n// // By Peter Janes\n\nModernizr.addTest('localizedNumber', function() {\n    var doc = document,\n        el = document.createElement('div'),\n        fake,\n        root,\n        input,\n        diff;\n    root = doc.body || (function() {\n        var de = doc.documentElement;\n        fake = true;\n        return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);\n    }());\n    el.innerHTML = '<input type=\"number\" value=\"1.0\" step=\"0.1\"/>';\n    input = el.childNodes[0];\n    root.appendChild(el);\n    input.focus();\n    try {\n        doc.execCommand('InsertText', false, '1,1');\n    } catch(e) { // prevent warnings in IE\n    }\n    diff = input.type === 'number' && input.valueAsNumber === 1.1 && input.checkValidity();\n    root.removeChild(el);\n    fake && root.parentNode.removeChild(root);\n    return diff;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-placeholder.js",
    "content": "// testing for placeholder attribute in inputs and textareas\n// re-using Modernizr.input if available\n\nModernizr.addTest('placeholder', function(){\n\n  return !!( 'placeholder' in ( Modernizr.input    || document.createElement('input')    ) && \n             'placeholder' in ( Modernizr.textarea || document.createElement('textarea') )\n           );\n\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-speechinput.js",
    "content": "// speech input for inputs\n// by @alrra\n\n\n// `webkitSpeech` in elem \n// doesn`t work correctly in all versions of Chromium based browsers.\n//   It can return false even if they have support for speech i.imgur.com/2Y40n.png\n//  Testing with 'onwebkitspeechchange' seems to fix this problem\n\n// this detect only checks the webkit version because\n// the speech attribute is likely to be deprecated in favor of a JavaScript API.\n// http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/att-1696/speechapi.html\n\n// FIXME: add support for detecting the new spec'd behavior\n\nModernizr.addTest('speechinput', function(){\n    var elem = document.createElement('input'); \n    return 'speech' in elem || 'onwebkitspeechchange' in elem; \n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/forms-validation.js",
    "content": "// This implementation only tests support for interactive form validation.\n// To check validation for a specific type or a specific other constraint,\n// the test can be combined: \n//    - Modernizr.inputtypes.numer && Modernizr.formvalidation (browser supports rangeOverflow, typeMismatch etc. for type=number)\n//    - Modernizr.input.required && Modernizr.formvalidation (browser supports valueMissing)\n//\n(function(document, Modernizr){\n\n\n  Modernizr.formvalidationapi = false;\n  Modernizr.formvalidationmessage = false;\n\n  Modernizr.addTest('formvalidation', function() {\n    var form = document.createElement('form');\n    if ( !('checkValidity' in form) || !('addEventListener' in form) ) {\n      return false;\n    }\n    if ('reportValidity' in form) {\n      return true;\n    }\n    var invalidFired = false;\n    var input;\n\n    Modernizr.formvalidationapi =  true;\n\n    // Prevent form from being submitted\n    form.addEventListener('submit', function(e) {\n      //Opera does not validate form, if submit is prevented\n      if ( !window.opera ) {\n        e.preventDefault();\n      }\n      e.stopPropagation();\n    }, false);\n\n    // Calling form.submit() doesn't trigger interactive validation,\n    // use a submit button instead\n    //older opera browsers need a name attribute\n    form.innerHTML = '<input name=\"modTest\" required><button></button>';\n\n    Modernizr.testStyles('#modernizr form{position:absolute;top:-99999em}', function( node ) {\n      node.appendChild(form);\n\n      input = form.getElementsByTagName('input')[0];\n\n      // Record whether \"invalid\" event is fired\n      input.addEventListener('invalid', function(e) {\n        invalidFired = true;\n        e.preventDefault();\n        e.stopPropagation();\n      }, false);\n\n      //Opera does not fully support the validationMessage property\n      Modernizr.formvalidationmessage = !!input.validationMessage;\n\n      // Submit form by clicking submit button\n      form.getElementsByTagName('button')[0].click();\n    });\n\n    return invalidFired;\n  });\n\n})(document, window.Modernizr);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/fullscreen-api.js",
    "content": "Modernizr.addTest('fullscreen',function(){\n     for(var i = 0; i < Modernizr._domPrefixes.length; i++) {\n        if( document[Modernizr._domPrefixes[i].toLowerCase() + 'CancelFullScreen'])\n            return true;\n     }\n     return !!document['cancelFullScreen'] || false;\n});\n\n// http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/ControllingMediaWithJavaScript/ControllingMediaWithJavaScript.html#//apple_ref/doc/uid/TP40009523-CH3-SW20\n// https://developer.mozilla.org/en/API/Fullscreen\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/gamepad.js",
    "content": "// GamePad API\n// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html\n// By Eric Bidelman\n\n// FF has Gamepad API support only in special builds, but not in any release (even behind a flag)\n// Their current implementation has no way to feature detect, only events to bind to.\n//   http://www.html5rocks.com/en/tutorials/doodles/gamepad/#toc-featuredetect\n\n// but a patch will bring them up to date with the spec when it lands (and they'll pass this test)\n//   https://bugzilla.mozilla.org/show_bug.cgi?id=690935\n\nModernizr.addTest('gamepads', !!Modernizr.prefixed('getGamepads', navigator));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/getusermedia.js",
    "content": "// getUserMedia\n// http://www.whatwg.org/specs/web-apps/current-work/multipage/video-conferencing-and-peer-to-peer-communication.html\n// By Eric Bidelman\n\nModernizr.addTest('getusermedia', !!Modernizr.prefixed('getUserMedia', navigator));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/ie8compat.js",
    "content": "\n// IE8 compat mode aka Fake IE7\n// by Erich Ocean\n\n// In this case, IE8 will be acting as IE7. You may choose to remove features in this case.\n\n// related:\n// james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/\n\nModernizr.addTest('ie8compat',function(){\n    return (!window.addEventListener && document.documentMode && document.documentMode === 7);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/iframe-sandbox.js",
    "content": "// Test for `sandbox` attribute in iframes.\n//\n// Spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox\n\nModernizr.addTest('sandbox', 'sandbox' in document.createElement('iframe'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/iframe-seamless.js",
    "content": "// Test for `seamless` attribute in iframes.\n//\n// Spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-seamless\n\nModernizr.addTest('seamless', 'seamless' in document.createElement('iframe'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/iframe-srcdoc.js",
    "content": "// Test for `srcdoc` attribute in iframes.\n//\n// Spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-srcdoc\n\nModernizr.addTest('srcdoc', 'srcdoc' in document.createElement('iframe'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/img-apng.js",
    "content": "// Animated PNG\n// http://en.wikipedia.org/wiki/APNG\n// By Addy Osmani\n(function () {\n\n    if (!Modernizr.canvas) return false;\n    \n    var image = new Image(),\n        canvas = document.createElement('canvas'),\n        ctx = canvas.getContext('2d');\n\n\n    image.onload = function () {\n        Modernizr.addTest('apng', function () {\n            if (typeof canvas.getContext == 'undefined') {\n                return false;\n            } else {\n                ctx.drawImage(image, 0, 0);\n                return ctx.getImageData(0, 0, 1, 1).data[3] === 0;\n            }\n        });\n    };\n\n    image.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==\";\n\n}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/img-webp.js",
    "content": "// code.google.com/speed/webp/\n// by rich bradshaw, ryan seddon, and paul irish\n\n\n// This test is asynchronous. Watch out.\n\n(function(){\n\n  var image = new Image();\n\n  image.onerror = function() {\n      Modernizr.addTest('webp', false);\n  };  \n  image.onload = function() {\n      Modernizr.addTest('webp', function() { return image.width == 1; });\n  };\n\n  image.src = 'data:image/webp;base64,UklGRiwAAABXRUJQVlA4ICAAAAAUAgCdASoBAAEAL/3+/3+CAB/AAAFzrNsAAP5QAAAAAA==';\n\n}());"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/json.js",
    "content": "// native JSON support.\n// developer.mozilla.org/en/JSON\n\n// this will also succeed if you've loaded the JSON2.js polyfill ahead of time\n//   ... but that should be obvious. :)\n\nModernizr.addTest('json', !!window.JSON && !!JSON.parse);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/lists-reversed.js",
    "content": "\n// impressivewebs.com/reverse-ordered-lists-html5\n// polyfill: github.com/impressivewebs/HTML5-Reverse-Ordered-Lists\n\n\nModernizr.addTest('olreversed', 'reversed' in document.createElement('ol'));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/mathml.js",
    "content": "// MathML\n// http://www.w3.org/Math/ \n// By Addy Osmani\n// Based on work by Davide (@dpvc) and David (@davidcarlisle)\n// in https://github.com/mathjax/MathJax/issues/182\n\nModernizr.addTest('mathml', function(){\n\tvar hasMathML = false;\n\tif ( document.createElementNS ) {\n\tvar ns = \"http://www.w3.org/1998/Math/MathML\",\n\t    div = document.createElement(\"div\");\n\t    div.style.position = \"absolute\"; \n\tvar mfrac = div.appendChild(document.createElementNS(ns,\"math\"))\n\t               .appendChild(document.createElementNS(ns,\"mfrac\"));\n\tmfrac.appendChild(document.createElementNS(ns,\"mi\"))\n\t     .appendChild(document.createTextNode(\"xx\"));\n\tmfrac.appendChild(document.createElementNS(ns,\"mi\"))\n\t     .appendChild(document.createTextNode(\"yy\"));\n\tdocument.body.appendChild(div);\n\thasMathML = div.offsetHeight > div.offsetWidth;\n\t}\n\treturn hasMathML;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/network-connection.js",
    "content": "// determining low-bandwidth via navigator.connection\n\n// There are two iterations of the navigator.connection interface:\n\n// The first is present in Android 2.2+ and only in the Browser (not WebView)\n// : docs.phonegap.com/en/1.2.0/phonegap_connection_connection.md.html#connection.type\n// : davidbcalhoun.com/2010/using-navigator-connection-android\n\n// The second is specced at dev.w3.org/2009/dap/netinfo/ and perhaps landing in WebKit\n// : bugs.webkit.org/show_bug.cgi?id=73528\n\n// unknown devices are assumed as fast\n// for more rigorous network testing, consider boomerang.js: github.com/bluesmoon/boomerang/\n\nModernizr.addTest('lowbandwidth', function() {\n\n  var connection = navigator.connection || { type: 0 }; // polyfill\n\n  return connection.type == 3 || // connection.CELL_2G\n      connection.type == 4 || // connection.CELL_3G\n      /^[23]g$/.test(connection.type); // string value in new spec\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/network-eventsource.js",
    "content": "\n// server sent events aka eventsource\n// dev.w3.org/html5/eventsource/\n\nModernizr.addTest('eventsource', !!window.EventSource);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/network-xhr2.js",
    "content": "\n\n// XML HTTP Request Level 2\n// www.w3.org/TR/XMLHttpRequest2/\n\n// Much more details at github.com/Modernizr/Modernizr/issues/385\n\n// all three of these details report consistently across all target browsers:\n//   !!(window.ProgressEvent);\n//   !!(window.FormData);\n//   window.XMLHttpRequest && \"withCredentials\" in new XMLHttpRequest;\n\nModernizr.addTest('xhr2', 'FormData' in window);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/notification.js",
    "content": "// Notifications\n// By Theodoor van Donge\n\n// window.webkitNotifications is only used by Chrome \n//\thttp://www.html5rocks.com/en/tutorials/notifications/quick/\n\n// window.Notification only exist in the draft specs \n//\thttp://dev.w3.org/2006/webapi/WebNotifications/publish/Notifications.html#idl-if-Notification\n\nModernizr.addTest('notification', 'Notification' in window && 'permission' in window.Notification && 'requestPermission' in window.Notification);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/performance.js",
    "content": "// Navigation Timing (Performance)\n// https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/\n// http://www.html5rocks.com/en/tutorials/webperformance/basics/\n// By Scott Murphy (uxder)\nModernizr.addTest('performance', !!Modernizr.prefixed('performance', window));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/pointerlock-api.js",
    "content": "// https://developer.mozilla.org/en-US/docs/API/Pointer_Lock_API\n\nModernizr.addTest('pointerlock',!!Modernizr.prefixed('pointerLockElement', document));\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/quota-management-api.js",
    "content": "// Quota Storage Management API\n// This API can be used to check how much quota an origin is using and request more\n\n// Currently only implemented in Chrome.\n// https://developers.google.com/chrome/whitepapers/storage\n// By Addy Osmani\n\nModernizr.addTest('quotamanagement', function(){\n  var storage = Modernizr.prefixed('StorageInfo', window);\n  return !!(storage && 'TEMPORARY' in storage && 'PERSISTENT' in storage);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/requestanimationframe.js",
    "content": "\n// requestAnimationFrame\n// Offload animation repainting to browser for optimized performance. \n// http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/RequestAnimationFrame/Overview.html\n// By Addy Osmani\n\nModernizr.addTest('raf', !!Modernizr.prefixed('requestAnimationFrame', window));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/script-async.js",
    "content": "// async script\n// By Theodoor van Donge\nModernizr.addTest('scriptasync', 'async' in document.createElement('script'));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/script-defer.js",
    "content": "// defer script\n// By Theodoor van Donge\nModernizr.addTest('scriptdefer', 'defer' in document.createElement('script'));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/style-scoped.js",
    "content": "// Browser support test for <style scoped>\n// http://www.w3.org/TR/html5/the-style-element.html#attr-style-scoped\n//\n// by @alrra\n\nModernizr.addTest( 'stylescoped', 'scoped' in document.createElement('style') );\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/svg-filters.js",
    "content": "// Detect support for svg filters - http://www.w3.org/TR/SVG11/filters.html.\n// Should fail in Safari: http://stackoverflow.com/questions/9739955/feature-detecting-support-for-svg-filters.\n// detect by erik dahlstrom\n\nModernizr.addTest('svgfilters', function(){\n\tvar result = false;\n    try {\n      result = typeof SVGFEColorMatrixElement !== undefined &&\n               SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE == 2;\n    }\n    catch(e) {}\n    return result;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/unicode.js",
    "content": "/**\n * Unicode special character support\n * \n * Detection is made by testing missing glyph box rendering against star character\n * If widths are the same, this \"probably\" means the browser didn't support the star character and rendered a glyph box instead\n * Just need to ensure the font characters have different widths\n * \n * Warning : positive Unicode support doesn't mean you can use it inside <title>, this seams more related to OS & Language packs\n */\nModernizr.addTest('unicode', function() {\n\t\n\t\n\tvar bool,\n\n\t\tmissingGlyph = document.createElement('span'),\n\t\t\n\t\tstar = document.createElement('span');\n\n\tModernizr.testStyles('#modernizr{font-family:Arial,sans;font-size:300em;}', function(node) {\n\n\t\tmissingGlyph.innerHTML = '&#5987';\n\t\tstar.innerHTML = '&#9734';\t\t\n\t\t\n\t\tnode.appendChild(missingGlyph);\n\t\tnode.appendChild(star);\n\t\t\n\t\tbool = 'offsetWidth' in missingGlyph && missingGlyph.offsetWidth !== star.offsetWidth;\n\t});\n\n\treturn bool;\n\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/url-data-uri.js",
    "content": "// data uri test.\n// https://github.com/Modernizr/Modernizr/issues/14\n\n// This test is asynchronous. Watch out.\n\n\n// in IE7 in HTTPS this can cause a Mixed Content security popup. \n//  github.com/Modernizr/Modernizr/issues/362\n// To avoid that you can create a new iframe and inject this.. perhaps..\n\n\n(function(){\n\n  var datauri = new Image();\n\n\n  datauri.onerror = function() {\n      Modernizr.addTest('datauri', function () { return false; });\n  };  \n  datauri.onload = function() {\n      Modernizr.addTest('datauri', function () { return (datauri.width == 1 && datauri.height == 1); });\n  };\n\n  datauri.src = \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==\";\n\n})();\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/userdata.js",
    "content": "// test if IE userdata supported\n// msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx\n// test by @stereobooster\n\nModernizr.addTest('userdata', function(){\n  return !!document.createElement('div').addBehavior;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/vibration.js",
    "content": "// Vibration API\n// http://www.w3.org/TR/vibration/\n// https://developer.mozilla.org/en/DOM/window.navigator.mozVibrate\nModernizr.addTest('vibrate', !!Modernizr.prefixed('vibrate', navigator));"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/web-intents.js",
    "content": "// Tests for the ability to use Web Intents (http://webintents.org).\n// By Eric Bidelman\n\nModernizr.addTest('webintents', function() {\n  return !!Modernizr.prefixed('startActivity', navigator);\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/webgl-extensions.js",
    "content": "\n// Grab the WebGL extensions currently supported and add to the Modernizr.webgl object\n// spec: www.khronos.org/registry/webgl/specs/latest/#5.13.14\n\n// based on code from ilmari heikkinen\n// code.google.com/p/graphics-detect/source/browse/js/detect.js\n\n\n(function(){\n\n    if (!Modernizr.webgl) return;\n\n    var canvas, ctx, exts;\n\n    try {\n        canvas  = document.createElement('canvas');\n        ctx     = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n        exts    = ctx.getSupportedExtensions();\n    }\n    catch (e) {\n        return;\n    }\n\n    if (ctx === undefined) {\n        Modernizr.webgl = new Boolean(false);\n    }\n    else {\n        Modernizr.webgl = new Boolean(true);\n    }\n\n\n    for (var i = -1, len = exts.length; ++i < len; ){\n        Modernizr.webgl[exts[i]] = true;\n    }\n\n    // hack for addressing modernizr testsuite failures. sorry.\n    if (window.TEST && TEST.audvid){\n        TEST.audvid.push('webgl');\n    }\n\n    canvas = undefined;\n})();"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/websockets-binary.js",
    "content": "\n// binaryType is truthy if there is support.. returns \"blob\" in new-ish chrome.\n// plus.google.com/115535723976198353696/posts/ERN6zYozENV\n// github.com/Modernizr/Modernizr/issues/370\n\nModernizr.addTest('websocketsbinary', function() {\n  var protocol = 'https:'==location.protocol?'wss':'ws',\n  protoBin;\n\n  if('WebSocket' in window) {\n    if( protoBin = 'binaryType' in WebSocket.prototype ) {\n      return protoBin;\n    }\n    try {\n      return !!(new WebSocket(protocol+'://.').binaryType);\n    } catch (e){}\n  }\n\n  return false;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/window-framed.js",
    "content": "\n// tests if page is iframed\n\n// github.com/Modernizr/Modernizr/issues/242\n\nModernizr.addTest('framed', function(){\n  return window.location != top.location;\n});\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/workers-blobworkers.js",
    "content": "// by jussi-kalliokoski\n\n\n// This test is asynchronous. Watch out.\n\n// The test will potentially add garbage to console.\n\n(function(){\n  try {\n    // we're avoiding using Modernizr._domPrefixes as the prefix capitalization on\n    // these guys are notoriously peculiar.\n    var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder || window.OBlobBuilder || window.BlobBuilder;\n    var URL         = window.MozURL || window.webkitURL || window.MSURL || window.OURL || window.URL;\n    var data    = 'Modernizr',\n        blob,\n        bb,\n        worker,\n        url,\n        timeout,\n        scriptText = 'this.onmessage=function(e){postMessage(e.data)}';\n\n    try {\n      blob = new Blob([scriptText], {type:'text/javascript'});\n    } catch(e) {\n      // we'll fall back to the deprecated BlobBuilder\n    }\n    if (!blob) {\n      bb = new BlobBuilder();\n      bb.append(scriptText);\n      blob = bb.getBlob();\n    }\n\n    url = URL.createObjectURL(blob);\n    worker = new Worker(url);\n\n    worker.onmessage = function(e) {\n      Modernizr.addTest('blobworkers', data === e.data);\n      cleanup();\n    };\n\n    // Just in case...\n    worker.onerror = fail;\n    timeout = setTimeout(fail, 200);\n\n    worker.postMessage(data);\n  } catch (e) {\n    fail();\n  }\n\n  function fail() {\n    Modernizr.addTest('blobworkers', false);\n    cleanup();\n  }\n\n  function cleanup() {\n    if (url) {\n      URL.revokeObjectURL(url);\n    }\n    if (worker) {\n      worker.terminate();\n    }\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n  }\n}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/workers-dataworkers.js",
    "content": "// by jussi-kalliokoski\n\n\n// This test is asynchronous. Watch out.\n\n// The test will potentially add garbage to console.\n\n(function(){\n  try {\n    var data    = 'Modernizr',\n        worker  = new Worker('data:text/javascript;base64,dGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7cG9zdE1lc3NhZ2UoZS5kYXRhKX0=');\n\n    worker.onmessage = function(e) {\n      worker.terminate();\n      Modernizr.addTest('dataworkers', data === e.data);\n      worker = null;\n    };\n\n    // Just in case...\n    worker.onerror = function() {\n      Modernizr.addTest('dataworkers', false);\n      worker = null;\n    };\n\n    setTimeout(function() {\n        Modernizr.addTest('dataworkers', false);\n    }, 200);\n\n    worker.postMessage(data);\n\n  } catch (e) {\n    Modernizr.addTest('dataworkers', false);\n  }\n}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/feature-detects/workers-sharedworkers.js",
    "content": "Modernizr.addTest('sharedworkers', function(){\n  return !!window.SharedWorker;\n});"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/grunt.js",
    "content": "/*global module */\nmodule.exports = function( grunt ) {\n    'use strict';\n\n    grunt.initConfig({\n        meta: {\n          version: '2.8.3',\n          banner: '/*!\\n' +\n            ' * Modernizr v<%= meta.version %>\\n' +\n            ' * www.modernizr.com\\n *\\n' +\n            ' * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\\n' +\n            ' * Available under the BSD and MIT licenses: www.modernizr.com/license/\\n */'\n        },\n        qunit: {\n            files: ['test/index.html']\n        },\n        lint: {\n            files: [\n                'grunt.js',\n                'modernizr.js',\n                'feature-detects/*.js'\n            ]\n        },\n        min: {\n            dist: {\n                src: [\n                    '<banner:meta.banner>',\n                    'modernizr.js'\n                ],\n                dest: 'modernizr.min.js'\n            }\n        },\n        watch: {\n            files: '<config:lint.files>',\n            tasks: 'lint'\n        },\n        jshint: {\n            options: {\n                boss: true,\n                browser: true,\n                curly: false,\n                devel: true,\n                eqeqeq: false,\n                eqnull: true,\n                expr: true,\n                evil: true,\n                immed: false,\n                laxcomma: true,\n                newcap: false,\n                noarg: true,\n                smarttabs: true,\n                sub: true,\n                undef: true\n            },\n            globals: {\n                Modernizr: true,\n                DocumentTouch: true,\n                TEST: true,\n                SVGFEColorMatrixElement : true,\n                Blob: true\n            }\n        }\n    });\n\n    grunt.registerTask('default', 'min');\n\n    // Travis CI task.\n    grunt.registerTask('travis', 'qunit');\n};\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/media/Modernizr 2 Logo.ai",
    "content": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 18095/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\">\n         <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool>\n         <xmp:CreateDate>2011-03-28T13:28:59+11:00</xmp:CreateDate>\n         <xmp:MetadataDate>2011-03-28T13:28:59+11:00</xmp:MetadataDate>\n         <xmp:ModifyDate>2011-03-28T13:28:59+11:00</xmp:ModifyDate>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>40</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAKAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq+TfzF/5TvXf&#xA;+YyX/iWZmL6Q+o9k/wCK4/6oTP8AJn/yZWj/APRz/wBQsuOX6S4/b/8Aic/83/dBJ/OU00PnfX3h&#xA;do3GpXdGQlT/AH79xhiLiHK0EQdNjBF+iP8AuQitE/M3zvo7L9W1WaWJf90XJ9eMjwpJyKj/AFSM&#xA;BxRLVqOx9Nl5wAPeNvueu+Svzz0fVpEstcjXTL1zxScEm2c+5O8Z/wBao98oniIeV7Q9nMmIcWI8&#xA;cft/b+NnqAIIBBqDuCOlMqebdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVYv588+Wfk+ztbm5tZLpbqRolWJlUgqvKp5ZKMTI0HZdm9my1cjGJAoML/wChi9E/6tFz&#xA;/wAHHlngF3H+hXL/AD4/a8a8z6tFrHmHUNUijaKO9neZY2ILKHNaGmZEI0Keu0eA4sMYHcxFMi/J&#xA;n/yZWj/9HP8A1Cy5HL9JcDt//E5/5v8Augknnf8A5TTX/wDtpXf/ACffJQ5BzOzv8Wx/1I/cEkyT&#xA;mOxV6r+Un5qz6Vcw6FrcxfSZSEtbhzU27E7Asf8AdZ/4X5ZRlx9Q8x252KMgOXEPWOY7/wBv3voD&#xA;ruMxnhXYqwvz7+Z1h5Ou7W2urKW6a6jaRWiZVACtxoeWThAy5O37N7Inq4kxkBw97KNH1S11bSrT&#xA;U7U1t7yJJo/EBhWh9x0OQIp1ufDLFMwlziaXapqVtpmm3Wo3Tcbe0ieaU/5KCu3ucUYcRyTEI85G&#xA;mK+QvzOsPON3dW1rZS2rWsayM0rKwIZuNBxyc4GPN2faXZE9JEGUgeLuZpkHUOxV2KuxVjvnrzpa&#xA;+UNIh1K5tnuo5rhbYRxkKQWR3r8X/GPJRiZHZ2HZ3Z8tVkMIkChf3frT+GQSwpKBQOoYD5iuRcCQ&#xA;o0vxQ7FXYq7FXYq7FWOecPPug+UhZHVfV/052WL0UD0EfHm7VK7LzHSp9slGBPJ2Gh7Ny6ri8OvT&#xA;3sjyLr3Yq7FXYq7FXkf/ADkX/wAcTSP+Yl/+TeXYOb1Xsr/ez/q/peDZlPbuxVm35M/+TK0f/o5/&#xA;6hZcry/SXT9v/wCJz/zf90Ek87/8ppr/AP20rv8A5Pvkocg5nZ3+LY/6kfuCSZJzHYq7FX0h+Sfn&#xA;GTXPLjaddyc9Q0njEWY1Z4GB9JjXqRQqfkPHMPLCi+e+0GgGHNxx+me/x6/rei5W6B41+c9hDqHn&#xA;zylp89fRvHSCWnXjLcKjU+g5diOxeu7AyHHps0xziL+USnH5K6jc2kOq+T9Qal7olw/pKe8TsQ3H&#xA;2Em/+yGRyd/e4ntBiEjDUQ+nIPt/s+5d+dmqXMthpvlSwNb/AF24RGQf76RhStOgaQr9AOOMb33I&#xA;9n8IE5Z5/TjH2/2JV+UOmQaX5+806bb/ANzZqsCE9SI5ONT86YchsBye3Mxy6XDM85bsq88fmSmg&#xA;39voml2Tar5guwDFaISFQN9kuQCamleI7bkjIxhe/R1nZ3ZJzxOScuDFHqkd3+YH5oaDGNQ8yeWo&#xA;DpOxlks5PjiBNPjpJMNvcAe+S4InkXNh2Zos54MOU8f9Ic/sD0PRNc03WtKg1TT5RJZ3C8lY7EU2&#xA;ZWHYqdjlZFOh1GnnhmYTFSDz2f8ANPzRrmsXGn+RdGj1CC1bjLqFySIjvTkKPEApp8NWqfDLOAD6&#xA;nex7Gw4cYnqpmJl/COf3H7mK/mz5q8wXvlq30jzHo7aXqkd6lxHJG3qW00SxSoxRwWAKl1+Hkcni&#xA;AvYuz7E0eKGY5MM+OHDXcQbD2e81jT9G8vfpPUJPStLaBXkbqT8IAVR3ZjsBmOBbyOPBPLl4IC5E&#xA;sGtPPX5n6/F+kPLnly2TSWY+hJfSUklUGlV/eRAdPAj3OWGMRzLusnZ2iwHgzZZcfXhGw+wp55K/&#xA;ME63fXGi6vYtpHmG0HKWyckh0/njJp49PDcEjBKNb9HC7Q7M8GIyY5ceKXX9aC85/miPK/m6z0i4&#xA;s/Wsbi0+svLHVpvUYyrHGidDyeNRv44Y47Ft2g7H/M4JZBKpCVeXSyfgUb5a8z+cr6DVL3WtEXSr&#xA;OCD1tPjZiZHIDFhIa16AfsDIyAHItOr0mngYRx5OORNS7vh/axvQfzb80+YrD09D8u/WtVVyJ2L8&#xA;LSGPbiWdivJjv8NRk5Y6O5dhqexMOnl+9ycMOm3qPwROi/mX5qtfNVp5d85aRDYTX5C2lxbE8CzE&#xA;hOryhgzfDs2x7YDAVYLXqOycEsBzaeZkI8wf7B9ybfmZr9tpH6E9fS7XU/rd6sSfWkD+kxp+8jqD&#xA;RsjEXfucXsnTSy+JU5Q4Y3t18imvnDV/NenRWreXtIXVnkZxcK0gj4AAcTuVrXfBEDqXG0ODBkJ8&#xA;WfB3bWwnWvzO/MbRLI3uq+V4LS1DBPUe4BqzdAArEn6BlggCaBdxp+x9JmlwwymUv6rLdK826pc/&#xA;l9N5nvLFba6S0uLyO0qeLJErPGanejhQfpyHDvTq82ihHVDBGVx4hG/fz+TE7D82/Neu6XD/AIb8&#xA;um91MBjfSMWFrC3NgiBiU5sUAY/EOuTOMA7l2mXsTBgmfGycMOn849/fW+3J5H/ysXz3/wBX28/5&#xA;Gtl/hR7nqv5J0v8AqcfkgNW8z+YdYiji1TUJ72OJi0azOXCsRSorkowA5N+DR4cRuEREnuSvJOS7&#xA;FWbfkz/5MrR/+jn/AKhZcry/SXT9v/4nP/N/3QSTzv8A8ppr/wD20rv/AJPvkocg5nZ3+LY/6kfu&#xA;CSZJzHYq7FWd/krrL6d59s4uREOoK9rKP9Zeabf66LlWYel0ntBgGTSk9Y0f1/Y+msxHzl5H+an/&#xA;AJM3yR/zEwf9RaZdj5F6rsX/ABPP/VP+5Kp55/51P8zdG82J8Fhqg+p6mR0qAELN/sOLf7DBHeJD&#xA;Ds7/AArRzwfxQ9Ufx8/m35SH+LvzU1XzK/x6bog+p6ceql90DD/h3/2QxltEDvXW/wCC6GGH+PJ6&#xA;pfj5D4L/AMuf/Jqedf8AjIf+TxwS+kI7V/xLB7v0KX5fIlz+bnnC6vBW9gZ47YNQkRCXhyH+wRB8&#xA;jhn9IZdpnh0GGMfpPP31+u3ql5bW9zaTW1yoe2mjaOZW6FGBDA19sqeahMxkCOYeK/lrd3cX5V+c&#xA;BbOzQ24ujayGtRW3+IjwoAGy/IPUHr+1oROuw8XM8N/6ZmP5H21pF+XtnJCAJbiWeS5I6mQSsgr/&#xA;ALBFyGX6nU+0U5HVyB5ACvlf32lv/OQwH+DLI03/AEjHv/zwmyWDm5Hst/jEv6h++KF/Pee4TyRp&#xA;ESVEEtxH61DSpWFiqn8T9GDDzbfZuIOpmeoifvTu11b81IbaGG28s2C28aKkKreLxCKKKBv0pkKH&#xA;e4M8GiJJOWd/1Ur/AEF+YepeftF8x32kW+nrZfubp4LhHLwtyB5CtTQOclYAIcr8zpMelnhjOUuL&#xA;cXHqu8xxo/5++WldQyjTnYBhUVVbtlO/cEVGSj9BXSkjsvLX8/8A4h6Lrf8Axxr/AP5hpf8AiByl&#xA;5/B/eR94YH+QX/KCt/zGzf8AEUyzL9Tu/aX/ABr/ADR+lD/myq/42/L5qDkdRoT3oJ7Wn68lj5Ft&#xA;7E/xbU/1P97Nd+d3/TMf9tJf4ZHH19zH2e/yv/Cy9LmmighkmmcRwxKXkkY0VVUVJJPYDK3nYxJN&#xA;DmXkFlFcfmj5yN9OrDybokhWCJqgXEnXcf5fVvBaDvlx9A8y9XkI7N0/CP8AGMnP+iPx9vuej+dl&#xA;VfJOvKoAUabdgAbAAQPlcOYef7P/AMZx/wBeP+6CSfkuiL+W2klVALm5LkClT9ZkFT9AAyWX6i5v&#xA;b5/wyf8Am/7kPFv+VM/mV/1Z/wDp5tf+quZHix73sP5f0f8AP/2Mv1O/5Uz+ZX/Vn/6ebX/qrj4s&#xA;e9f5f0f8/wD2Mv1O/wCVM/mV/wBWf/p5tf8Aqrj4se9f5f0f8/8A2Mv1O/5Uz+ZX/Vn/AOnm1/6q&#xA;4+LHvX+X9H/P/wBjL9TKPyy/LLzvovnfTdT1PTfq9jb+v603r270528iL8KSMxqzAbDIZMgIoOs7&#xA;X7X02bTShCVyNdJfzgeoSvzV+Uv5g33mfV7210r1LW6vbmaCT6xbLyjklZlNGkBFQe4wxyRADlaL&#xA;tvSQwwjKfqjGIO0ug9yV/wDKmfzK/wCrP/082v8A1VyXix73J/l/R/z/APYy/U7/AJUz+ZX/AFZ/&#xA;+nm1/wCquPix71/l/R/z/wDYy/U7/lTP5lf9Wf8A6ebX/qrj4se9f5f0f8//AGMv1Jn5X/Kn8xdN&#xA;8y6VqE2klIbS8gmmYXNttGkis/2ZCfsg9BkZZIkFxtZ21pMmGcBPeUSPpl3e59GZivn7zrz/AOUv&#xA;MGreevK2qafa+tY6bPE97N6kacFS4V2PF2Vm+EV+EHLISABd/wBma3Fi02aEzUpg1sf5pDIPzF8r&#xA;t5l8pXumxKGvABNZVIH76PdRU7DkKrv45GEqNuD2VrPy+eMz9PI+4/i1P8tPKr+WfKVrY3EYjv5S&#xA;Z74Aq1JX/ZqtQeKgLse2GcrNsu19b+YzmQ+nkPd+N0p8leVtd03z/wCaNVvbX0rDUXJs5ucbcx6h&#xA;b7KsWXb+YDGRFBye0NZiyaXFjiblDnz7kN5z8keZLXzQnnLycY21MrwvrCQhVmAAFRUqp5KAGFR0&#xA;qDXDGQqi2aDtDDLD+X1F8HSXcgdU1b84fMlm2j2+gJoqXI9K7v5JRsjbNxNagH/JDHCBEb3bfhwd&#xA;n6eXiHJ4lco1+P0M28p+TdO8v+WF0JP38Tq/1yRhT1XlFJCR2BGwHhkJSs26bW6+efN4p2PTyrk8&#xA;/wBL0X8yPy+vrq10WxGveXrmQyQxcwroT9NVamx2INO2WExlz2Lvc2o0euiJZJeFlA380N530D82&#xA;vOWlQyXGnQ2tvFOrQaNHLH6m6ODPLJI6r8P2Qta/F0wwlGJbOztToNJkIEjIkbzo102AA/Fc3pPm&#xA;jynbeZPKraLdn0nKIYpgORimjHwt138D7ZTGVG3ntHrTp8/iR3/SGGaTqv5t+WLRNIu9AXXYLZfT&#xA;tL2CYKSiii8jRiae6g/rywiJ3unb58Og1EvEjk8InmCGR+UH/Ma91WbUfMcdvp2mtF6dvpMdJJA3&#xA;KokZwWoae/0DISro6/XDSQgIYSZzveXIe6vx70HrHlnXLj83tD8wQ23LSLOyeG5uecY4yFbkAcCw&#xA;c/3q9F75ISHAQ3YNZijoMmIn95KVgb/0fh0LM9Uhkn0y7hiHKWWGREWoFWZCAKnbrlbqMMgJgnoQ&#xA;xL8ovLms+X/KbWGr2/1a7NzJL6fNJPgZVANY2de3jk8hBOztO3NVjz5+PGbjwjv/AEqP5h+Wdc1f&#xA;zP5OvdOtvXtdKvTNfyc409OP1YGrR2UttG32QcMJAAs+y9ZixYc0ZmpTjUee+0v1t/mn5Z1vXP0F&#xA;+i7b6x9SvlnufjjTjGKfF+8Za/Rggav3I7H1ePD4nGa4oUOfP4O/N7SfOWsaHBpnlyD1o7hz+kQJ&#xA;I4m9NQCi1kdNmbrTww4yAd09h5tPiymeY1X07E7/AACR6DP+b2h6Tb6Xp/lCyjtbZeK/6TFyY9Wd&#xA;j6+7MdzhIiermamOgzZDOeaXEf6J/wCJZfInmjWPIOpwapYR2mu3lndwLZRSIy8nR0iAfmy/FUdW&#xA;yIoSdVE4cWqiYS4scZRN15i9qd+WWi6lovkjTdM1OH6vfW/r+tDyR6c7iR1+JCymqsDscchs2F7X&#xA;1EM2plOBuJr/AHIHV//Z</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:photoshop=\"http://ns.adobe.com/photoshop/1.0/\">\n         <photoshop:ColorMode>3</photoshop:ColorMode>\n         <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile>\n         <photoshop:TextLayers>\n            <rdf:Bag>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <photoshop:LayerName>Modernizr</photoshop:LayerName>\n                  <photoshop:LayerText>Modernizr</photoshop:LayerText>\n               </rdf:li>\n            </rdf:Bag>\n         </photoshop:TextLayers>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">Modernizr 2 Logo</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\">\n         <xmpMM:InstanceID>uuid:d2ad3950-7c02-824a-aed8-40a8f4f3f557</xmpMM:InstanceID>\n         <xmpMM:DocumentID>xmp.did:03801174072068118083F1FA8E5E4F1F</xmpMM:DocumentID>\n         <xmpMM:OriginalDocumentID>xmp.did:F77F117407206811BB3F9C0632107F53</xmpMM:OriginalDocumentID>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>created</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:F77F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T17:17:50-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:F87F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T17:18:53-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:F97F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:02:32-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:FA7F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:18:57-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:FB7F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:25:21-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:FC7F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:26:04-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:FD7F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:37:06-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>converted</stEvt:action>\n                  <stEvt:parameters>from application/vnd.adobe.photoshop to application/pdf</stEvt:parameters>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>derived</stEvt:action>\n                  <stEvt:parameters>converted from application/vnd.adobe.photoshop to application/pdf</stEvt:parameters>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:FE7F117407206811BB3F9C0632107F53</stEvt:instanceID>\n                  <stEvt:when>2011-03-27T18:37:07-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Photoshop CS5 Macintosh</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:03801174072068118083F1FA8E5E4F1F</stEvt:instanceID>\n                  <stEvt:when>2011-03-28T13:28:58+11:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>uuid:edd0f61a-a49d-1d49-acc4-68ea7894e484</stRef:instanceID>\n            <stRef:documentID>xmp.did:F77F117407206811BB3F9C0632107F53</stRef:documentID>\n            <stRef:originalDocumentID>xmp.did:F77F117407206811BB3F9C0632107F53</stRef:originalDocumentID>\n         </xmpMM:DerivedFrom>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n         <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\">\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>600.000000</stDim:w>\n            <stDim:h>88.799805</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n      </rdf:Description>\n      <rdf:Description rdf:about=\"\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\">\n         <illustrator:Type>Document</illustrator:Type>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\rendstream\rendobj\r3 0 obj\r<</Count 1/Kids[7 0 R]/Type/Pages>>\rendobj\r7 0 obj\r<</ArtBox[0.0 1.36328 583.011 88.7998]/BleedBox[0.0 0.0 600.0 88.7998]/Contents 8 0 R/LastModified(D:20110328132859+11'00')/MediaBox[0.0 0.0 600.0 88.7998]/Parent 3 0 R/PieceInfo<</Illustrator 9 0 R>>/Resources<</ExtGState<</GS0 10 0 R>>/Properties<</MC0 5 0 R>>>>/Thumb 11 0 R/TrimBox[0.0 0.0 600.0 88.7998]/Type/Page>>\rendobj\r8 0 obj\r<</Filter/FlateDecode/Length 1080>>stream\r\nHVˎ$5\u0010WTL}e@VhŁ\u000fh1,KDY\u0006K|83\"^~~u/^}ë[ī\u0004'߀cy\u0017q|s\n,\u0017ך'pk\u0018{}1\f\r\u0013<|\u0006ŗm|Cƭ\"\b8V<#n)#T}Uz\u001b|i\u0000~#ry\u001e\u001e1cM|\u001dmE{M^\n'\u00078_U}K\u000epo(/շl'\u001c\u0007&\u001f^h^bv+.:ܩL\\>\tVH}\rPZaY}I-Y\u00129{p1u#B F_\u001cW\u0016\u001fSa\u00184dM\u0006(N\u0015\u0014}G\u000ej\"\u000bB6eu}\u0005z#\u0019]댫pb\n[R\u001eLRx\u0006y\u0013\u00158n\u0007B%?˜\u001b\u0015\\\tfi\u0005K\u000bGDL\u0010&\u001d\u0007\r\u0013nK>k\u001fk9\nb\u0017Q|\u001a*6\u001brFF\u001cu\u001e|Ek\"\"#b\u0000\u0003\u0015\f\u0010|edt\u0018\u001e%c:Z&\bҘᄧpT-A-O\u001aM7E>۹\u0006Ch=k^5\u001aIp_]\u0002\nA\f##y0-¹b\rE\fN6\t7p6\u0002Rĵߠc㚪ǁk\u0006ƦFw\u0011JqgL\u0005~h[B_Ay\fX\"H<G\u0015,%\u0005#\u001c\u0010\bD\r5\rM\r\u000e\u001ag7Eg\u0000\u0003L\u0019V,p\u0005FȐP\b8 RW(,\u001bHNY\r\u00185ռ\u0015UCV433Z\rwd\u0011\u001d\u000e)#AW7,P\fm!?ī\u001c-\u001a[&~6PΞ\bt\u001e\u0001\u0018UfWdv1X =G\u001eIߟ\u0004*Q\u0001fyt@Ԣ\u0014>5\r=9R)ER@598\u0006-FlF1\u00029'NOEY/\u000eA0eu\u001e\u0019T1_0,uw\u0007gIv\u001c̶yٖA4?dl\n/\u0011-\f\u001dG!\u001cN{S:\t\u000bZ#r\u0019\u0003tg\\fg\bL\u0016\u0005\u0013d\u0003W\u000e/hAGrZ \u001b\n\u000b+6;a3F\u0018\u000e@\u0003\u001ae\u0016˞\u001c?~\u001f\u0001\u0006\u00000\rendstream\rendobj\r11 0 obj\r<</BitsPerComponent 8/ColorSpace 12 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 11/Length 217/Width 75>>stream\r\n8;X.*5o.B]#Xe'qAYk1P*4a@.!l]_ep/*-_RXPW`fG[D6f.h*1a7H@op([&VW*Y^*\nW0WFo2Q9;Fb+MFP43tonNU43q7k''P:'9+35\"AmKh.O9'J#%\\IT$_Z*W;Z'Oj7LaA\n9^>Zd/+=U[R&s-+Brt<DrD5OMUCQS3iH5`HV\"Ec'MamVcE^1X21/>.'Lp'%G5RL>:\n;0\"gleOf`E!,b_4ci~>\rendstream\rendobj\r12 0 obj\r[/Indexed/DeviceRGB 255 13 0 R]\rendobj\r13 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\rendstream\rendobj\r5 0 obj\r<</Intent 14 0 R/Name(Layer 1)/Type/OCG/Usage 15 0 R>>\rendobj\r14 0 obj\r[/View/Design]\rendobj\r15 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>>\rendobj\r10 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r9 0 obj\r<</LastModified(D:20110328132859+11'00')/Private 16 0 R>>\rendobj\r16 0 obj\r<</AIMetaData 17 0 R/AIPrivateData1 18 0 R/AIPrivateData2 19 0 R/ContainerVersion 11/CreatorVersion 15/NumBlock 2/RoundtripStreamType 1/RoundtripVersion 15>>\rendobj\r17 0 obj\r<</Length 969>>stream\r\n%!PS-Adobe-3.0 \r%%Creator: Adobe Illustrator(R) 15.0\r%%AI8_CreatorVersion: 15.0.2\r%%For: (Marc Edwards) ()\r%%Title: (Modernizr 2 Logo.pdf)\r%%CreationDate: 28/03/11 1:28 PM\r%%Canvassize: 16383\r%%BoundingBox: -1 1 584 89\r%%HiResBoundingBox: -0.000488 1.36328 583.0107 88.7998\r%%DocumentProcessColors: Cyan Magenta Yellow\r%AI5_FileFormat 11.0\r%AI12_BuildNumber: 399\r%AI3_ColorUsage: Color\r%AI7_ImageSettings: 0\r%%CMYKProcessColor: 1 1 1 1 ([Registration])\r%AI3_Cropmarks: 0 0 600 88.7998\r%AI3_TemplateBox: 299.5 44.5 299.5 44.5\r%AI3_TileBox: -103 -235.0996 680 323.8999\r%AI3_DocumentPreview: None\r%AI5_ArtSize: 14400 14400\r%AI5_RulerUnits: 6\r%AI9_ColorModel: 2\r%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r%AI5_TargetResolution: 800\r%AI5_NumLayers: 1\r%AI9_OpenToView: -70.5 304 2 1572 1032 26 0 0 66 96 0 0 0 1 1 0 1 1 0 1\r%AI5_OpenViewLayers: 7\r%%PageOrigin:228 -28\r%AI7_GridSettings: 144 144 144 144 1 0 0.8 0.8 0.8 0.9 0.9 0.9\r%AI9_Flatten: 1\r%AI12_CMSettings: 00.MS\r%%EndComments\r\rendstream\rendobj\r18 0 obj\r<</Length 5017>>stream\r\n%%BoundingBox: -1 1 584 89\r%%HiResBoundingBox: -0.000488 1.36328 583.0107 88.7998\r%AI7_Thumbnail: 128 20 8\r%%BeginData: 4872 Hex Bytes\r%0000330000660000990000CC0033000033330033660033990033CC0033FF\r%0066000066330066660066990066CC0066FF009900009933009966009999\r%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66\r%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333\r%3333663333993333CC3333FF3366003366333366663366993366CC3366FF\r%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99\r%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033\r%6600666600996600CC6600FF6633006633336633666633996633CC6633FF\r%6666006666336666666666996666CC6666FF669900669933669966669999\r%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33\r%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF\r%9933009933339933669933999933CC9933FF996600996633996666996699\r%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33\r%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF\r%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399\r%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933\r%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF\r%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC\r%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699\r%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33\r%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100\r%000011111111220000002200000022222222440000004400000044444444\r%550000005500000055555555770000007700000077777777880000008800\r%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB\r%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF\r%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF\r%524C45FD0CFFCA8EB78EB78EB7FFCA8EB794C3C4FD72FFA1958E948E9594\r%FFA1958E948E958E9BA1FD6FFFCA8EB794958EB7FFC48EB794958EB78E95\r%94CAFD6DFFA1948E958E948EFFA1948E958E948E958E948EC3FD6CFFCA8E\r%B794B78EB7FFC48EB794B78EB794B78EB78EBDCAFD6AFFA2948E958E9494\r%FFA1948E958E948E958E948E958E95A8FD63FFC49BC39BBD9BBD8E958EB7\r%8E95FFC48E958EB794958EB794958EB78EBDCBFD09FFCABD9BCBFD06FFCA\r%BD9BCBFD13FFCA9BFD1EFFCAA2FD16FF9A948E948E948E958E948E9494FF\r%A1948E948E958E948E958E948E958E9BFD09FFCA8E949BFD06FFA18E94A2\r%FD13FF9B94A8FD1DFF8E94A8FD15FFBD8EB794B78EB794B78EB78EB7FFCA\r%8EB78EB794B78EB794B78EB794B78ECAFD08FFCAB78EB7CBFD05FF94B78E\r%CAFD13FFC48EFD1EFFCAA2FD16FF9B948E958E948E958E948E9594FFA195\r%8E948E958E948E958E948E958E948EFD08FFCA8E9B8EC4FD04FFA1949B95\r%A8FD04FFCAA1C4A2FD07FFA1C3A1FFA194A8FD04FFCA9BC3A8FD05FFA8FF\r%A8C4CAFFA2FFFFC49BC4CAFFFFFFCAFFFFFFA8CAA2CAA2CAA2FFFFCBA2FF\r%CAC4FD06FFC38E958EB794958EB794958EB7FFC48EB794958EB794958EB7\r%94958EB794959BFD07FFA8B7A1BD94FD04FFBD9BCA8ECAFFFFFFC38E958E\r%B795FD04FFCB94B7949594C38EFFFFFFCBBD8EB794959BFFFFFFA1B7A195\r%8EFFCA959BBD94958EBDFFFFFFBD9BFFFFBD8E958EB78E95CAFFA195A1B7\r%8EFD06FF9B948E948E958E948E958E948EFFA1948E958E948E958E948E95\r%8E948E958E94A8FD06FFCA8EC4A294A2FFFFCA8EC4A294A2FFFF9B8EC4FF\r%FFA19494FFFFFF9494A1FFCBC48E95A8FFCA9B8ECAFFFFA1949BFFFFC38E\r%95A1CBFFCA8E94A1FFFFC38EC4FFFF949BFFFFA8CBA8FFA1949BFFFFC48E\r%95A1FFCAA2CAC4CAA2BD8EB78EB794B78EB794B78EB7FFC48EB794B78EB7\r%94B78EB794B78EB794B78ECAFD06FFCAB7A1FF8EC3FFFF9BB7FFCA8ECBFF\r%FF8EC4FD04FFC495A1FFC495A1FD04FFC48EFFFFCA8ECBFD04FFA1B7FFFF\r%A1B7CAFFFFFFCA95A2FD04FFB7A1FFFFBD9BFD06FFB794FFFFFFA1B7CAFF\r%FF8E948E958E948E958E948E958E948E958E9494FFA1948E958E948E958E\r%948E958E948E958E9494FD06FFCA8EC4FFC38EFFFF949BFFA194A2FFA194\r%A2FD05FF8E9BFFC38EFD05FFA195CAFF9B95A2CAA2CAA8C38ECAFFC38EFD\r%04FFCA8EC4FD04FF8EC4FFFF94BDFD05FF9B8ECBFFFFFFC48EFFFFFFB78E\r%958EB78E958EB794958EB794958EB78E95FFC48E958EB794958EB794958E\r%B794958EB78E95CAFD05FFCA95A1FFCA95A1CA8ECAFFCA8ECAFFC48EFD06\r%FFBD9BFF9BB7FD05FFC48EFFFFBD8EBD95BD94BD95BDA2FFA195FD04FFA8\r%B7C4FD04FF95A1FFFFBD9BFD04FFC48EC4FD04FFA1B7FFFFFF8E958E948E\r%958E948E958E948E958E948E9494FFA1948E948E958E948E958E948E958E\r%948E948ECAFD05FFCA8EC3FFFF9495949BFFFFA194A2FFA194A2FD05FF8E\r%C3FFC38EFD05FFA194A8FF9B94A8FFFFFFA8FD04FFC48EFD04FFCA8EC4FD\r%04FF8EC3FFFF949BFFFFFFCA8EBDFD05FFC38EFFFFFFB794B78EB794B78E\r%B794B78EB794B78EB78EB7FFCA8EB78EB794B78EB794B78EB794B78EB794\r%B7A1FD05FFCA95A1FFFFCA8EB7C4FFFFCA8ECAFFFF8EBDFD04FFA1B7C4FF\r%CAB7A1FD04FFC38EFFFFCA8EC4FD08FFA1B7FD04FFCAB7C4FD04FFB7A1FF\r%FFBD9BFFFFFF94BDFD06FFA1B7FFFFFF8E958E948E958E948E958E948E95\r%8E948E9594FFA1958E948E958E948E958E948E958E948E958EC3FD05FFCA\r%8EC3FFFFFF958EFFFFFFA195A8FFFFC48E9BA8CBA1949AFFFFFF94949BCB\r%A8BD8E94A8FFFF9B8EC4CAFFA2959BFFFFC48EFD04FFCA8ECAFD04FF8EC3\r%FFFF949BFFFF9B949BCAA1C4A1FFFFC38EFFFFFF9594B7949594B7949594\r%B7949594B7949594BDFFC48EB7949594B7949594B7949594B7949594B7A1\r%FD05FFCAB7A1FFFFFFA1C3FFFFFFCA8ECBFFFFFFC48E958EB79BFD05FF9B\r%B78E959BC494FD04FFC38EB794959BFFFFFFA1B7FD04FFCA95A2FD04FFB7\r%A1FFFFBD9BFFFFBD94958EB78E95CAFFA195FFFFFFCAFFA8FFCAFFA8FFCA\r%FFA8FFCAFFA8FFCAFFA8FFFFFFA8FFCAFFA8FFCAFFA8FFCAFFA8FFCAFFA8\r%FD07FFA8FD0BFFCAFD05FFA8CAA8FD07FFA8CAA8FD09FFA2CAA8FD05FFA8\r%FD05FFCAFD05FFA8FFFFFFA8FFFFFFA8FFCAFFA8FFCAFFFFFFCAFFFFFF\r%%EndData\r\rendstream\rendobj\r19 0 obj\r<</Length 21034>>stream\r\n%AI12_CompressedDataxݽZ2K(\u0000\u0000*\n\u0002M\u000f**N8\f\bZǾSSP=\u0000yu-o.T*J8ԼN\u001c]1!0l0\u0010\u000e$3\u001bK ~\u001a<\u001e\u000eә\u001eEA.Ͱ8V\u001aDi:\u0018\n\u0015*u#\u001d?\u0006#Qxq3\rEj\u0017 \u001fl?̤\u001eUQ\u0003rg\u0006\\\u0015\u001c\u0017\n|.<C\r::5\u0011r\u0002<+`Q\u001c\u0010L@`:\n>\u0012,òl*\u000br\u0011\u0000n:\u0007l0c|\u000e~V\u001e?h֔=q:-ciZ\btF\u0007\u0004\u001fpw\u0000\bnW\u0007C\u0011ә\u00059\u000e`?tEϣB\u001b\u0003\u0002\u0014\u0000>\u000f<\u0016g3(B$.==\u0011+Eď\u0001\u0014 KT,'?\u001d\u001b\u001c˰>$F\f\u000e|>Ϥ\u0014?*`4\n-Y!\u0005|>\u0013ؠ\u000bL.E@\u0010<\u001fD$GZT\n:oCQ\u001d\rf\fzixb\b\u001d~_\u001dv>\u0000\u0000#}3p>S1\u0000\u001b?\"2NFp1\u0011G7\u0016c\"p\u00056\u0005ǥ\u0015 \t3\u001aJN+CFp\u0010\u0014\u0015|\u0016\t\u0013w!\r>\u0006\u0002\u000fs֤A_P \u0011.g3q\f\u0001ةtF\u0007˜]\u0003ʨ_\u001a)\u0000L1\u0002\u0019?wg\u0006~>0[Mi0B0\u0003M\u001cUM\u001a'ǣq \"\u000b\u001bӃf؛jV\u001e蟮烙t\u0006# \u0018$\u0006cUe\u001dsie8\u001cO\bړΨ\u001fH\u0013wagԑ\u00061\u000btF:l\u0007%\u0013 \u0018\tnbBЀx\u0001Qg\u0019,\u000e\u0011\u001633wx=}R(ͧx5Ҡ+S߁0\u0018\u0004bR\u001a1at\f\f\u0019\u000e\u0007\u001fRg9!yaa??p0xHAo(^\u001f'h\u001a\u0011*A,ގ&H\b^v&\"9\u001at\u001b$0)c\u0013\tgᛗߠsg(N\u0003\u0011\u0012,\u0004\"O :%\u001aLw~`<\u001e.MEUvot\u0015PwӀ?\u0004>|a\u000b\u0005^`\u001f\u001e_\u0005Іw\u000f$e\u0013\b&\u0001/{\bC:fg\b[{\u0006h\u000b4`Qj@!Qa!a\u0003t\u00017Xd8V~%3\u0016\u0002)\u0001!\u0005WU\u0002\u0013\bwNmCH\u001c烹TcH#K^as\fPa@Gj9C\u001as\u0007\u0002ۄl0Y\u0004\f}\u000fNt3\u001fbkM\u001bVH\u0015cT\u0007TI3\u0004\u0018VZw\f\u0014<\u000fI\u0014\u0015x(<\f\u0005\u0014Um(\r]\u001exb\u001cm\u001ft\u001d\f\u0007?׳\u000eZ~Fv-ƣY\u001c4T<\r2K\u0014g\u0012Ҍ\"\u0019A\u0002\u0019gp4+!_L#Iso8e\u0000X\u0007HNwl鿡\u0013}oRaGo\u0004+SRWY`\u0010\rA\u0005\u0006\fu4_Y´6\u0014$\u0013yH\u001e߸w39{)\b\u001dJcw\u001a1X\u0003(mx\u0018^qA.\u0003cѪ; G*r\u0014Vf\u0018{b}|Fű',7/\u0016D2}\u000e8\u001d\u000ez@s'brL.Hwg.ˤLZV5v:\u0013\u000fOQɮ{\rK~:\"x6O\u001b\u001f\u0013\u0016_6?vcb\u0018Y>4~:F\u000b6\u0015up>`VdYu}\u001f\u001d7;\u0012LLTUǣ\nuN?&54oȭ\t-eS[P\u0012SW\u0014~pz3bxk?ql]>\u0012x>\u001b\u000eFbp&ꩲm9Io:\u001cqo8\u0004{cd'(\u001fЕ)A=aeԙP\u0013X\nv;Ψg\u001f\u0019hR}0\u0014IR[[}\u000ez6-m{,J_4A\u000eĩ\u0013:\u001c%Gߗ\u000b\u0014\u001cLh8EC\\\u000f|y<RQ4\u001f\t\\ƓcRsϕ˹L\u0016pyoNAluF't޻I\u000e{\u0004F\bMC>btOk\u0007L~\u0006\u000f\u0007;C\u0011G\u001aY,Z7:\u0003£\u0007p\rA\u0014\u000eo]Md\u00036*vvzch҅=s\u0003ћ6?B\u000e\u0005!0˝p,JdȏڑI7-d<dqh>\u001bk,\u0011\u0003\u0019Qv\u001dbЖfL\u000f?\u0004#\u0013Ѡ\u0007\u001b*J\u001ep@I&Bب߀\u001cKk\u0014_\u0001]*\u000f3]R\u000f,``\"\u000e\u0017A_\"v\u0002F`\rRb>Xq\u001b,Ccwa_XE\u0004>:5,M4bi\u0003Oyu<\u001d\\}\fd\u001c}Hm'}*jCkZ[\u001cUܠv񜤹AFt.\u001c\u001aD3<rhIbˀl4\u00186*זR\\6,ܔ\u001c\u0017]\u0002Β֡);\u0002G\u0002TA{I<Fg1|x\u0013((Q\u00039l`=Tu\u001bz`!up\u000b(H\u0012;GVi?D\u0011\u001aYՒ=?P6j\u000f@&O?g\u001dI`Q!)MApތd\u0013Tx:D?\b\u001c;TY7\u0005q\buP+;J\\g̜\fSG\u0003`\u0017V\"<\u001f\f)a;4P4I\u0000q\u0018\n\\Q6/u\u001aw\u0019I\u0004a*Q\u001b3~\u000f&];a[3\u001c\u0010\u0000V\n\u001f7Qဖ3t^\u0012\u001dV\u001fs9\u0019wQO\u0010Q׺F (z%dD\u0014#4\"iRJyUdK\u001eȑ\u0017n\u0005\u0007#l\"Ƶqk[\u00189Db\b\u001f\u001dQ-\u001aݔ~vg\b\u000b\u0002èfj7\u0001?\u0013FL\u001c\u001d)a*EH\u0007#\u0017AϤ\t\u00002\"\u001cua\u0001lO{b\b`)\u00193:fL8\u0016D\u00052\rtޝ:#H8}K~1ˇَ\u001d뙽4vs'\u0007(8z-||38|Hl<v\bQ4\u0013\u001cwe\u00041)\u0016ݡ(\r]Vn[,r\u0019Os\u0006S\u0007MHN!\u0011=\u0000)\u0006NRͶ4uxd+,>\u001f\\:!\u0011'L'\u0001F\\$(m#\u000ef?YQ\u0007&PPߓ=\u0001\u001c34\u0017dЅ!S\u0014\u0001_[\u0002>agE!0\t0W%uqb\u001d\u000e؇\u001eljh:aQ\u0019sJ3m\u000e\u0014L{vL=;l;V(Ӎ\u000e҇\n˱ͧ;\u001e\fx&$zC\u001f9{&\u0019D\t\u0007Kw9\u0019oo<\u00023s\u0010ф\u0000?mNZ\u0012Y\u0004/N\u0007\u001f#\u0017a\u001b;(y\u00067`\u0016WTO;ǋ\u0015!\u001e,M\u0013\u001d6RF\u0004\u000fv\u0004\u0012hNT\u0003 D$\u0003kkTuD0,\u0015\"Q{?M\u0004*LϬt\\$\u000et6TQchc \u0001>\u0001\u0003H\n\u0003(tC.\u001d\u001b\u0001f\u0007\u0007D8v75\ruSHܘ\u0015̓\u001d \u0013.|\u0010ĿD\u0007ZgNՍd⨚ d.b^/ TGڐ׍~\bPo\u0011Q\\\u001d\u0010pX\u0010ѽ\u0007\u0004u\u0003\te]!?\u0010v\u000b@a:\u0012\u0001a;T\u0006Z\u000b\u0013\"\u001b89?\f>/\u001c]\u001f44\u001b\u0002Hjޝ$Һ\u000f98\u0004Tʁn9ŁfYo\u000fr\u0011<D\u0007\u0017_b|:cT0\u0005PַAmךGt6\u0018)'zÁFJןs2U|V\u001a\u000e0\"9\u001fijH\u0019\"r1Pi3KXNMtr\b\u0002``H\f07tGCX9KmKS\u0011\u000b\u001b\u0017{IҔ\u0012Ӽ`5\u0016='l<\u001a>h;1N\u001ed\u0015~\f\u0002]4n_ӽ]<e\u001aה\u001d|Qwz$\u001d\u0010,[#\u0004=\fϝJG;s+\f}<\u0018$\u001fr֑uVݰG=i\u001e\u001cBQ1\u0011i}XS|B_٧\u0018TԮT\u0006\"8\nN;!\u0011yQK\u0010,ؙJ\u0006z\u0005B1AX\b$5\u00023\u0007'0QPD\u0002\b\f3\u0018C\n\u0002Q<\bȴ\u0000\u0018\u0001>\u0004?(3ɱ\u0011y\u0013uxTƖ\u000eF6Y\u0005{58~\u000f\u001beD3ި\u000b{`bU\u001c\u0004-ʟ3\u001b:B@_#-gb\u0017ً\u0011ingM:\u00137\u0012p̼*\t֫YL34>L+Ё<*\u0012:3s\u001du\u0006C'\u001fa=MUtw\f7\u0006\u0015\b\u0010ч\u0016;qQz\u0001leǎ\u0007\u0012i-jG\u001c.nlTx\u0005\r\u001a\u0017MmGrȎhn_悳y\u0003oP\u0004:\u00019v̬!֟0՘؃r\u0012謞g@;B\"57\b<UfY_\u0019\n\u0003wd\fر\u001a\u001e(P/K*]\u000bޑO{t]:>Υ\"\bjl?\u001dI6\u0019;\u000e>g\u0002ħv/\u000bR_\b\u00077b=__uþ]e>CQ\u0017J$\u0002Pl{7\u0014=̇\u0003x΄bu(~v_\u000e%3M=D0t\u0014LM\u0019t:x\u00179!y<&ުl-\u0002aI\u001e''~{TǏVEz~dˏՇ^>ʎ\u0014,\u0001IR*\u0014o\u001e\u0012D.\u00141hT9\u0012Pt=\fEg\u0001\u001aZ\u001cZ*~>\u0015#Gx\u0018Ɨ>@\u0018\u000fi\u001az*[keS#&9+|\rCY\u001dFc*I;Ӗ<̝ԵLTNpx\u0019\u0000&)qϛR>dFn\u001eۯ6HS\u0011\r6!Uǒ'-c>&\u001f뭇&`\u001d~tb4KRf[i\u0013R\u0005M=<b\u0016Z+1\u0012vvH{NEɧ\u001e*xUڌ5gk5~[tEs\u001a[t맠 mnma\u00182J~b݊qVrFzI͘ۄ=I$\u00106Ցfٝu\u001aҞ푞W33\u001di OU\u001a\u0001?\u001e푦\u000f-ҵj'\u001d\bВzzY ͬӹ\u0001\u0005Cont0\u0016\u0002mmco!~\"]Zԑn&B2aѬE\u0003a|n[Zo+5;1#m\u001c(H\u001f\u0012\u0011Hiyԑ\u0002c},ˬ=y\"\u0018u*@ǚz׍߹=SQ\u001el\u001c\u000fu0/Fg7\u001a2b_H\u001b~{{\u000e)Hޔ:VDlOhHػA\u0012;I%4\u001061~JEv(R>gؗ[\u000e)\u0010>\u0012ME:\u0016\u000f\"\u001f4g[QH\u0011-v?<C*Iu\u0005iW\u0016M,]\u0011dYMGPA\u000b%\u0016[^E~_+tO24C\\A6!\r?c0_|\u0002⊭?\u0010҄U\u0014'ԝ43Rbd\u0007J\\G\n299MncT\u00126\nS(\u0014c{'4iE\t=$dB\u001a\u0017\u0018)%c\u001ax-#=m4[9s7,oO/ڎ7CBgbT\u0014\u0016~Z\u0019\u0006X^Tmqm\u001c\n<~k\u0015\u0007l E{{6\u00196\u0010y_bBw9گ+E^g\u000e\u0014g[!ʯ\u0018,B{foC\u0010\u000be\u001e*ﭒζnC{[BCoOGmTYߟwJ&}b_\u001fMou=gٗ8yvG=dۙv-X4}'3:W|^sk'T7?\u001f\u001eN7ߦ_G7;G\u001ai3\u0015=:U\u0004,HݰG!~/5K>~6\fNߦ avK\u0015ؾR,>hH&V\u001cOe鵿7\t\u0013YY,*da)(I\u0007\\09*Uo\u000e\u000fظ,?Vv\u0019xVKEW*\u00151D[xz#\b\u0016O~dsv2|f,7\u0002\u001b~\u001d\u0010ﻚͺ\u001cu\u0002*`\u0014\u0006a-[{̈́j\\\u0019}VE\u000eHS\u000ftk~҄\u0014v1\r-[)^Rb|18А9 %}#TC*\u0018Ǝ64w-B\"M]o\u0004:Zi1T(H\u0004\u001ei\t[I$Z\u0003x*Rl;P\"ˡ#\u0018Њt{:RP\u001b\b#M\u001beV\u000bq\u0005=y\u001d0J\u001dO\u0010S\roM\u001d\u0016Xod\u001e\"ҭNz*)߹*bO\u0016.*e\u0015oI\u0017EP<D\u0013r=F\b\u0015onQ.}H\n&$\u001d\u000e?h:BO\u0019YUHwr8jM\u0019Vt˺oA2Wyd?2`'~6#8G\u0000\u001cX2\u0010{1)\u000f\u0001{)\tKJ\\Г#\u001c*\u0013}2>lێ\u0019ǇJ\b?W\td3c_{$Edr}LM|}\bwb>Eg\t!qbw{f=L9K+žsk\u000f\u001e(Lw\u0003a̋;\u0019[DC|b@\u001e\u0007~fQ#@h]6&Jڪ|ϨQ:\u0002\u001dQh6<L\u0014R6|lv6<\f-\u00106\r0ĺ?bܟDw'45\u0002avjS\u001e=VXq}<lx\u0007\u0011Z\u001f\u0004{>ntu`U\u0010Mߥa,6ɲ}c\u000b;\u0002\"vd&u=n\u0019t~O\u0015\u001d=\u0002],$c9hܩ/\">d\u0012d\u000f<eB\u001f\u0013\u001b0>\f4\u0017#Kز z\u0016}/1OA^\\ia\u00143NI2%9ys\u0016=.\u00066&[Ѩ1[3IU*\u001b׸V݃k\u0017*\"V>FnĹK\u0012N}4m\u0019Wa\u0000z~o8*\u0016.:?9.*CrӾ]\r0V\u0012[v\u0006fPEHK\u000bQE3Bqe\u00143I4\u0014S<[\u001ffk2\\+U\bc]7\u001fuFout:Swcm+V*\fԏ\u001cG=\u0010\u00166vN\u001bKQ\u000bSxv#B\u0015\u000b>mk\u001d\tx銛\u0014p\b:}oKӄqG\u0002amXߢfS2Gܘ$ptw6\u0018@\u001daa^\u001fA[ _&hvХٺW\u0001`,\b\u0000,\u000b\u0000b[vヱ&`XF=gv񫺂M?y]`Ԟ\u0010\b#\u0012#\u0016Vb\\\u0006b\u0019\u00178b%sb\\\u0014#ջ$l\u0014ּxH\u001c}\t?'\u000ev%K(Z\u0019\u001d\u0005n\u0000w,ڑ\u000b֒n\u0013usF\u001dZC˸7\u0002XZ\u0007dS\t\u001f0M'sD!\u0017D?\u001f\b_sb9y`T\u000f\n͙I\u0016\u000en!\u0013\u0018EGe:\u0007S_>3M\u0018sv\u00025a6xAetrnzЄ'mprp\u0017]1'ON۟Go4ːq#\u0006\u0014\b;swR\u000b\n\u0000N-\u0002\u0002\u0000bPaVGe\u0011u\u001b>ڬV\u0005׷XTg\u001f1\u0013U^|\u001cUC%y\u001cU\bou\\/\u001e\u0000yyhpѬE#&(g|p}L\u001cÉdT\u000e\u0014\u0004<|\u0018\u0018&:1F۾EVf\u0013\u0006]\u00000ݵve8vG%er\u000e\u00150(N\u0012\rLt$Y\u001aNF\\4ۥ%\u001a\u0017P+}iN\u0012\r@H49\"\t\u0012\u0000%5%\u0016^ ~{\u0005k\u001a@1W8^d3\u0014\u001cE|&I5%>\\dlLXHH9:Db]\u001bTͳm\u000eg^&KU\t^\u001dSϞ=jf-]Ȫ{\u0007\u0000]\u0006ٖ\u0007;1ٚJY3\u00065Q%+\u001cjOb+58ˆ@P4\u0015\u0006f\u0006Z\u000b\tO\u0016ly75<4.V5V?ӣ\u00164mn\b\u001c{E\u00169ҫ:kg+\u0000\u000f΀8[:\b#cpy/0Zn\u0017\u0016\"(ڼ\u001b\u0016\">\bJ\u0010`\t:4S})=\f*\n\u00119I\u0019Y70\u0016\u0016t~~\f\u000bmG5R,<\u0001nU4-/Z)a;t.\u0011\u001ca[//;#/?$Lے)r?j=8mKd\u001a15fGeü\u0018\u0017k\u0014\u0002v\u0017_7\b\u000b\u0013{ŇM?*9\u0006\u0007g\nػS[\u001d\u000b\u0013Ktyq)b\u0001\u0013]\u0017Sm۲2\u00078[n6luRo\u001cVo\u0015A\u0017\b&.AGd\f-CG\u0006QY3[\u0002ɡsΠӳ\u0005ˡ#d\u0011K9gБق9g9d\u000bʡsΠ#\u0005ɡsΠ3f\u000b.CA'b9g!N^E\u000es\u0006<\u00169tƀd7/u\f_\u000f]N\u0005ns9l/\u001c\fT6j\u0012斯Xr\u0019SbZNj^9\u001aif0\u001c\u001caQg\u00199y|f\u0012Do;]rĨ'M!k^+(iI!tb\u001c\n\"[\u0016\u001eA*˜͑\u0012\u001e*\u0018ihQ7n~CAl}cl\u001dPf%%y\u000f\u0005JK M0Bf\bd\u0019Z^BؤB`WK7n\u001e\u0012IDئ90r!\u001f$5I(3\u0010iqR1Fw,Fو4Oy`:#u+!ϠymN+zjHM1.15\u0018+ͳ2J\u001e[\f<>\bq2G\u001eɃ\f8\"\u000e%kܢ\u001e-\u0001~O/\u0016K?\t\u00003:~%\rN8%{Ɠ.[7|\u0019Cb/ -(\u0000м\u0019{xusngz0f\u0007.\u001f\u00030f\f\u000e60\u0000؟6W\u0018Wmi4qK\u0010-'#\u000ef\u00185v\u001a׾+9<\u0017hq,9F\\ЀR\u0001YbGS(,b_\u001f3;\u00139VF=ɰur[D\t%AE3\u0011D\u000bc_\u0015/\u0015\u000ft\\t\u001e:q\u001c3\u0000\u000bJ,\u0019gv#m|yd\u001c\"\"VON\u001e\u0019.o1YIFA)Ixdt\u001e9Y##l\u0014\"\u001bvv\u001c)a<\r'=2T{di\f\f-\u0015GwxOCqO\t-AIh)#u\u0001̉\u0007L[~\u001e#)9Ga\u0010u|8FI$Mʲc咇IY>\u0006HI,\\L\"6\\\t\u0007Y\u000f\u001e\r;#gi1\u0016ʟ?fϡ\u001eC\u0017P肇lA׼:w!\u001bW%qG\u0007\u0000\u0011:4\u0017i\u0014\u00072r|\n@Dv\u001f>,\u000fgԌU-{|87\u001e[M>|9#?\u001c|8\u0011\u0011z2\u0011|8\u001bAW\u000f\u0010\r+ȇ#+\u0019,\u00151挸UQ8W\u000flюuj\n2\u0006\u0012K9&\u0012@qtK\u000f1\u0000_\u0007z_{8U\u0003HU\u0013\u0018%2\t/c4]{cpαPEH!g\u001dv1\"A\u00116/sər\\eԥ}\u0014[.Ǩ[Ix.7Vs\u001b0v\u0007\u0015\fmwJa\u0017oӢY,W\u0002݆\u0016s\u0011g*B|\u001bԔ\u0015\u0002c\u0004[eF*3RVTn-TT\u0004gT\u0004e\u0015\u0019({\u001ahS\\\u001f5\u000b\u0016å\u0015s@@Xa[Zگ%K\u0018\"\u0019n\u001eT8r\u0017\u0012c\u001cW.URIGR\u0016+} Ze*\u001c\u0011\u001et*\u001cCy/huT5XB\u0018xK|2\u0006H\bJ_\u000b_&S\u0000ȷ\u0003\u0019kf-</\u0019v?\\f$6\u000fG8N\"Q[\u001e-=%MF cPuoGE\\mdCϯkT\u0014\u0011\b\u0002\u000e\u0017P\u0001kT@&}sAe)8mwVٌdU\\Eؕdf%l;nmdHwꛖa>;%&HqQm\n:Ngؽ:%tT^\u001c]\u001e^\u0011HMPij]sn{BK\u0001{pJv`MH^\fwե!8 \u0005z|\u001f'T-q\fiVrM`7{jw.\u001aczi-.B\u001e J7y\u00117\u001aj1u¯\u0011ӆ;v\u000fh\u001fs٣Pj\\jBu<{Mu\u000emj\\S{\\kX\u000f|}U3vin_U%9kn-\r{z\u0015G\fq}\u000e%ܽp>Q^ͭ؈ݥp\n:#^Rza\u001bgOt\"}\u0002tŷl:;§\u001fC6\u001d`[*.~\u0018tv>@xtvth6Ύs\u0002+ϦzWMg\u0017H\u0010otn1ɦ;?{]&8r.\u001dddl:UgsFVM%{-Ttl:(`p\u0012\"ήKirl*,Mg7ڝ+˦\u00030.&gdlE)/΅b+ʦ˥I1\u000ftvt\u001c%4Osntv\u0002X7a\u0015tv%خ\\i6\u0011`6<SOF\u0016Φ#gH=Zq_\u0016̦+X0 J3\u0016ͦ\u001b\u0010q\u0007\u0011M)EZ\u0000%y'RvU1\u0012>|\u001dc\u0003p[㢉O¨]^vzu6\u000botrlK0)(¹&{c\u0001t[%moSIlm#흪˹%\u0003ur%(a\u001c.a\u0016N\u001a-\u0013Ed>2;(ղ\u0016YŴx\u0018*2w\u0001/\u001ea߅[;t+={2wd\u0016'Н4%J;\u001e\u0005z\u0014ͅ|*YYn\u0002+t@\u0007\u000bD-E:]at5uy)\\.s\u001cEB&\u001eFstSj9Rŵ@\u001d=kV\u001aM\u0012-\f&뉓\u0015\f\u0007 шPFx| ׼.th##\u001a\n¹K\u0018K \u0015\u001c`(\u0006f=Q#\u0010V\u0005\n\u001ec`\u0005=T`7'~\u0011Kbz=KTFFt\u0003mOػ\u001eaRt\u0004ښ5%_z\\%Ӌd\u001cY,3v\u0015\foWW֔Ȱo}2\u000e1\u000fo\t,V` 8\u000e!CbUa$2,q\u000bu\u00193D\u0005<\u000bTͯl-\f\tP[VΛ6l;\"ѶƝ\u001bJ*'T[v\u0019*9!?[\u0000\u001d9v\nw^o5=.؅ni\\nX˭ڍ݃\u0013k5Uҩ\u000bG5}{0\u001cO,+\fgZ\f\u0005'9\u000bwJ?\u001aOH\u001dƜd\rA[\u001b_˾2tO}\u001aSZSj\u0003O\u000ff~U\u0002o\u000fC\u0012=WcW%g\u0003lWRBqetU\fM^\u0005c\u001a_Ű+U݆\u0005Jy~s\\K\f=N\u0017\u0005{\u001d2B{N\u0003Xj\u000f:Lz5=Vʻo{\u0002J;K\u0015VV\u0011tw\u001cW}F\u0019hL%m\u0004JI\u0001eݠ?X9Ai}%\b6u&)\fiҔ\u000bK:R:lk|!o\u000fI͇o\f=\t\u000f\u001fs1\u000eMu=-K)3/ܿk*Mݣ!SS\u0002ixM՘6]\u0014ipƏ6RS>\\Hj\u0011\u0004Hj= ͬo\\vH\u0003a4Võ4EGZHHS\\\u0018'-*Riz\u001fC\u001a\b˹/\u001bìy\u0015=LDu3\"%\fefr\n1M\u0014#ҩGDD~,^\\oQF!lRm΃+)BPFVxb\u00162PΠU1)փ.RüUM\\,=IOe\"(z$3VdmS+Yi\bM=g\u00165\u00075&k\u001dݎ{֝K4[G\u0017\\/;\u000eUXcce*Lu\u001e}\u000f2-\u0003*-P\u0018֕<$֗UVqo#\u0001TWZz\u001e\u001dw\u0005ra\u001c@bnVK1J˓\u00184YvJNuu6rWX2\u0011\u001e;kgD\np\u0015ꠑ3yUs\u0013sY\u0019ȷиfF\u0011\u0012~YsHer.\u001c2,-m{\u000e<h㤦dqxM\u0005$th9ӵeh=95Q33H\u001ejy\u0007FW\u0001\u001d(bs\u0004QO.\u0017CB%]p»`\u0016WX+o\u0016qUs\u0000mn\u0005h\u0003=\u0007T\u001fg\u0016\u001c@ESM \u001a\b\u0015l|d\u0001RD%\u0007бFk\u0016BU\u0005H%\u0007)ǊJ\u000e\u0015mdY^s\u00006ŭ\u0016*ʷ`E6E\u0019+-UXQQwDQ>\u001cE+y-ʧz٢|P٢|W.R֫:%\u0016ĺ\u001bȪ~d\u0015U\re_w&\u0017\u0002wC-P׏:\u0015\r[&N{]?笻\u0015\r-7~+SΕa\u000bw\u0017\b{P5Z#Ȗ*s\u001ecJ\u001fu-]\u0001D<Es!@G̙C]?իj#u7:>p]?C\u00127P\u00199N\u0005VT=c\u0015uG\u001eߢuPU(7G\u000f',ǖ瘞W%Fg{]9\rWQ9곮\u001f-\u000b8MX2\u0001\b\u0007ѩL]?l-X-\u001ez|=\u0010U渥ަ#bOѶ\u001e9\u0007j2\\}\u001ez]i)WdƐ#k]?w9~UVS-Hk=/ѭ\u0015Snos-G0\u000bsJxٲVo٬4oj\u000eq^T]?g5Ȭ_Nm,E¥[֛e\\=>Y\u000e1W6u\u0016MWr\u0012gX~\u0018\nlUd9|]?@'ٮPle9OU-\u00143[خU׏&\u0003~+\u001e,9W36p]?~\u0007POg[0!vG^sU?\u0017}{BcU?£T]\u0005t\u0005Qg\u0012\u001fxήu%r~Λ\u0003򎚷\u0007qf\u0019}sP\u0005KćUt\u00184vᙃw\u000e7-l\u000e&&\u001f\u0016LN/{jlD\u0000\th)PQI'2F\u0010Œ$_\r\u000eݓ#.wwoq\u0013OU4;R(\u001c\f!GPh\u0019bb;Cf=f+$[J\u0014\u0011Hx`k\u00048>o\u000fb(~gB9\u001e;bgC7g\u0012\b\u0018/ݵ\u000bm_\t3Mb\"$Uy#͹Q+\u0010\\dD*\fvn%\u0006E<~zy\bmo\u001ba1ܼl~~\u0017>N7/_m5\u001104ORoxJpY \u001c:܄\r\u000fOc[\u0019\u000b/NQ:i#(>\u0012J\u001dBD,L*X\u0002rٷר$'bX-#MEc![-\u0016{]L_3]\u001aRVb{'6YmKʶq?6y!Mʖq\u0018JE~t+14}}9v3\u0014=O\u0012ɭ\u0016ʸ-6ʹd(\u001e=<DNB˵sv{^\u001c\u0012GB?\u0014?aߜrL>\u0006]v\u0002Ҡиڇ;'Zrz?>S\u0017l{\u00166?30I\u0015\tňK܆_ԣ2\u0018^/\u0010I\tk#\u0000)0l2}\u001e\u001bӣӻ\u0017\u0002lTG\u0003,īFiO}UJ/8\u0000H}qi/^aC6Y\u0000\u000bzJ⮕zs\u0012s\u0001zǷa+{\u0001(2Ë+\u000eI\u0018W?\u0012\u0018۱r<<F\\#`]1F YY \u0012{\u001cj\r1KN-\u0006Ow\u0011\u0018<\u001b\u0006\u001fM\f$\u0000\u001e\u001c ,;8d>F8t[\u001b'd\"\u001fWwe[l`/\u001b{\u001abz\u0010\u0003cz1<,\u001a!\u0017h^@M=TUPY&E|NO|YB!\u0000wI\u0000G8E%O;F\u0004SJ\u0006QG\u0005bWETj8ܛ@X\u001b:P(\u0010\u001d}+o(K+1#\u000b\u001c6cu\u0012G_\u000fw\u0006_)p\u001fL6\u0017FG*lF/\u0010Q_\u001dJ}O<#T9feP*rjrʑrSQ\u0018J~\u00000%-wѧ\u0013@\u0016Ʌ4\u0017\u001bNn\u0013Ѣ\u0007aGm\u001e\u0010zڻF(y{GP,\u0006!\u001cU:v\u0014H\u0006I\\T~h\"\b$_N<X{quVe\u000fJ\f\t*FE$\u0018E\u0010RB R\u0011\\\u0001S$RP^\u0001\u000f#U^O\\\u0011CTf]\r1\u000b\f)<pmT\u0012\u001bǟ*ϞG\u0015/,j5\u0006\u0010\u0004a\f\u0019,Wy>ժ\tYFn]FMwOx8I3\r\u001d6I\u0018i\u00051\u000e'\u001cV\u000eg\u000e>Y\u001cb|\u001c-l˅@.Ə+wEۄu5ޯ7\u0003w&%@\u0013ޮL]\u001d\u0002I4M\u0006,dg66\u0002B s\u001cpGɣ`Z-\u000f@U٦u\u0005\u0014Y\u0016\u0004i%6x<iI;b^\u00061\u001a֯\u001aNg\u0001u!U\u0012R\u001cqi¬W.\u000e/3]={\u000ewN|\f7\u0016۟o,\u0016\u001f-@@H(:T1>\nŜˬ\u0017\u001aW@mqPD.1c\u0001悘wN7Zm,$\u000f=\u0012\u000fܱ^\rͶTe?+]@;܃ex幊44M鰵u{8K\u000fv~t\u0000\"6+\u00162\u000fʰ*\u000bLQ[\u0016\u000b?aŮ˽\u0003C_pWh\u0019p$ތb؉Qb#Hww\u0013Sk\u0018n|pzTO$\u0010b\u001f+^\"\u0016^w\u001e\u001bڰu\fMtǧ\u000bp\u001cnZ(\tT*~oLvkJe>bW-`\u0017 W`9<@ÀUFl}%WX\u001f[lc\r=5<ARb\u001encλ\rŴ\u0004b\u001a.`Y\\iLh\u001c\u00116`f\u0019Re5L]WK'mMŜ\nvu~\u0019'',\u0013?s\u000b_,W\f*u\u001d\u0006¡v\u000f%+Ȧk \u0014^%$d]1h\u0012\u000f%rPt0\u000f%F,6\u0005H{Amɗy\u0014\u000fs\t¸fQyR-oG7;_S\u0004f#v{Pe4>\u0007HB\u00010yӘ\u0011\u0016+n\nx:;9\tU2\u0017ukW|}.3WoR}o\u0000Z\u0012\u0012\t\u000b\u0012[Y u՞<R\u001bY,Loc'4%l\u000bW?8\u001c$J\u0007;\u0010/aׅ-pf\u0011g{|1\u00151g<-43\u0010\u001d\u001e{Akg\u0015v\rK\u001e#\fSP?A_Y\u001dC#\u000eA.Bѷ\\(z|?,*\u0000Tqk2V\u0018\u0006/̕[p|\u0003W\u000fv\u001brjZ\rႄim;c`YbXo\u0005e}s\u0014.B\u0018\u0012\u0012Bm\u0006ld?kAn\u000b}-\u00051\u0013o^ׂ+ri<\u001a.__1㻠/\u0005\u0017\u00170ޗB\u00114_s@9UVeȰ|p~\u0014Gj >9\u000b[娞y;?|T\u0001ʕJ`\"To\u000e\u000fή?c\bY[Ơ]n7w`W.tyǫ]Lբh\u0011*,Gg\u001b*\u0010^\u0015a\u00178c\u000b\u001d':b\u001fiJW}n\u001f\u0016E6\u0018\u000b@\u000fK*v\u001c(mgEcJT`36KQ\b@A:9Ӟ\u000enn^=6\u000eBEvMN{Tm\u000fGΗ\u0007\u0006x:\r\u001d--Y۶\"A)!љ\\1)y#R\u0015;\u0005h4\u0013]^/[.0xڑw\u001fxSUO<vىx+iWc[4XǉU{\u001a?͐\u001cP,b1cpC\u0018An\b+\"\u0013=\u000ebCbL\u0004*lt4\fxX(\t >\u0000<\u0000?[[?x\u001c=j5\u0003`ŵt\u0004 \u0010o\u001ei \u0006\u0011\"\u00013\u001cg\u0002*;\tas\u0003\u001cj(\u0018˴BIj`{\u0006\u0012\u000eaGՍ2>/:[vz\u0017g(qTGΏP\u0007}x(:?~\u0015\u001c<@GS5x\u0019\u0019;6Re\u001e\u0003CӦ*ź\u001a{n<\u0017{\u0014\u00151FMY+K.ֵ\fu\u0005Ge\u0012\u001a\tu\u0012\u0000ӅF{#\u0011b\u0004\u0011$\u0012\u0011$(=_U\u0012\u0018Le%ݫ@%\u0006A/@\u0011\t\u0014J\u001eyJ$5,D@I\u0019V9|\u0019>4NV\u0015\u0010A*><Dt7)|\u0010\u0010T\fވQ4\u0000&\tG\u000b\u0011\u001d\u0000\u001dD\"׃^/)\u001a_v\u0018\t*\u0000rU:`\u0016\u001c\u0006q;Pra&2Ɏ 8g\u0010\u0000@x\u001d\u0000 \u0010v\u0004,P\u0000l\u0013>\u00188\u0002\u0001g\nۂ`<̆px\u0019(\u0000:\u0007\u0017F\u0000\u0004K\u0005\u000b1UŕxAp^(y\u0015@f\u001d/.EZNj%Crc$4r?\u0017\u0006\t\b\\V$\u0013T\u001eʦI/\f@R'\u001axla:v<\\Iˎ\\O흕b2\bi?-\u0018@\u000bH\u001dӎ)\u0007[)\u0012< G;2oVo\n..uvdlreu8SdR=|\u0017\u0002==ZU\u0012v.\u0011\u0002#\u0013|ޏ#2!%D$kFID]c0X5O\b>-d:\u0015_Dt\u0001'+n)8Ä\u0012C\u0002\u00108,lYM﯇\u001fjR)8;z^\tR/n~ bW\u001f{\u000bxa7ͧZc=\u0011h\u0013'W\u0002s-+\u000f%\u001dz! +\"\u0001\u0004\fdp[K|j<Y\u0015e\u001b\b(\u0016!S>\u001dm\u0017`\u00044/ȗ\u0012Ƿ$[\u000eFΤM67Z71\"mɀQsXT,%\bn\u0016>F[J$S;F^jW8CﹲcpQDOr\\z%ޔ{!pi9<v:l+\u000f\u0014!~\u0017\u0007@,0l6#wY8§'NIc\u001e\u0011O\u0014\u0006'\u0011+\f1UIOUO\u0003[\u0007}7}x\u001a\u0012x)oga5-'H\u0018@F|>3Ջ0#P w\u0007dSQc{=ᮧ\u0005_\u000e#éRYĳ7Y\u001dɶ\u0012kgշp^Ӭe\u0015=iGX4mz4\u0001\u0003_\u001f$\u0018F\n&`Ǆϸ<q\u0005<q\ri\u0013\u00183\u0004:\f(b} 82=N\u000eg\u001a<\u0017bX\n\u001b;\u0013K턃NـzE]禴rc{1˧J\"6'4S\u0011V}77X5c#sZ7\u0003qʶ6,D\u001dِ/9]!\u0014r\u0007<\u001fB&\u000fEB\u001a|\fFx`'<:Q\\DFϬ<,X\b&KǹtYb\u0010\u0017Ol\u0010Wz-y!N.kN}7GE\u001eKʇX'\ncBy\u001a\u001d\\C\tLgw\u0010\u0013~<&ުI\"\u000eI\u0006c{\u0014\u001c\u001dS\u001d?Z\u0015-?V\u001fn{G{=<K\u001ayp\u0001mTA\u000b+\bP$Y\u0012wPq\u0013Fi:#'ivî\u001ef\u000125l<Bgk!-6f!~ڎV)\"\u001dqjSqFr\\\rHE3\u0019I-\u0019դ~*B\\`)&V\u0016\u001f\u000b\u001bHjH-&a\u00119\u0004Z\u0001+0Q\u0012s0f]+.K(\u001bv}:l̵[\u001e9r;jJrET4\u0013:J\u0014^?u9G_e^Fr/\u0006\u0013Uc<1򚉇\u000bf-,\u0011-*i\u0007/\u0010^\u001c-K۽Bvs=\u001c\u001cd\n7ڻ.9\u0011\u000b\u001b6^ }+FV\t*֒\u0004=%\u001f?\nu\u001c\u0013w\u000eIGZ\u0001\u0013[\u0006)z\u001cZn\u000bv\u0004yw'\u0001hר|\u0018Xje?JB%qj>h[Ty>ɟ~>\u0004/>*d\u001e{xz\u0003\n}]pz~կl\u0011τKs=\u000e\u0002Ԯ\u000b/\u0017HxvR\u000ear\u0017+,sC\u0006eBݘv\u0006m)(s\u0015UETsX Jש|w`]3Ua\u000b\u0014m\u001e!|\u001dn\u000eq},\u0019uaX,\u001cK\rQA\u0015\u0006O\u00193\u001eeiixծ:$.8\u0006\u0014R̶\u0013\u0012ƨ,j)<Q\f\u0013\u001bz]`4&%Vt\rLxm;\u0019/lx\n\u000f`\"%\u0015\u0013IQDEծ\bXvCdgw9\u0011L\u0012o\u001b״vwisޗ}jf/wj>2\f\"S\rD\u0002\"]1p>IM\u0011.1#z(\\BZ{\u0016\u0010z5NBrHm\u00057RyP~g\u000fRrp19V~\r+GꙸjwJ@N\b(a;J28\u000e+u^\u0016:O\u0016u\"r\u0013\b$\u0011\tr&H\u0000zC\u0000W6Ip(`=Y%\u0002(DH%u\"|\u0013\u0007Ig\u0012\u001c\u0014G*\tH \u0002\bț\u001b\u0014\u0017\u0012\u001c˂\u0006`\u0016ל-x,^\u0004(xviJȀP\u0001(aVn e\u0000$حˬ\b|\u000fs\u001fCi\u0018H|)R@.3FЇ@\u0001\u0004\u001ar~d0\u0005[\u0011}u;m\u0004^A\u0003϶0HS\u0011\u0012X\u0015\u0004\u0007\u000b[.aNe$g{\u0010\\\u0004T>Uˬ\rB!\u0010%699\u001elV/ 2hW+Fv/NXf=:/-\u001bkۮ<4m:\u0006\u001eJ\u0018\u0014#JMk\u001f)3[\u0019D=:ar5X=Qe\u001aF=(<u\u000fx>HR\u0006PO͘]rG溯awrC#\u0016AݑiP@L8Le\u0003`md\u0013K^bq&%ڑ\u001d\u0005W/SZH`#;EpP*MA\\;\fW@<\u001b\u0007R$\u001c\u001e\u0012\u001d]ȻBL\u0000VfM.ųn'S:'\u001f\u0006$\u001b\t՟U<\u001fFWvHwJ\u001eƣyJ\u001en j/F+\u0019=yN?\u001fG\u0010G}\u0005\u001d$\u001eX\u0000\u001c19xGVru+ty[5[c5@:&.\b\u000e^ lwe/lUtekl\u0017\u0006ll]+Ƶ\u0015_ت&lxakQ?V\u0015d(BڎbŖ\tF_;\f\u001a\u0006zRyה9\u0010G+nhob\u0010G)BW\u000bH\u001f&p\f=F\u001eaɵ$/+x-\u0001ó\u0005\u0012aI]v/ bRRB̽LAp\bC\u0011\u0015\u00170q\u0001q\u000e\u000f\u0015\u0002Q\u0014D(n\u0005ݡ}\u0011\u0006s\u0003;0:\tlWF}\u00140\u0010\u000eÓkq6\u0006vQ\u0018\u001a?\u0014,fA\u0005t\u001aF7\u0010m\\4\u0018\u00054+\u000fzxԑ\u0004\u000bY\u001c,\u0004mh\u0013@o6WQt؆\u001e\u0003l\b;0.\u0002,ñ\\>\u0003ؙ|.\u000b\u0001\u0003\u0001V\u001d\u000f|9\u000f_ \u0006ςO/l\u000f\n$XeT\u000ez\b|\u000b\u0010\u0004Y\u000f6\u0002|ɱ`$\u0003\rLe9\\9x y'*ֆMO\u001a@^`|FOKqeu`\u0001Pi<qY^3)a>XO\u001a\u0016\b\u0019(αLMB\u000ee\u0000e:aR=Jg9\u0006PHCWr`:gX\u0004\rȓOy=Q3<g6R)\u0003PCGBIes\u0010\u0004@2l\u0010\u00035,#YYas\u001cP#'0,f\u0007'\u0011#\bNgxOGi.\rCqL*Q\u0002JA\u0003&C\u0001\"qy&\u0016G|\u0016£\u0014t^\u0002\u0011A\u0003(|\u0007 I\u0003Wrl:\b|:]yw\u0015\u0002C<9$\u0016}v#\u001b\u000fm\u001e\u0019\u0011L.A|\u001cF 0|xfa}eB\u0010z\u000bYAI\u0001`/?\u0000)\u000e\u0004ry\u0004DE<\u000eqphAT w\u001dH\nDiD5RQ\fOQg,\u0001i9\u0001~Ee@d\n\"\u0001\u0014;A/\u0000sMF`24<\u0000\tr\u0019r\u0005`3\u0010\"#>\u0017)\u0018d0;\u0013}\n<\u0002Fe{`\u0014\u0019xE\u0011v`[>ϡ%e`@ppB&=1\u0000S6`0i:R,pY\u0001\b\fB\u0007cP\u001f\u0011=6\u0019\u0018\b)@\u0014@ey>=J\t)&+\u0005daK{Da$yxk󈠐CGJl0ߚB2J2L:\u0007l..R6qiMv\u0007%f\u001e\u0001\u001f,\u0012$<bI&\u000bP\f\u0002Ұ4,C\u0011ъŋN{Aӓ\u001f\u0002`\f\bhf\u000031x`|:&[e #\u0002y؈_\u0005\u0003)\u0005\u000e<L\b\u001a$_K\\+\u0005R\u0004t\u0016`w\"\u0007!EP\u0017@pr\u001f@\u0005X\u001f\u0000Ag`\u0010\u0019q\u00079\u0011^NM\f\u0001Z\u0013 f\\\nd%\u001f6\b\u0007pyi\u00162\"ʀ&\u0001C\u001f$+lN\f.\tHR!\rTm\u00010\u0000>>\u0005\u000f`\u0004@;L az\u0001:,i`\u001c\u0010'aJ*\u00026\u00015A\"P<⍔=@\u0001r9^{\u000e,p<\u0007B\u001a\u0016dEVe\u0011\u0001\u0007+W*菀Ks|\n\u0002\u0012) n\nq\u0000Ja\u0013|V \u0018F\u00100Z\u001bB*CB]\u001e\u001dy<\u000f\u0013\u0000\u000e\u0010PAhLљ\u0006u%\u000f&\r҂\u00000@U4\u000eu@*?1F\u0000gv\u0015h6\u000b`\u001cHALȴ,=`\rp\f\u0019l\u0005Y\u0001/\u0011_\u0003ir\u0003D,(=\u0013\u0001m\u001e\r泠\u0001i\u000f\b\u0004<QGshmު{\u0007 aMdS\u0007id&\u001e\u0016V& Avs\u0019]vs\u001eC{āB!US\"\"\u0000q~.?\u0002S\u0011\u0004\u0010\u0002*\u0010\u0001!G Sh5̶\\%4,AG<,q3t\u001aN:\u001f\u0010#U\u001f\u001e\u0007\r:+*\"b@\n`M\u001cW\u001ak\n\u0010\u00019R\u0019\r]ӈz\u0006H4x\u0017h\u0014e{\u0019gl&\u0012`J7;\u001f\u0019\fzv\u0012h<\t\t~Ht6s7z\u0002?Q\u001d~Q\r_\u0007\u000f\rendstream\rendobj\r6 0 obj\r[5 0 R]\rendobj\r20 0 obj\r<</CreationDate(D:20110328132859+11'00')/Creator(Adobe Illustrator CS5)/ModDate(D:20110328132859+11'00')/Producer(Adobe PDF library 9.90)/Title(Modernizr 2 Logo)>>\rendobj\rxref\r0 21\r0000000000 65535 f\r\n0000000016 00000 n\r\n0000000144 00000 n\r\n0000018316 00000 n\r\n0000000000 00000 f\r\n0000020771 00000 n\r\n0000048490 00000 n\r\n0000018367 00000 n\r\n0000018703 00000 n\r\n0000021070 00000 n\r\n0000020957 00000 n\r\n0000019852 00000 n\r\n0000020210 00000 n\r\n0000020258 00000 n\r\n0000020841 00000 n\r\n0000020872 00000 n\r\n0000021143 00000 n\r\n0000021317 00000 n\r\n0000022336 00000 n\r\n0000027404 00000 n\r\n0000048513 00000 n\r\ntrailer\r<</Size 21/Root 1 0 R/Info 20 0 R/ID[<8D44613111B047A982BB568568FC0997><DE399FA33D7D4432BF16917DBD7AD64E>]>>\rstartxref\r48693\r%%EOF\r"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/modernizr.js",
    "content": "/*!\n * Modernizr v2.8.3\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.8.3',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq) && matchMedia(mq).matches || false;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   goo.gl/v3V4Gp\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /**\n     * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n     */\n    ;(function(window, document) {\n        /*jshint evil:true */\n        /** version */\n        var version = '3.7.0';\n\n        /** Preset options */\n        var options = window.html5 || {};\n\n        /** Used to skip problem elements */\n        var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n        /** Not all elements can be cloned in IE **/\n        var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n        /** Detect whether the browser supports default html5 styles */\n        var supportsHtml5Styles;\n\n        /** Name of the expando, to work with multiple documents or to re-shiv one document */\n        var expando = '_html5shiv';\n\n        /** The id for the the documents expando */\n        var expanID = 0;\n\n        /** Cached data for each document */\n        var expandoData = {};\n\n        /** Detect whether the browser supports unknown elements */\n        var supportsUnknownElements;\n\n        (function() {\n          try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n          } catch(e) {\n            // assign a false positive if detection fails => unable to shiv\n            supportsHtml5Styles = true;\n            supportsUnknownElements = true;\n          }\n\n        }());\n\n        /*--------------------------------------------------------------------------*/\n\n        /**\n         * Creates a style sheet with the given CSS text and adds it to the document.\n         * @private\n         * @param {Document} ownerDocument The document.\n         * @param {String} cssText The CSS text.\n         * @returns {StyleSheet} The style element.\n         */\n        function addStyleSheet(ownerDocument, cssText) {\n          var p = ownerDocument.createElement('p'),\n          parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n          p.innerHTML = 'x<style>' + cssText + '</style>';\n          return parent.insertBefore(p.lastChild, parent.firstChild);\n        }\n\n        /**\n         * Returns the value of `html5.elements` as an array.\n         * @private\n         * @returns {Array} An array of shived element node names.\n         */\n        function getElements() {\n          var elements = html5.elements;\n          return typeof elements == 'string' ? elements.split(' ') : elements;\n        }\n\n        /**\n         * Returns the data associated to the given document\n         * @private\n         * @param {Document} ownerDocument The document.\n         * @returns {Object} An object of data.\n         */\n        function getExpandoData(ownerDocument) {\n          var data = expandoData[ownerDocument[expando]];\n          if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n          }\n          return data;\n        }\n\n        /**\n         * returns a shived element for the given nodeName and document\n         * @memberOf html5\n         * @param {String} nodeName name of the element\n         * @param {Document} ownerDocument The context document.\n         * @returns {Object} The shived element.\n         */\n        function createElement(nodeName, ownerDocument, data){\n          if (!ownerDocument) {\n            ownerDocument = document;\n          }\n          if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n          }\n          if (!data) {\n            data = getExpandoData(ownerDocument);\n          }\n          var node;\n\n          if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n          } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n          } else {\n            node = data.createElem(nodeName);\n          }\n\n          // Avoid adding some elements to fragments in IE < 9 because\n          // * Attributes like `name` or `type` cannot be set/changed once an element\n          //   is inserted into a document/fragment\n          // * Link elements with `src` attributes that are inaccessible, as with\n          //   a 403 response, will cause the tab/window to crash\n          // * Script elements appended to fragments will execute when their `src`\n          //   or `text` property is set\n          return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n        }\n\n        /**\n         * returns a shived DocumentFragment for the given document\n         * @memberOf html5\n         * @param {Document} ownerDocument The context document.\n         * @returns {Object} The shived DocumentFragment.\n         */\n        function createDocumentFragment(ownerDocument, data){\n          if (!ownerDocument) {\n            ownerDocument = document;\n          }\n          if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n          }\n          data = data || getExpandoData(ownerDocument);\n          var clone = data.frag.cloneNode(),\n          i = 0,\n          elems = getElements(),\n          l = elems.length;\n          for(;i<l;i++){\n            clone.createElement(elems[i]);\n          }\n          return clone;\n        }\n\n        /**\n         * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n         * @private\n         * @param {Document|DocumentFragment} ownerDocument The document.\n         * @param {Object} data of the document.\n         */\n        function shivMethods(ownerDocument, data) {\n          if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n          }\n\n\n          ownerDocument.createElement = function(nodeName) {\n            //abort shiv\n            if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n            }\n            return createElement(nodeName, ownerDocument, data);\n          };\n\n          ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n                                                          'var n=f.cloneNode(),c=n.createElement;' +\n                                                          'h.shivMethods&&(' +\n                                                          // unroll the `createElement` calls\n                                                          getElements().join().replace(/[\\w\\-]+/g, function(nodeName) {\n            data.createElem(nodeName);\n            data.frag.createElement(nodeName);\n            return 'c(\"' + nodeName + '\")';\n          }) +\n            ');return n}'\n                                                         )(html5, data.frag);\n        }\n\n        /*--------------------------------------------------------------------------*/\n\n        /**\n         * Shivs the given document.\n         * @memberOf html5\n         * @param {Document} ownerDocument The document to shiv.\n         * @returns {Document} The shived document.\n         */\n        function shivDocument(ownerDocument) {\n          if (!ownerDocument) {\n            ownerDocument = document;\n          }\n          var data = getExpandoData(ownerDocument);\n\n          if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n            data.hasCSS = !!addStyleSheet(ownerDocument,\n                                          // corrects block display not defined in IE6/7/8/9\n                                          'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +\n                                            // adds styling not present in IE6/7/8/9\n                                            'mark{background:#FF0;color:#000}' +\n                                            // hides non-rendered elements\n                                            'template{display:none}'\n                                         );\n          }\n          if (!supportsUnknownElements) {\n            shivMethods(ownerDocument, data);\n          }\n          return ownerDocument;\n        }\n\n        /*--------------------------------------------------------------------------*/\n\n        /**\n         * The `html5` object is exposed so that more elements can be shived and\n         * existing shiving can be detected on iframes.\n         * @type Object\n         * @example\n         *\n         * // options can be changed before the script is included\n         * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n         */\n        var html5 = {\n\n          /**\n           * An array or space separated string of node names of the elements to shiv.\n           * @memberOf html5\n           * @type Array|String\n           */\n          'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video',\n\n          /**\n           * current version of html5shiv\n           */\n          'version': version,\n\n          /**\n           * A flag to indicate that the HTML5 style sheet should be inserted.\n           * @memberOf html5\n           * @type Boolean\n           */\n          'shivCSS': (options.shivCSS !== false),\n\n          /**\n           * Is equal to true if a browser supports creating unknown/HTML5 elements\n           * @memberOf html5\n           * @type boolean\n           */\n          'supportsUnknownElements': supportsUnknownElements,\n\n          /**\n           * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n           * methods should be overwritten.\n           * @memberOf html5\n           * @type Boolean\n           */\n          'shivMethods': (options.shivMethods !== false),\n\n          /**\n           * A string to describe the type of `html5` object (\"default\" or \"default print\").\n           * @memberOf html5\n           * @type String\n           */\n          'type': 'default',\n\n          // shivs the document according to the specified `html5` object options\n          'shivDocument': shivDocument,\n\n          //creates a shived element\n          createElement: createElement,\n\n          //creates a shived documentFragment\n          createDocumentFragment: createDocumentFragment\n        };\n\n        /*--------------------------------------------------------------------------*/\n\n        // expose html5\n        window.html5 = html5;\n\n        // shiv the document\n        shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/readme.md",
    "content": "Modernizr [![Build Status](https://secure.travis-ci.org/Modernizr/Modernizr.png?branch=master)](http://travis-ci.org/Modernizr/Modernizr)\n=========\n\n### a JavaScript library allowing you to use CSS3 & HTML5 while maintaining control over unsupported browsers \n\nModernizr tests which native CSS3 and HTML5 features are available in\nthe current UA and makes the results available to you in two ways:\nas properties on a global `Modernizr` object, and as classes on the\n`<html>` element. This information allows you to progressively enhance\nyour pages with a granular level of control over the experience.\n\nModernizr has an optional (*not included*) conditional resource loader\ncalled `Modernizr.load()`, based on Yepnope.js ([yepnopejs.com](http://yepnopejs.com/)).\nTo get a build that includes `Modernizr.load()`, as well as choosing\nwhich tests to include, go to [www.modernizr.com/download/](http://www.modernizr.com/download/)\n\n[Full documentation on modernizr.com/docs/](http://www.modernizr.com/docs/)\n\n* * *\n\nModernizr is dual-licensed under the [BSD and MIT licenses](http://www.modernizr.com/license/).\n\n[modernizr.com](http://www.modernizr.com/)\n\n\n#### Try it out: \n\nRun the test suite: [http://modernizr.github.com/Modernizr/test/](http://modernizr.github.com/Modernizr/test/)\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/basic.html",
    "content": "<!DOCTYPE html>\n<html class=\"+no-js no-js- no-js i-has-no-js\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Modernizr Test Suite</title>\n  <link rel=\"stylesheet\" href=\"qunit/qunit.css\">\n  <style>\n     body { margin-bottom: 150px;}\n     #testbed { font-family: Helvetica; color: #444; padding-bottom: 100px;}\n     #testbed button { margin: 30px; font-size: 13px;}\n     .data-notes, .offScreen { display:none;}\n     table { width: 100%;}\n     tbody tr:nth-child(even) td, tbody tr:nth-child(even) th {  border: 1px solid #ccc; border-left: 0; border-right: 0;}\n     table td:nth-child(even), table th:nth-child(even) { background: #e6e6e6;}\n     table tbody tr:hover td, table tbody tr:hover th { background: #e1e100!important;}\n     td.wrong { background:red!important;}\n     #html5section { visibility: hidden; }\n     h1 label { display:none;}\n     .output { padding: 0 0 0 16px;}\n     .output ul { margin: 0;}\n     .output li { color: #854747; }\n     .output li.yes{color:#090;}\n     .output li b{color:#000;}\n     .output {font:14px/1.3 Inconsolata,Consolas,monospace;\n                    -webkit-column-count: 5;\n                       -moz-column-count: 5;\n                            column-count: 5;}\n      .output + .output { border-top: 5px solid #ccc; }\n      textarea { width: 100%; min-height: 75px;}\n      #caniusetrigger { font-size: 38px; font-family: monospace; display:block; }\n  </style>\n\n  <script src=\"https://raw.github.com/Modernizr/Modernizr/master/modernizr.js\"></script>\n\n  <script>window.Modernizr || document.write('<script src=\"../modernizr.js\"><\\/script>')</script>\n\n  <script src=\"js/lib/polyfills.js\"></script>\n  <script src=\"js/lib/detect-global.js\"></script>\n  \n  <script src=\"qunit/qunit.js\"></script>\n  <script src=\"js/lib/jquery-1.7b2.js\"></script>\n  \n  <script src=\"js/setup.js\"></script>\n  \n  <script src=\"js/unit.js\"></script>\n</head>\n<body>\n  <h1 id=\"qunit-header\">Modernizr Test Suite</h1>\n  <h2 id=\"qunit-banner\"></h2>\n  <div id=\"qunit-testrunner-toolbar\"></div>\n  <h2 id=\"qunit-userAgent\"></h2>\n\n  <ol id=\"qunit-tests\"></ol>\n\n  <div id=\"mod-output\" class=output></div>\n  <div id=\"mod-feattest-output\" class=output></div>\n\n\n  <br>\n \n  <section><aside>this is an aside within a section</aside></section>\n  \n  \n</body>\n</html> \n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse.html",
    "content": "<!DOCTYPE html>\n<!-- saved from url=(0025)http://tests.caniuse.com/ -->\n<html class=\" no-js\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><title>WCIU test page</title>\n<meta charset=\"utf-8\">\n\n<!-- pull in latest modernizr -->\n<script src=\"../modernizr.js\"></script>\n\n<script src=\"./caniuse_files/jquery.min.js\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"./caniuse_files/style.css\">\n\n<script>\n\nfunction setResult(id, result) {\n\t$('#' + id).addClass(result ? 'pass' : 'fail');\n}\n\n</script>\n\n</head><body><h2>The <a href=\"http://caniuse.com/\">When can I use...</a> test suite... <small>(originally from <a href=\"http://tests.caniuse.com/\">tests.caniuse.com</a>)</small></h2> \n<div id=\"intro\">\n\t<p>This is a basic test suite of various web technologies for the <a href=\"./caniuse_files/caniuse.html\">When Can I Use</a> website.</p>\n\t<p>It is used to quickly test basic support for features in upcoming browsers, rather than any full support of the feature's specification.</p>\n\t<p>Results on this page generally match the results as they appear on the When Can I Use site, but <strong>may not always</strong> due to a variety of circumstances (test may pass but support is actually buggy, not tested well enough, has alternative method, etc).</p>\n\t\n\t<p>Four different types of tests are used:</p>\n\t<dl>\n\t\t<dt>Auto</dt>\n\t\t<dd>Automated JS-based tests. (m) means <a href=\"http://modernizr.com/\">Modernizr</a> is used.</dd>\n\t\n\t\t<dt>Visual</dt>\n\t\t<dd>Requires visual confirmation/comparison to confirm</dd>\n\t\n\t\t<dt>Visual-square</dt>\n\t\t<dd>Test must create a 30x30px green (lime) square</dd>\n\t\n\t\t<dt>Interactive</dt>\n\t\t<dd>Requires interaction to confirm support</dd>\n\t</dl>\n\t\n\t<p>If you are interested in contributing tests you can contact me at: when (at) caniuse (dotcom).</p>\n\t\n</div>\n\n\n<div id=\"options\">\n<form action=\"http://tests.caniuse.com/?\" method=\"get\"><label for=\"browser_list\">Select browser to compare results with: </label><select id=\"ua\" name=\"ua\" autocomplete=\"false\"><option value=\"\">(none)</option><option value=\"and2.1\">Android Browser 2.1</option><option value=\"and2.2\">Android Browser 2.2</option><option value=\"and2.3\">Android Browser 2.3</option><option value=\"and3\">Android Browser 3</option><option value=\"chr10\">Chrome 10</option><option value=\"chr11\">Chrome 11</option><option value=\"chr12\">Chrome 12</option><option value=\"chr13\" selected=\"\">Chrome 13</option><option value=\"chr4\">Chrome 4</option><option value=\"chr5\">Chrome 5</option><option value=\"chr6\">Chrome 6</option><option value=\"chr7\">Chrome 7</option><option value=\"chr8\">Chrome 8</option><option value=\"chr9\">Chrome 9</option><option value=\"ff2\">Firefox 2</option><option value=\"ff3\">Firefox 3</option><option value=\"ff3.5\">Firefox 3.5</option><option value=\"ff3.6\">Firefox 3.6</option><option value=\"ff4\">Firefox 4</option><option value=\"ff5\">Firefox 5</option><option value=\"ff6\">Firefox 6</option><option value=\"ie10\">IE 10</option><option value=\"ie5.5\">IE 5.5</option><option value=\"ie6\">IE 6</option><option value=\"ie7\">IE 7</option><option value=\"ie8\">IE 8</option><option value=\"ie9\">IE 9</option><option value=\"ios3.2\">iOS Safari 3.2</option><option value=\"ios4.1\">iOS Safari 4.0-4.1</option><option value=\"ios4.2\">iOS Safari 4.2-4.3</option><option value=\"op10.1\">Opera 10.0-10.1</option><option value=\"op10.5\">Opera 10.5</option><option value=\"op10.6\">Opera 10.6</option><option value=\"op11\">Opera 11</option><option value=\"op11.1\">Opera 11.1</option><option value=\"op11.5\">Opera 11.5</option><option value=\"op12\">Opera 12</option><option value=\"op9\">Opera 9</option><option value=\"op9.6\">Opera 9.5-9.6</option><option value=\"omini5\">Opera Mini 5.0-6.0</option><option value=\"omob10\">Opera Mobile 10</option><option value=\"omob11\">Opera Mobile 11</option><option value=\"saf3.1\">Safari 3.1</option><option value=\"saf3.2\">Safari 3.2</option><option value=\"saf4\">Safari 4</option><option value=\"saf5\">Safari 5</option><option value=\"saf6\">Safari 6</option></select><div><label for=\"prefix\">Select CSS prefix to use (does not affect modernizr or non-CSS tests): </label><select id=\"prefix\" name=\"prefix\" autocomplete=\"false\"><option value=\"all\" selected=\"\">All combinations</option><option value=\"-webkit-\">-webkit-</option><option value=\"-moz-\">-moz-</option><option value=\"-ms-\">-ms-</option><option value=\"-o-\">-o-</option><option value=\"none\">(no prefix)</option></select><input id=\"opt_submit\" type=\"submit\" value=\"Go\"></div></form></div><table><caption>Tests</caption><thead><tr><th>Feature</th><th>chr13</th><th>Tests</th></tr></thead><tbody><tr><th><h3>Toolbar/context menu</h3><span class=\"links\">[<a href=\"http://caniuse.com/menu\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=menu&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n\n</td></tr>\n<tr><th><h3>Audio element</h3><span class=\"links\">[<a href=\"http://caniuse.com/audio\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=audio&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"audio0\" class=\"auto pass\"></div><script>\nsetResult('audio0', !!document.createElement('audio').canPlayType);\n</script><div class=\"info\">document.createElement('audio').canPlayType</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"audio1\" class=\"interact\"></div><audio controls=\"\">\n <source src=\"mimeaud.php?type=.wav\">\n <source src=\"mimeaud.php?type=.mp3\">\n <source src=\"mimeaud.php?type=.ogg\">\n <source src=\"mimeaud.php?type=.aac\">\n <source src=\"mimeaud.php?type=.flac\">\n <source src=\"mimeaud.php?type=.wma\">\n Audio fail\n</audio>\n<div class=\"info\">Audio element with 6 different sources (with MIME set)</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"audio2\" class=\"interact\"></div><audio controls=\"\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.wav\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.mp3\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.ogg\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.aac\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.flac\">\n <source src=\"mimeaud.php?nomime=1&amp;type=.wma\">\n--&gt;\n Audio fail\n</audio>\n\n<div class=\"info\">Audio element with 6 different sources (no MIME set)</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Background-image options</h3><span class=\"links\">[<a href=\"http://caniuse.com/background-img-opts\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=background-img-opts&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"background-img-opts0\" class=\"auto pass\"></div><script>setResult('background-img-opts0', Modernizr.backgroundsize);</script><div class=\"info\">Modernizr test for: \"backgroundsize\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"background-img-opts1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background:lime\">\n<div style=\"-webkit-background-clip:content-box;-moz-background-clip:content-box;-ms-background-clip:content-box;-o-background-clip:content-box;background-clip:content-box;padding:30px 30px 0 0;background-color:red\"></div>\n</div>\n</div><div class=\"info\">background-clip: content-box;</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"background-img-opts2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background:lime\">\n<div style=\"-webkit-background-origin:content-box;-moz-background-origin:content-box;-ms-background-origin:content-box;-o-background-origin:content-box;background-origin:content-box;padding:30px 30px 0 0;background-image:url(caniuse_files/red30x30.png);background-repeat: no-repeat;\"></div>\n</div>\n</div><div class=\"info\">background-origin: content-box;</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"background-img-opts2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"-webkit-background-size:30px 30px;-moz-background-size:30px 30px;-ms-background-size:30px 30px;-o-background-size:30px 30px;background-size:30px 30px;background-image:url(caniuse_files/green5x5.png);background-repeat: no-repeat;width:30px;height:30px;\"></div>\n</div><div class=\"info\">background-size: 30px 30px;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Border images</h3><span class=\"links\">[<a href=\"http://caniuse.com/border-image\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=border-image&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"border-image0\" class=\"auto pass\"></div><script>setResult('border-image0', Modernizr.borderimage);</script><div class=\"info\">Modernizr test for: \"borderimage\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"border-image1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"border-width: 15px;\t-webkit-border-image-source: url(caniuse_files/green5x5.png);-moz-border-image-source: url(caniuse_files/green5x5.png);-ms-border-image-source: url(caniuse_files/green5x5.png);-o-border-image-source: url(caniuse_files/green5x5.png);border-image-source: url(caniuse_files/green5x5.png);-webkit-border-image-slice: 2;-moz-border-image-slice: 2;-ms-border-image-slice: 2;-o-border-image-slice: 2;border-image-slice: 2; width:0; height: 0;\"></div></div><div class=\"info\">Separate properties:\nborder-image-source: url(caniuse_files/green5x5.png);\nborder-image-slice: 2;</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"border-image3\" class=\"visual-square\"></div><div class=\"square\"><div style=\"border-width: 15px;\t-webkit-border-image: url(caniuse_files/green5x5.png) 2;-moz-border-image: url(caniuse_files/green5x5.png) 2;-ms-border-image: url(caniuse_files/green5x5.png) 2;-o-border-image: url(caniuse_files/green5x5.png) 2;border-image: url(caniuse_files/green5x5.png) 2; width:0; height: 0;\"></div></div><div class=\"info\">Shorthand syntax: border-image: url(caniuse_files/green5x5.png) 2;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Border-radius (rounded corners)</h3><span class=\"links\">[<a href=\"http://caniuse.com/border-radius\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=border-radius&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"border-radius0\" class=\"auto pass\"></div><script>setResult('border-radius0', Modernizr.borderradius);</script><div class=\"info\">Modernizr test for: \"borderradius\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"border-radius1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px; height:30px; overflow:hidden; position:relative;\">\n  <div style=\"background:lime; height: 40px; \"></div>\n  <div style=\"background:red; position:absolute; z-index:10; top: 0;\n              height: 400px; width: 400px;\n              -webkit-border-radius: 150px;\n-moz-border-radius: 150px;\n-ms-border-radius: 150px;\n-o-border-radius: 150px;\nborder-radius: 150px;\n\n\"></div>\n</div></div></div>\n\n</td></tr>\n<tr><th><h3>Canvas (basic support)</h3><span class=\"links\">[<a href=\"http://caniuse.com/canvas\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=canvas&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"canvas0\" class=\"auto pass\"></div><script>setResult('canvas0', Modernizr.canvas);</script><div class=\"info\">Modernizr test for: \"canvas\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"canvas1\" class=\"visual-square\"></div><div class=\"square\"><canvas width=\"30\" height=\"30\" style=\"background:red;\" id=\"canv_test\"></canvas>\n\n<script>\nvar canvas = $('#canv_test')[0], \n    ctx    = canvas.getContext && canvas.getContext('2d');\n\nif (ctx){\n  ctx.fillStyle = '#00ff00';\n  ctx.fillRect(0,0,100,40);\n}\n</script></div><div class=\"info\">Draw rect on canvas using fillStyle and fillRect</div></div>\n\n</td></tr>\n<tr><th><h3>classList (DOMTokenList )</h3><span class=\"links\">[<a href=\"http://caniuse.com/classlist\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=classlist&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"classlist0\" class=\"auto pass\"></div><script>\nsetResult('classlist0', \"classList\" in document.body);\n</script><div class=\"info\">\"classList\" in document.body</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"classlist1\" class=\"visual-square\"></div><div class=\"square\"><div id=\"classlisttest\" class=\"pass\" style=\"width:30px;height:30px;\"></div>\n<script>\ntry{\n  document.getElementById('classlisttest').classList.remove('fail');\n  document.getElementById('classlisttest').classList.add('pass');\n}catch(e){}\n\n\n</script></div></div>\n\n</td></tr>\n<tr><th><h3>Cross-Origin Resource Sharing</h3><span class=\"links\">[<a href=\"http://caniuse.com/cors\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=cors&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"cors0\" class=\"auto pass\"></div><script>\n$(function() {\n\t$.get('http://a.deveria.com/tests/cors/true.php', function(data) {\n\t\tsetResult('cors0', data);\n\t});\n});\n\n</script><div class=\"info\">Instant XHR request on page that should permit it.</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Animation</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-animation\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-animation&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-animation0\" class=\"auto pass\"></div><script>setResult('css-animation0', Modernizr.cssanimations);</script><div class=\"info\">Modernizr test for: \"cssanimations\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-animation1\" class=\"visual-square\"></div><div class=\"square\"><style>\n #css-animation1test {\n\t-webkit-animation: staylime 60s infinite;\n-moz-animation: staylime 60s infinite;\n-ms-animation: staylime 60s infinite;\n-o-animation: staylime 60s infinite;\nanimation: staylime 60s infinite;\n}\n\n@-webkit-keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }\n@-moz-keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }\n@-ms-keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }\n@-o-keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }\n@keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }\n\n\n</style>\n\n<div id=\"css-animation1test\" style=\"width:30px;height:30px;\"></div></div><div class=\"info\">animation: staylime 60s infinite; \n\n@keyframes staylime {\n\tfrom { background-color: lime; }\n\tto   { background-color: lime; }\n }</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Box-shadow</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-boxshadow\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-boxshadow&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-boxshadow0\" class=\"auto pass\"></div><script>setResult('css-boxshadow0', Modernizr.boxshadow);</script><div class=\"info\">Modernizr test for: \"boxshadow\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-boxshadow1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background:red; width: 30px; height: 30px;\n            -webkit-box-shadow: inset lime 0px 0px 150px;\n-moz-box-shadow: inset lime 0px 0px 150px;\n-ms-box-shadow: inset lime 0px 0px 150px;\n-o-box-shadow: inset lime 0px 0px 150px;\nbox-shadow: inset lime 0px 0px 150px;\n \"></div>\n</div><div class=\"info\">Must be greenish, may not be entirely lime depending on the implementation.</div></div>\n\n</td></tr>\n<tr><th><h3>CSS position:fixed</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-fixed\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-fixed&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"css-fixed1\" class=\"interact\"></div><a href=\"http://tests.caniuse.com/fixed.html\">Test here</a></div>\n\n</td></tr>\n<tr><th><h3>CSS Gradients</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-gradients\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-gradients&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-gradients0\" class=\"auto pass\"></div><script>setResult('css-gradients0', Modernizr.cssgradients);</script><div class=\"info\">Modernizr test for: \"cssgradients\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-gradients1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background-image: -webkit-linear-gradient(lime, lime);background-image: -moz-linear-gradient(lime, lime);background-image: -ms-linear-gradient(lime, lime);background-image: -o-linear-gradient(lime, lime);background-image: linear-gradient(lime, lime);\"></div></div><div class=\"info\">linear-gradient(lime, lime);</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-gradients2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background-image:-webkit-radial-gradient(lime, lime);background-image:-moz-radial-gradient(lime, lime);background-image:-ms-radial-gradient(lime, lime);background-image:-o-radial-gradient(lime, lime);background-image:radial-gradient(lime, lime);\"></div></div><div class=\"info\">radial-gradient(lime, lime)</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Opacity</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-opacity\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-opacity&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-opacity0\" class=\"auto pass\"></div><script>setResult('css-opacity0', Modernizr.opacity);</script><div class=\"info\">Modernizr test for: \"opacity\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-opacity1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;position:relative;background:lime\">\n\t<div style=\"width:30px;height:30px;background:red;-webkit-opacity:0;-moz-opacity:0;-ms-opacity:0;-o-opacity:0;opacity:0;\"></div></div>\n</div>\n</div><div class=\"info\">Test for opacity: 0</div>\n\n</td></tr>\n<tr><th><h3>CSS3 Text-shadow</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-textshadow\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-textshadow&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-textshadow0\" class=\"auto pass\"></div><script>setResult('css-textshadow0', Modernizr.textshadow);</script><div class=\"info\">Modernizr test for: \"textshadow\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"css-textshadow1\" class=\"visual\"></div><div class=\"vis_test\"><div style=\"width:30px;height:30px;overflow:hidden\" id=\"css-textshadow1\">\n \n<div style=\"font:25px/25px Times New Roman, Times; color:white;-webkit-text-shadow:25px 0 3px lime;-moz-text-shadow:25px 0 3px lime;-ms-text-shadow:25px 0 3px lime;-o-text-shadow:25px 0 3px lime;text-shadow:25px 0 3px lime;position:relative; left:-25px;\">A</div>\n\n</div></div><div class=\"vis_ref\"><img src=\"./caniuse_files/text-shadow1.png\"></div><div class=\"info\">font-size: 25px;\ncolor: white;\ntext-shadow: 25px 0 3px lime; position: relative;\nleft: -25px;</div></div>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"css-textshadow2\" class=\"visual\"></div><div class=\"vis_test\"><div style=\"width:40px;height:30px;overflow:hidden\" id=\"css-textshadow2\">\n <div style=\"font:25px/25px Times New Roman, Times; color:white; -webkit-text-shadow:25px 0 3px #0F0, 35px 0 3px #0C0, 45px 0 3px #090;-moz-text-shadow:25px 0 3px #0F0, 35px 0 3px #0C0, 45px 0 3px #090;-ms-text-shadow:25px 0 3px #0F0, 35px 0 3px #0C0, 45px 0 3px #090;-o-text-shadow:25px 0 3px #0F0, 35px 0 3px #0C0, 45px 0 3px #090;text-shadow:25px 0 3px #0F0, 35px 0 3px #0C0, 45px 0 3px #090; position:relative; left:-35px;\">A</div>\n</div>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/text-shadow2.png\"></div><div class=\"info\">Multiple shadow test</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Transitions</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-transitions\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-transitions&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-transitions0\" class=\"auto pass\"></div><script>setResult('css-transitions0', Modernizr.csstransitions);</script><div class=\"info\">Modernizr test for: \"csstransitions\"</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"css-transitions1\" class=\"interact\"></div><style>\n#css-transitions1wrap {\n\twidth: 30px;\n\theight: 30px;\n\tborder: 1px solid;\n\toverflow: hidden;\n\tmargin: 0 auto;\n}\n\n#css-transitions1test {\n\t-webkit-transition-property: left;\n\t-webkit-transition-duration: 3s;\n\t-webkit-transition-timing-function: cubic-bezier(0, 1, 1, 0);\n-moz-transition-property: left;\n\t-moz-transition-duration: 3s;\n\t-moz-transition-timing-function: cubic-bezier(0, 1, 1, 0);\n-ms-transition-property: left;\n\t-ms-transition-duration: 3s;\n\t-ms-transition-timing-function: cubic-bezier(0, 1, 1, 0);\n-o-transition-property: left;\n\t-o-transition-duration: 3s;\n\t-o-transition-timing-function: cubic-bezier(0, 1, 1, 0);\ntransition-property: left;\n\ttransition-duration: 3s;\n\ttransition-timing-function: cubic-bezier(0, 1, 1, 0);\n\tbackground-color: lime;\n\tposition: relative;\n\tleft: -30px;\n\ttop: 0;\n}\n\n#css-transitions1wrap:hover #css-transitions1test {\n\tleft: 30px;\n}\n\n</style>\n<div id=\"css-transitions1wrap\">\n\t<div id=\"css-transitions1test\" style=\"width:30px;height:30px;\"></div>\n</div><p class=\"condition\">Green square must (briefly) appear on hover</p><div class=\"info\">5 second transition from left to right using cubic-bezier(0, 1, 1, 0); </div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Colors</h3><span class=\"links\">[<a href=\"http://caniuse.com/css3-colors\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css3-colors&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css3-colors0\" class=\"auto pass\"></div><script>setResult('css3-colors0', Modernizr.hsla);</script><div class=\"info\">Modernizr test for: \"hsla\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css3-colors1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background-color: red;      width: 30px; height: 30px; background-color: hsl(120, 100%, 50%);\"></div></div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css3-colors2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background-color: red;      width: 30px; height: 30px; background-color: rgba(0, 255, 0, 1);\"></div></div></div>\n\n</td></tr>\n<tr><th><h3>dataset &amp; data-* attributes</h3><span class=\"links\">[<a href=\"http://caniuse.com/dataset\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=dataset&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"dataset0\" class=\"auto pass\" data-foo=\"bar\"></div><script>\nvar result = 'dataset' in document.body;\nif(result) {\nvar elem = document.getElementById('dataset0'); elem.setAttribute('data-foo', 'bar');\nresult = elem.dataset.foo == 'bar';\n}\nsetResult('dataset0', result);\n</script><div class=\"info\">Test for 'dataset' in document.body and getting the correct value returned from a data-foo attribute.</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"dataset1\" class=\"interact\"></div><a href=\"http://trac.webkit.org/export/66582/trunk/LayoutTests/fast/dom/dataset.html\">Test here</a></div>\n\n</td></tr>\n<tr><th><h3>Details &amp; Summary elements</h3><span class=\"links\">[<a href=\"http://caniuse.com/details\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=details&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"details0\" class=\"auto pass\"></div><script>\nsetResult('details0', 'open' in document.createElement('details'));\n</script></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"details1\" class=\"interact\"></div><details>\n    <summary>(summary button)</summary>\n    <p>(detail contents)</p>\n</details><p class=\"condition\">\"(detail contents)\" should be visible ONLY after clicking summary</p><div class=\"info\">Basic details element with summary and paragraph as children.</div></div>\n\n</td></tr>\n<tr><th><h3>Server-sent DOM events</h3><span class=\"links\">[<a href=\"http://caniuse.com/eventsource\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=eventsource&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"eventsource0\" class=\"auto pass\"></div><script>\nsetResult('eventsource0', typeof EventSource !== 'undefined');\n</script></div>\n\n</td></tr>\n<tr><th><h3>File API</h3><span class=\"links\">[<a href=\"http://caniuse.com/fileapi\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=fileapi&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"fileapi0\" class=\"auto pass\"></div><script>\nsetResult('fileapi0', !!window.FileReader);\n</script></div>\n\n</td></tr>\n<tr><th><h3>Flexible Box Layout Module</h3><span class=\"links\">[<a href=\"http://caniuse.com/flexbox\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=flexbox&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"flexbox0\" class=\"auto pass\"></div><script>setResult('flexbox0', Modernizr.flexbox);</script><div class=\"info\">Modernizr test for: \"flexbox\"</div></div>\n\n</td></tr>\n<tr><th><h3>@font-face Web fonts</h3><span class=\"links\">[<a href=\"http://caniuse.com/fontface\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=fontface&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"fontface0\" class=\"auto pass\"></div><script>setResult('fontface0', Modernizr.fontface);</script><div class=\"info\">Modernizr test for: \"fontface\"</div></div>\n\n</td></tr>\n<tr><th><h3>Geolocation</h3><span class=\"links\">[<a href=\"http://caniuse.com/geolocation\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=geolocation&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"geolocation0\" class=\"auto pass\"></div><script>setResult('geolocation0', Modernizr.geolocation);</script><div class=\"info\">Modernizr test for: \"geolocation\"</div></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"geolocation1\" class=\"auto pass\"></div><script>\n(function() {\n\tvar result = false;\n\tvar geo = navigator.geolocation;\n\tif(geo) {\n\t\tresult = (\n\t\t\t\"getCurrentPosition\" in geo\n\t\t\t&& \"watchPosition\" in geo\n\t\t\t&& \"clearWatch\" in geo\n\t\t);\n\t}\n\tsetResult('geolocation1', result);\n}());\n</script><div class=\"info\">Test for getCurrentPosition, watchPosition and clearWatch in navigator.geolocation</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"geolocation2\" class=\"interact\"></div><button id=\"geolocation2test\">Get location</button>\n<script>\n(function() {\n\tvar btn = document.getElementById('geolocation2test');\n\tif(!navigator.geolocation && !navigator.geolocation.getCurrentPosition) return false;\n\tbtn.onclick = function() {\n\t\tvar feat = document.getElementById('geolocation2');\n\t\tnavigator.geolocation.getCurrentPosition(function(pos) {\n\t\t\tfeat.innerHTML = '<p>Result:<br>LAT: ' + pos.coords.latitude + '<br>LON: ' + pos.coords.longitude + '</p>';\n\t\t}, function(error) {\n\t\t\tfeat.innerHTML = '<p>Error:' + error.message + '</p>';\n\t\t});\n\t\t\n\t\tfeat.innerHTML = '<p>Waiting for response...</p>';\n\t\t\n\t\treturn false;\n\t}\n})();\n\n</script><p class=\"condition\">Must provide LAT and LON info (may need to give permission first)</p><div class=\"info\">Test for navigator.geolocation.getCurrentPosition on which position.coords.latitude and position.coords.longitude are expected. </div></div>\n\n</td></tr>\n<tr><th><h3>getElementsByClassName</h3><span class=\"links\">[<a href=\"http://caniuse.com/getelementsbyclassname\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=getelementsbyclassname&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"getelementsbyclassname0\" class=\"auto pass\"></div><script>\nsetResult('getelementsbyclassname0', typeof document.getElementsByClassName === 'function')\n</script></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"getelementsbyclassname1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width: 30px; height: 30px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: lime; background-position: initial initial; background-repeat: initial initial; \" id=\"getelementsbyclassname1container\">\n\t<div id=\"getelementsbyclassname1test\">\n\t\t<div class=\"getelementsbyclassname1test\"></div>\n\t\t<div class=\"getelementsbyclassname1test altgetelementsbyclassname1test\"></div>\n\t\t<div class=\"altgetelementsbyclassname1test\"></div>\n\t</div>\n<script>\n(function() {\n\tif(document.getElementsByClassName) {\n\t\tvar elems = document.getElementsByClassName('getelementsbyclassname1test');\n\t\tvar from_id = document.getElementById('getelementsbyclassname1test').getElementsByTagName('*');\n\t\tif(elems.length && elems.length === 2) {\n\t\t\tif(elems[0] === from_id[0] && elems[1] === from_id[1]) {\n\t\t\t\tdocument.getElementById('getelementsbyclassname1container').style.background = 'lime';\n\t\t\t}\n\t\t}\n\t}\n}());\n</script></div><div class=\"info\">Test if two divs were correctly retrieved using getElementsByClassName</div></div>\n\n</div></td></tr>\n<tr><th><h3>Hashchange event</h3><span class=\"links\">[<a href=\"http://caniuse.com/hashchange\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=hashchange&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"hashchange0\" class=\"auto pass\"></div><script>setResult('hashchange0', Modernizr.hashchange);</script><div class=\"info\">Modernizr test for: \"hashchange\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"hashchange1\" class=\"visual-square\"></div><div class=\"square\"><iframe style=\"width:30px;height:30px;border:0\" src=\"./caniuse_files/hashchange.html\"></iframe></div><div class=\"info\">iframe with addEventListener('hashchange', function() {\n\tdocument.body.style.background = 'lime';\n}, false);\n</div></div>\n\n</td></tr>\n<tr><th><h3>Session history management</h3><span class=\"links\">[<a href=\"http://caniuse.com/history\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=history&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"history0\" class=\"auto pass\"></div><script>setResult('history0', Modernizr.history);</script><div class=\"info\">Modernizr test for: \"history\"</div></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"history1\" class=\"auto\"></div><iframe src=\"./caniuse_files/pushstate.html#history1\"  style=\"display:none\"></iframe><div class=\"info\">Test if history.pushState was successful</div></div>\n\n</td></tr>\n<tr><th><h3>IndexedDB</h3><span class=\"links\">[<a href=\"http://caniuse.com/indexeddb\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=indexeddb&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"indexeddb0\" class=\"auto pass\"></div><script>setResult('indexeddb0', Modernizr.indexeddb);</script><div class=\"info\">Modernizr test for: \"indexeddb\"</div></div>\n\n</td></tr>\n<tr><th><h3>JSON parsing</h3><span class=\"links\">[<a href=\"http://caniuse.com/json\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=json&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"json0\" class=\"auto pass\"></div><script>\nsetResult('json0', 'JSON' in window)\n</script></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"json1\" class=\"auto pass\"></div><script>\n(function() {\ntry {\nvar obj = {\n\tkey1: 'my_str',\n\tkey2: ['my', 'array'],\n\tkey3: {\n\t\tmy: 'object',\n\t\twith_numbers: [1, 2, 3, 4.5678],\n\t\tand_also: 9\n\t}\n};\n\nvar str = JSON.stringify(obj);\nif(typeof str === 'string') {\n\tvar new_obj = JSON.parse(str);\n\tif(\n\t\tnew_obj.key1 === 'my_str'\n\t\t&& new_obj.key2.length === 2\n\t\t&& new_obj.key2[1] === 'array'\n\t\t&& new_obj.key3.with_numbers[3] === 4.5678\n\t\t&& new_obj.key3.and_also === 9\n\t) {\n\t\tsetResult('json1', true);\n\t} else {\n\t\tsetResult('json1', false);\n\t}\n} else {\n\tsetResult('json1', false);\n}\n} catch(e){\nsetResult('json1', false);\n}\n}());\n</script><div class=\"info\">Create a JS object, convert to JSON string, convert back to object and compare.</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Multiple backgrounds</h3><span class=\"links\">[<a href=\"http://caniuse.com/multibackgrounds\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=multibackgrounds&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"multibackgrounds0\" class=\"auto pass\"></div><script>setResult('multibackgrounds0', Modernizr.multiplebgs);</script><div class=\"info\">Modernizr test for: \"multiplebgs\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"multibackgrounds1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background-repeat: repeat-x; background-image: url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png); background-position: 0 0, 0 5px, 0 10px, 0 15px, 0 20px, 0 25px; width:30px;height:30px;\"></div></div><div class=\"info\">background-repeat: repeat-x;\nbackground-image: url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png), url(caniuse_files/green5x5.png);\nbackground-position: 0 0, 0 5px, 0 10px, 0 15px, 0 20px, 0 25px;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Multiple column layout</h3><span class=\"links\">[<a href=\"http://caniuse.com/multicolumn\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=multicolumn&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"multicolumn0\" class=\"auto pass\"></div><script>setResult('multicolumn0', Modernizr.csscolumns);</script><div class=\"info\">Modernizr test for: \"csscolumns\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"multicolumn1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"-webkit-column-width: 15px; -webkit-column-gap: 0;-moz-column-width: 15px; -moz-column-gap: 0;-ms-column-width: 15px; -ms-column-gap: 0;-o-column-width: 15px; -o-column-gap: 0;column-width: 15px; column-gap: 0; width:30px;height:30px;background:red;\">\n\t<div style=\"inline-block;width:15px;height:30px;background:lime;\"></div>\n\t<div style=\"inline-block;width:15px;height:30px;background:lime;\"></div>\n</div>\n</div><div class=\"info\">column-width: 15px;\ncolumn-gap: 0;</div></div>\n\n</td></tr>\n<tr><th><h3>Web Storage - name/value pairs</h3><span class=\"links\">[<a href=\"http://caniuse.com/namevalue-storage\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=namevalue-storage&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"namevalue-storage0\" class=\"auto pass\"></div><script>setResult('namevalue-storage0', Modernizr.localstorage);</script><div class=\"info\">Modernizr test for: \"localstorage\"</div></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"namevalue-storage1\" class=\"auto pass\"></div><script>\n(function() {\n\tvar result = false;\n\tif(window.localStorage) {\n\t\ttry {\n\t\t\tlocalStorage.setItem('foo', 'bar');\n\t\t\tif(localStorage.getItem('foo') === 'bar'\n\t\t\t\t&& localStorage['foo'] === 'bar'\n\t\t\t\t&& localStorage.foo === 'bar'\n\t\t\t) {\n\t\t\t\tlocalStorage.removeItem('foo');\n\t\t\t\tif(localStorage.getItem('foo') === null) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\tsetResult('namevalue-storage1', result);\n})();\n\n</script><div class=\"info\">Test if getItem, setItem and removeItem work.</div></div>\n\n</td></tr>\n<tr><th><h3>Web Notifications</h3><span class=\"links\">[<a href=\"http://caniuse.com/notifications\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=notifications&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"notifications0\" class=\"auto pass\"></div><script>\nsetResult('notifications0',\n\"webkitNotifications\" in window\n|| \"mozNotifications\" in window\n|| \"oNotifications\" in window\n|| \"msNotifications\" in window\n|| \"khtmlNotifications\" in window\n|| \"notifications\" in window\n);\n</script></div>\n\n</td></tr>\n<tr><th><h3>Offline web applications</h3><span class=\"links\">[<a href=\"http://caniuse.com/offline-apps\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=offline-apps&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"offline-apps0\" class=\"auto pass\"></div><script>setResult('offline-apps0', Modernizr.applicationcache);</script><div class=\"info\">Modernizr test for: \"applicationcache\"</div></div>\n\n</td></tr>\n<tr><th><h3>querySelector/querySelectorAll</h3><span class=\"links\">[<a href=\"http://caniuse.com/queryselector\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=queryselector&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"queryselector0\" class=\"auto pass\"></div><script>\nsetResult('queryselector0', !!document.querySelectorAll && !!document.querySelector)\n</script></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"queryselector1\" class=\"auto pass\"></div>\t<div id=\"queryselector1test\">\n\t\t<div data-foo=\"queryselector1\"></div>\n\t\t<div id=\"queryselector1target\"></div>\n\t\t<div class=\"altqueryselector1test\"></div>\n\t</div>\n<script>\n(function() {\n\tif(document.querySelector) {\n\t\tvar elem = document.querySelector('[data-foo=queryselector1] + *');\n\t\tvar target = document.getElementById('queryselector1target');\n\t\tsetResult('queryselector1', elem === target);\n\t}\n}());\n</script><div class=\"info\">querySelector test on selector '[data-foo=bar] + *'</div></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"queryselector2\" class=\"auto pass\"></div>\t<div id=\"queryselector2test\">\n\t\t<div data-foo=\"queryselector2\"></div>\n\t\t<div id=\"queryselector2target\"></div>\n\t\t<div class=\"altqueryselector2test\"></div>\n\t</div>\n<script>\n(function() {\n\tif(document.querySelector) {\n\t\tvar elem = document.querySelector('[data-foo=queryselector2] + *');\n\t\tvar target = document.getElementById('queryselector2target');\n\t\tsetResult('queryselector2', elem === target);\n\t}\n}());\n</script><div class=\"info\">querySelectorAll test on selector '[data-foo=bar] + *'</div></div>\n\n</td></tr>\n<tr><th><h3>SVG (basic support)</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"svg0\" class=\"auto pass\"></div><script>setResult('svg0', Modernizr.svg);</script><div class=\"info\">Modernizr test for: \"svg\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg1\" class=\"visual-square\"></div><div class=\"square\"><object type=\"image/svg+xml\" width=\"30\" height=\"30\" data=\"./caniuse_files/svg-img.svg\" style=\"overflow:visible\"> SVG fail\n</object></div><div class=\"info\">SVG in &lt;object&gt;</div></div>\n\n</td></tr>\n<tr><th><h3>SVG effects for HTML</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-html\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-html&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;</td><td>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"svg-html1\" class=\"visual\"></div><div class=\"vis_test\"> <object type=\"image/svg+xml\" width=\"60\" height=\"30\" data=\"http://tests.caniuse.com/blur-html.svg\"> SVG fail\n </object></div><div class=\"vis_ref\"><img src=\"./caniuse_files/svg-html-blur.png\"></div><p class=\"condition\">Text must appear blurry</p><div class=\"info\">SVG with feGaussianBlur filter on foreignObject</div></div>\n\n</td></tr>\n<tr><th><h3>Inline SVG in HTML5</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-html5\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-html5&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"svg-html50\" class=\"auto pass\"></div><script>setResult('svg-html50', Modernizr.inlinesvg);</script><div class=\"info\">Modernizr test for: \"inlinesvg\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-html51\" class=\"visual-square\"></div><div class=\"square\"><svg width=\"30\" height=\"30\" xmlns=\"http://www.w3.org/2000/svg\" style=\"background:red;\"> \n    <rect height=\"30\" width=\"30\" y=\"0\" x=\"0\" fill=\"#00ff00\"></rect> \n</svg>\n</div></div>\n\n</td></tr>\n<tr><th><h3>SVG SMIL animation</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-smil\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-smil&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"svg-smil0\" class=\"auto pass\"></div><script>setResult('svg-smil0', Modernizr.smil);</script><div class=\"info\">Modernizr test for: \"smil\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-smil1\" class=\"visual-square\"></div><div class=\"square\"><object type=\"image/svg+xml\" width=\"30\" height=\"30\" data=\"http://tests.caniuse.com/svg-animate.svg\" style=\"overflow:visible\"> SVG fail\n</object></div><div class=\"info\">SVG with animate element inside a rect</div></div>\n\n</td></tr>\n<tr><th><h3>Touch events</h3><span class=\"links\">[<a href=\"http://caniuse.com/touch\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=touch&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"touch0\" class=\"auto fail\"></div><script>setResult('touch0', Modernizr.touch);</script><div class=\"info\">Modernizr test for: \"touch\"</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Transforms</h3><span class=\"links\">[<a href=\"http://caniuse.com/transforms2d\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=transforms2d&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"transforms2d0\" class=\"auto pass\"></div><script>setResult('transforms2d0', Modernizr.csstransforms);</script><div class=\"info\">Modernizr test for: \"csstransforms\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"transforms2d1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background:red;overflow:hidden\">\n\t<div style=\"background:lime;width:30px;height:30px;position:relative;left:-30px;-webkit-transform: translate(30px);-moz-transform: translate(30px);-ms-transform: translate(30px);-o-transform: translate(30px);transform: translate(30px); \"></div>\n</div>\n</div><div class=\"info\">transform: translate(30px);</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 3D Transforms</h3><span class=\"links\">[<a href=\"http://caniuse.com/transforms3d\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=transforms3d&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"transforms3d0\" class=\"auto pass\"></div><script>setResult('transforms3d0', Modernizr.csstransforms3d);</script><div class=\"info\">Modernizr test for: \"csstransforms3d\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"transforms3d1\" class=\"visual-square\"></div><div class=\"square\"><style>\n#transforms3d1container {\n\tbackground: red;\n\twidth: 30px;\n\theight: 30px;\n\toverflow: hidden;\n\t-webkit-perspective: 600;\n\t-webkit-perspective-origin: 0 200px;\n\t-moz-perspective: 600;\n\t-moz-perspective-origin: 0 200px;\n\t-ms-perspective: 600;\n\t-ms-perspective-origin: 0 200px;\n\t-o-perspective: 600;\n\t-o-perspective-origin: 0 200px;\n\tperspective: 600;\n\tperspective-origin: 0 200px;\n\n}\n\n#transforms3d1test { \n\twidth:400px; height:100px;\n\tbackground: lime;\n\tposition: relative;\n\ttop: 30px;\n\t-webkit-transform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);\n\t-moz-transform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);\n\t-ms-transform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);\n\t-o-transform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);\n\ttransform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);\n\n}\n</style>\n<div id=\"transforms3d1container\">\n\t<div id=\"transforms3d1test\"></div>\n</div></div><div class=\"info\">Parent:\nperspective: 600;\nperspective-origin: 0 200px;\n\nChild:\n\ntransform: translate3d(-234px, 0, 0) rotate3d(0, 1, 0, -70deg);</div></div>\n\n</td></tr>\n<tr><th><h3>Video element</h3><span class=\"links\">[<a href=\"http://caniuse.com/video\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=video&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"video0\" class=\"auto pass\"></div><script>\nsetResult('video0', !!document.createElement('video').canPlayType);\n</script></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"video1\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n\t<source src=\"video.mp4\" type=\"video/mp4\">\n\t<source src=\"video.ogv\" type=\"video/ogv\">\n\t<source src=\"video.webm\" type=\"video/webm\">\n</video><div class=\"info\">Video with controls and all three formats available.</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"video2\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n\t<source src=\"mimevid.php?type=.mp4\" type=\"video/mp4\">\n\t<source src=\"mimevid.php?type=.ogv\" type=\"video/ogg\">\n\t<source src=\"mimevid.php?type=.webm\" type=\"video/webm\">\n</video><div class=\"info\">Video with controls and all three formats available (with MIME).</div></div>\n\n</td></tr>\n<tr><th><h3>Web Sockets</h3><span class=\"links\">[<a href=\"http://caniuse.com/websockets\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=websockets&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"websockets0\" class=\"auto pass\"></div><script>setResult('websockets0', Modernizr.websockets);</script><div class=\"info\">Modernizr test for: \"websockets\"</div></div>\n\n</td></tr>\n<tr><th><h3>Web Workers</h3><span class=\"links\">[<a href=\"http://caniuse.com/webworkers\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=webworkers&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"webworkers0\" class=\"auto pass\"></div><script>setResult('webworkers0', Modernizr.webworkers);</script><div class=\"info\">Modernizr test for: \"webworkers\"</div></div>\n\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"webworkers1\" class=\"auto pass\"></div><script>\n(function() {\n\ntry {\n\n\tvar w = new Worker('worker.js');\n\t\n\tw.onmessage = function (event) {\n\t  var success = (event.data && event.data === 'worker works');\n\t  setResult('webworkers1', success);\n\t}\n\t\n\tw.postMessage('');\n\n} catch(e) {\n\tsetResult('webworkers1', false);\n}\n\n}());\n</script><div class=\"info\">Create a new Worker using new Worker('worker.js');\n\nThen, test postMessage and onmessage event.</div></div>\n\n</td></tr>\n<tr><th><h3>Cross-document messaging</h3><span class=\"links\">[<a href=\"http://caniuse.com/x-doc-messaging\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=x-doc-messaging&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"x-doc-messaging0\" class=\"auto pass\"></div><script>setResult('x-doc-messaging0', Modernizr.postmessage);</script><div class=\"info\">Modernizr test for: \"postmessage\"</div></div>\n\n</td></tr>\n<tr><th><h3>XMLHttpRequest 2</h3><span class=\"links\">[<a href=\"http://caniuse.com/xhr2\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=xhr2&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"xhr20\" class=\"auto pass\"></div><script>\nvar progEv = !!(window.ProgressEvent);\nvar fdata = !!(window.FormData);\nsetResult('xhr20', (progEv && fdata));\n</script></div>\n\n</td></tr>\n<tr><th><h3>XHTML served as application/xhtml+xml</h3><span class=\"links\">[<a href=\"http://caniuse.com/xhtml\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=xhtml&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"xhtml0\" class=\"auto pass\"></div><iframe src=\"./caniuse_files/xhtml.html\" width=\"15\" height=\"15\" style=\"display:none\"></iframe></div>\n\n</td></tr>\n<tr><th><h3>CSS Generated content</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-gencontent\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-gencontent&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"css-gencontent0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#gencontent:before {\n content: 'A';\n}\n#gencontent:after {\n content: 'Z';\n}\n</style>\n<span id=\"gencontent\">-</span></div><div class=\"vis_ref\"><img src=\"./caniuse_files/before-after.png\"></div><div class=\"info\">Element with CSS: \n#gencontent:before {\n content: 'A';\n}\n#gencontent:after {\n content: 'Z';\n}</div></div>\n\n</td></tr>\n<tr><th><h3>CSS Table display</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-table\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-table&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"css-table0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#table-test { display: table; }\n#table-test .table-tr { display: table-row; }\n#table-test .table-td { display: table-cell;border:1px solid; }\n</style>\n<div style=\"display:inline-block;vertical-align:middle\">\n<div id=\"table-test\">\n\t<div class=\"table-tr\">\n\t\t<div class=\"table-td\">topleft</div>\n\t\t<div class=\"table-td\">topright</div>\n\t</div>\n\t<div class=\"table-tr\">\n\t\t<div class=\"table-td\">bottomleft</div>\n\t\t<div class=\"table-td\">bottomright</div>\n\t</div>\n</div>\n</div></div><div class=\"vis_ref\"><img src=\"./caniuse_files/table.png\"></div><p class=\"condition\">Should be 2x2 table</p></div>\n\n</td></tr>\n<tr><th><h3>HTML5 form features</h3><span class=\"links\">[<a href=\"http://caniuse.com/forms\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=forms&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"forms0\" class=\"visual\"></div><div class=\"vis_test\"><input type=\"date\"><br><input type=\"time\"><br><input type=\"range\"><br><input type=\"number\"></div><p class=\"condition\">date/time/range/number widgets</p></div>\n\n</td></tr>\n<tr><th><h3>MathML</h3><span class=\"links\">[<a href=\"http://caniuse.com/mathml\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=mathml&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"mathml0\" class=\"visual\"></div><div class=\"vis_test\"><iframe src=\"./caniuse_files/mathml.html\" width=\"210\" height=\"110\" style=\"border:0;\"></iframe></div><div class=\"vis_ref\"><img src=\"./caniuse_files/mathml_ref.png\"></div></div>\n\n</td></tr>\n<tr><th><h3>PNG alpha transparency</h3><span class=\"links\">[<a href=\"http://caniuse.com/png-alpha\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=png-alpha&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"png-alpha0\" class=\"visual\"></div><div class=\"vis_test\"><img src=\"./caniuse_files/alpha.png\" style=\"background-color:lime\"></div><div class=\"vis_ref\"><img src=\"./caniuse_files/png_alpha_result.png\"></div></div>\n\n</td></tr>\n<tr><th><h3>Ruby annotation</h3><span class=\"links\">[<a href=\"http://caniuse.com/ruby\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=ruby&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"ruby0\" class=\"visual\"></div><div class=\"vis_test\">\n<div style=\"display:inline-block;vertical-align:middle\">\n<ruby>(bottom1)<rt>(top1)</rt>(bottom2)<rt>(top2)</rt></ruby>\n</div></div><div class=\"vis_ref\"><img src=\"./caniuse_files/ruby.png\"></div><p class=\"condition\">Elements should be stacked on top of each other</p></div>\n\n</td></tr>\n<tr><th><h3>SVG filters</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-filters\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-filters&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"svg-filters0\" class=\"visual\"></div><div class=\"vis_test\"><object data=\"http://tests.caniuse.com/blur.svg\" type=\"image/svg+xml\" height=\"70\" width=\"70\">\n\tobject SVG not supported\n</object>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/svg_blur.png\"></div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-filters1\" class=\"visual-square\"></div><div class=\"square\"><object type=\"image/svg+xml\" width=\"30\" height=\"30\" data=\"http://tests.caniuse.com/fecolormatrix.svg\" style=\"overflow:visible\"> SVG fail\n</object></div><p class=\"condition\">Must be green (not lime)</p><div class=\"info\">SVG with &lt;feColorMatrix type=\"hueRotate\" values=\"120\"/&gt;</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-filters2\" class=\"visual-square\"></div><div class=\"square\"><object type=\"image/svg+xml\" width=\"30\" height=\"30\" data=\"http://tests.caniuse.com/feflood.svg\" style=\"overflow:visible\"> SVG fail\n</object></div><div class=\"info\">SVG with &lt;feFlood flood-color=\"lime\"/&gt;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Word-wrap</h3><span class=\"links\">[<a href=\"http://caniuse.com/wordwrap\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=wordwrap&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"wordwrap0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#wordwraptest {\n  display: inline-block;\n  width: 30px;\n  word-wrap: break-word;\n}\n\n</style>\n<div id=\"wordwraptest\">abcdefghijklmnopqrstuvwxyz</div>\n\n\n</div><p class=\"condition\">Text should wrap</p></div>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"wordwrap1\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#wordwraptest2 {\n  display: inline-block;\n  width: 30px;\n  word-wrap: normal;\n}\n</style>\n\n<div id=\"wordwraptest2\">abcdefghijklmnopqrstuvwxyz</div>\n</div><p class=\"condition\">Text should overflow box</p></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"wordwrap2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background:red;overflow:hidden\">\n\t<div style=\"color:lime;font-size:10px;line-height:10px;word-wrap:break-word;background:lime;\">abcdefghijklmnop</div>\n</div>\n</div><div class=\"info\">word-wrap: break-word;</div></div>\n\n</td></tr>\n<tr><th><h3>calc() as CSS unit value</h3><span class=\"links\">[<a href=\"http://caniuse.com/calc\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=calc&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"calc0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#calc0test {\n\twidth: 0px;\n\twidth: -webkit-calc(10px + 20px);\n\twidth: -moz-calc(10px + 20px);\n\twidth: -ms-calc(10px + 20px);\n\twidth: -o-calc(10px + 20px);\n\twidth: calc(10px + 20px);\n\theight: 30px;\n\tbackground: lime;\n}\n</style>\n<div id=\"calc0test\"></div>\n</div><div class=\"info\">width: calc(10px + 20px);</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"calc2\" class=\"visual-square\"></div><div class=\"square\"><style>\n#calc2test {\nheight:-webkit-calc(60px - 100%); width:-webkit-calc((100% / 2) + 15px - 0.5em); border-right:-webkit-calc(0.5em) solid lime;\nheight:-moz-calc(60px - 100%); width:-moz-calc((100% / 2) + 15px - 0.5em); border-right:-moz-calc(0.5em) solid lime;\nheight:-ms-calc(60px - 100%); width:-ms-calc((100% / 2) + 15px - 0.5em); border-right:-ms-calc(0.5em) solid lime;\nheight:-o-calc(60px - 100%); width:-o-calc((100% / 2) + 15px - 0.5em); border-right:-o-calc(0.5em) solid lime;\nheight:calc(60px - 100%); width:calc((100% / 2) + 15px - 0.5em); border-right:calc(0.5em) solid lime;\n\nbackground: lime;\n}\n</style>\n<div id=\"calc2test\"></div>\n</div><div class=\"info\">height: calc(60px - 100%);\nwidth: calc((100% / 2) + 15px - 0.5em);\nborder-right: calc(0.5em) solid lime;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS Grid Layout</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-grid\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-grid&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-grid0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#css-grid0grid {\n\tdisplay: -webkit-grid; \tdisplay: -moz-grid; \tdisplay: -ms-grid; \tdisplay: -o-grid; \tdisplay: grid; \n\t-webkit-grid-columns: 15px 1fr; \t-moz-grid-columns: 15px 1fr; \t-ms-grid-columns: 15px 1fr; \t-o-grid-columns: 15px 1fr; \tgrid-columns: 15px 1fr; \n\t-webkit-grid-rows: 15px 15px; \t-moz-grid-rows: 15px 15px; \t-ms-grid-rows: 15px 15px; \t-o-grid-rows: 15px 15px; \tgrid-rows: 15px 15px; \n\n}\n\n#css-grid0grid > div {\n\tbackground: lime;\n}\n\n#css-grid0a {\n\t-webkit-grid-row: 1; \t-moz-grid-row: 1; \t-ms-grid-row: 1; \t-o-grid-row: 1; \tgrid-row: 1; \n\t-webkit-grid-column: 1; \t-moz-grid-column: 1; \t-ms-grid-column: 1; \t-o-grid-column: 1; \tgrid-column: 1; \n}\n\n#css-grid0b {\n\t-webkit-grid-row: 1; \t-moz-grid-row: 1; \t-ms-grid-row: 1; \t-o-grid-row: 1; \tgrid-row: 1; \n\t-webkit-grid-column: 2; \t-moz-grid-column: 2; \t-ms-grid-column: 2; \t-o-grid-column: 2; \tgrid-column: 2; \n}\n\n#css-grid0c {\n\t-webkit-grid-row: 2; \t-moz-grid-row: 2; \t-ms-grid-row: 2; \t-o-grid-row: 2; \tgrid-row: 2; \n\t-webkit-grid-column: 1; \t-moz-grid-column: 1; \t-ms-grid-column: 1; \t-o-grid-column: 1; \tgrid-column: 1; \n\t-webkit-grid-column-span: 2; \t-moz-grid-column-span: 2; \t-ms-grid-column-span: 2; \t-o-grid-column-span: 2; \tgrid-column-span: 2; \n}\n</style>\n\n<div id=\"css-grid0grid\">\n\t <div id=\"css-grid0a\"></div>\n\t <div id=\"css-grid0b\"></div>\n\t <div id=\"css-grid0c\"></div>\n</div>\n\n</div><div class=\"info\">Grid with two columns, two rows and three elements taking up space.</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Media Queries</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-mediaqueries\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-mediaqueries&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-mediaqueries0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#mediaq1,#mediaq2,#mediaq3,#mediaq4 {\n background: red;\n float: left;\n width: 15px;\n height: 15px;\n}\n\n#mediaq3 {\n\tclear: left;\n}\n\n@media all and (min-width: 0px) {\n #mediaq1, #mediaq3 { background: lime; }\n}\n\n@media all and (max-width: 999999px) {\n #mediaq2, #mediaq4 { background: lime; }\n}\n\n\n@media all and (min-width: 999999px) {\n #mediaq3 { background: red; }\n}\n\n@media all and (max-width: 0px) {\n #mediaq4 { background: red; }\n}\n\n</style>\n\n<div id=\"mediaq1\"></div>\n<div id=\"mediaq2\"></div>\n<div id=\"mediaq3\"></div>\n<div id=\"mediaq4\"></div></div></div>\n\n</td></tr>\n<tr><th><h3>CSS 2.1 selectors</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-sel2\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-sel2&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-sel20\" class=\"visual-square\"></div><div class=\"square\"><style>\n#css-sel20test div {\n\twidth: 30px;\n\theight: 30px;\n\tbackground: red;\n}\n\n#css-sel20test > div {\n\tbackground: lime;\n}\n</style>\n<div id=\"css-sel20test\">\n\t<div></div>\n</div>\n</div><div class=\"info\">Test for child ( &gt; )selector</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-sel21\" class=\"visual-square\"></div><div class=\"square\"><style>\n#css-sel21test + div { background: lime; width:30px; height:30px;}\n</style>\n<div id=\"css-sel21test\"></div>\n<div></div>\n</div><div class=\"info\">Adjacent sibling selector test ( + )</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css-sel22\" class=\"visual-square\"></div><div class=\"square\"><style>\n#css-sel22test[role=\"none\"] { background: lime; width:30px; height:30px;}\n</style>\n<div id=\"css-sel22test\" role=\"none\"></div></div><div class=\"info\">Attribute selector ( [role=\"none\"] )</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Box-sizing</h3><span class=\"links\">[<a href=\"http://caniuse.com/css3-boxsizing\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css3-boxsizing&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"css3-boxsizing0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#boxsizetest {\n   -webkit-box-sizing: border-box;\n-moz-box-sizing: border-box;\n-ms-box-sizing: border-box;\n-o-box-sizing: border-box;\nbox-sizing: border-box;\n    background: red;\n    border-left: 30px solid lime;\n    display: inline-block;\n    height: 30px;\n    width: 30px;\n}\n</style>\n<div id=\"boxsizetest\"></div>\n</div></div>\n\n</td></tr>\n<tr><th><h3>Data URLs</h3><span class=\"links\">[<a href=\"http://caniuse.com/datauri\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=datauri&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"datauri0\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background-image: url(&#39;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFAP8AAAAAbwN%2BQwAAAAxJREFUeNpiYAAIMAAAAgABT21Z4QAAAABJRU5ErkJggg%3D%3D&#39;);width:30px;height:30px;\"></div></div><div class=\"info\">div with data URL as background image</div></div>\n\n</td></tr>\n<tr><th><h3>New semantic elements</h3><span class=\"links\">[<a href=\"http://caniuse.com/html5semantic\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=html5semantic&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"html5semantic0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#html5semantic0test {\n\twidth: 30px;\n\theight: 30px;\n\tbackground: red;\n}\n\n#html5semantic0test * {\n\tbackground: lime;\n\theight: 4px;\n}\n\n#html5semantic0test section {\n\theight: 6px;\n}\n</style>\n\n<div id=\"html5semantic0test\">\n\t<section></section>\n\t<article></article>\n\t<aside></aside>\n\t<hgroup></hgroup>\n\t<header></header>\n\t<footer></footer>\n\t<nav></nav>\n</div></div><div class=\"info\">section, article, aside, hgroup, header, footer, nav tested for default \"block\" style.</div></div>\n\n</td></tr>\n<tr><th><h3>CSS inline-block</h3><span class=\"links\">[<a href=\"http://caniuse.com/inline-block\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=inline-block&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"inline-block0\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background:lime;display:inline-block;width:15px;height:30px;\"></div><div style=\"background:lime;display:inline-block;width:15px;height:30px;\"></div></div></div>\n\n</td></tr>\n<tr><th><h3>CSS min/max-width/height</h3><span class=\"links\">[<a href=\"http://caniuse.com/minmaxwh\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=minmaxwh&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"minmaxwh0\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:200%;max-width:30px;height:30px;overflow:visible;background:lime\"></div></div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"minmaxwh1\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:0;min-width:30px;height:30px;background:lime\"></div></div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"minmaxwh2\" class=\"visual-square\"></div><div class=\"square\"><div style=\"height:100px;max-height:30px;width:30px;background:lime\"></div></div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"minmaxwh3\" class=\"visual-square\"></div><div class=\"square\"><div style=\"height:0;min-height:30px;width:30px;background:lime\"></div></div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 object-fit/object-position</h3><span class=\"links\">[<a href=\"http://caniuse.com/object-fit\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=object-fit&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"object-fit0\" class=\"visual-square\"></div><div class=\"square\"><style>\n#object-fit0test {\n\twidth: 30px;\n\theight: 30px;\n\tbackground: lime;\n\toverflow: hidden;\n}\n\n#object-fit0test img {\n\t-webkit-object-fit: contain;\n-moz-object-fit: contain;\n-ms-object-fit: contain;\n-o-object-fit: contain;\nobject-fit: contain;\n\n}\n</style>\n\n<div id=\"object-fit0test\">\n\t<img src=\"./caniuse_files/red30x30.png\" width=\"90\" height=\"30\">\n</div></div><div class=\"info\">object-fit: contain</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"object-fit2\" class=\"visual-square\"></div><div class=\"square\"><style>\n#object-fit2test {\n\twidth: 30px;\n\theight: 30px;\n\tbackground: lime;\n\toverflow: hidden;\n}\n\n#object-fit2test img {\n\t-webkit-object-position: 30px 30px;\n-moz-object-position: 30px 30px;\n-ms-object-position: 30px 30px;\n-o-object-position: 30px 30px;\nobject-position: 30px 30px;\n\n}\n</style>\n\n<div id=\"object-fit2test\">\n\t<img src=\"./caniuse_files/red30x30.png\" width=\"30\" height=\"30\">\n</div>\n</div><div class=\"info\">object-position: 30px 30px;</div></div>\n\n</td></tr>\n<tr><th><h3>rem (root em) units</h3><span class=\"links\">[<a href=\"http://caniuse.com/rem\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=rem&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"rem0\" class=\"visual-square\"></div><div class=\"square\"><div style=\"background:red;width:30px;height:30px;position:relative;overflow:hidden;text-align:left\">\n\t<span style=\"font-size:1px;background:lime;color:lime;position:relative;left:-6px;line-height:30px;font-size:5rem;\">A</span>\n</div></div><div class=\"info\">span with single character and font-size: 5rem;</div></div>\n\n</td></tr>\n<tr><th><h3>SVG in CSS backgrounds</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-css\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-css&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-css0\" class=\"visual-square\"></div><div class=\"square\"><div style=\"width:30px;height:30px;background-image: url(caniuse_files/svg-img.svg)\"></div>\n\n</div></div>\n\n</td></tr>\n<tr><th><h3>SVG in HTML img element</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-img\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-img&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"svg-img0\" class=\"visual-square\"></div><div class=\"square\"><img src=\"./caniuse_files/svg-img.svg\" width=\"30\" height=\"30\"></div></div>\n\n</td></tr>\n<tr><th><h3>contenteditable attribute (basic support)</h3><span class=\"links\">[<a href=\"http://caniuse.com/contenteditable\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=contenteditable&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"contenteditable0\" class=\"interact\"></div><div contenteditable=\"true\">\n<p>This element should be editable.</p>\n</div><div class=\"info\">Div element with attribute  contenteditable=\"true\"</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 selectors</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-sel3\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-sel3&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"css-sel30\" class=\"interact\"></div><a href=\"http://tools.css3.info/selectors-test/test.html\" target=\"_blank\">Test here</a></div>\n\n</td></tr>\n<tr><th><h3>Drag and Drop</h3><span class=\"links\">[<a href=\"http://caniuse.com/dragndrop\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=dragndrop&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"dragndrop0\" class=\"interact\"></div><a href=\"http://html5demos.com/drag\">Test here</a></div>\n\n</td></tr>\n<tr><th><h3>WAI-ARIA Accessibility features</h3><span class=\"links\">[<a href=\"http://caniuse.com/wai-aria\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=wai-aria&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;</td><td>\n\n</td></tr>\n<tr><th><h3>Text API for Canvas</h3><span class=\"links\">[<a href=\"http://caniuse.com/canvas-text\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=canvas-text&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"canvas-text0\" class=\"auto pass\"></div><script>setResult('canvas-text0', Modernizr.canvastext);</script><div class=\"info\">Modernizr test for: \"canvastext\"</div></div>\n\n</td></tr>\n<tr><th><h3>WebGL - 3D Canvas graphics</h3><span class=\"links\">[<a href=\"http://caniuse.com/webgl\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=webgl&prefix=all\">Single feat</a>]</span></th><td class=\"current partial\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"webgl0\" class=\"auto pass\"></div><script>setResult('webgl0', Modernizr.webgl);</script><div class=\"info\">Modernizr test for: \"webgl\"</div></div>\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"webgl1\" class=\"visual-square\"></div><div class=\"square\"><canvas width=\"30\" height=\"30\" style=\"background:red;\" id=\"webgl_canvas\"></canvas>\n<script>\nvar elem  = $('#webgl_canvas')[0], g;\ntry {\n    g     = elem.getContext && elem.getContext('experimental-webgl');\n} catch(e){};\n\nif (g){    \n  g.clearColor(0,1,0,1);\n  g.clear(g.COLOR_BUFFER_BIT);\n}\n</script>\n</div></div>\n\n</td></tr>\n<tr><th><h3>SVG fonts</h3><span class=\"links\">[<a href=\"http://caniuse.com/svg-fonts\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=svg-fonts&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"svg-fonts0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n@font-face { \n  font-family: Windsong_svg; \n  src: url(caniuse_files/Windsong-webfont.svg#webfontuOn4Eelr) format(\"svg\");\n}\n#windsong_svg {\n\tfont: 18px Windsong_svg;\n\tmargin: 5px;\n}\n</style>\n<p id=\"windsong_svg\">Windsong font</p>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/windsong_font.png\"></div></div>\n\n</td></tr>\n<tr><th><h3>TTF/OTF - TrueType and OpenType font support</h3><span class=\"links\">[<a href=\"http://caniuse.com/ttf\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=ttf&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"ttf0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n@font-face {\n\tfont-family: 'Windsong_otf';\n\tsrc: url('caniuse_files/Windsong-webfont.otf');\n}\n\n#windsong_otf {\n\tfont: 18px Windsong_otf;\n\tmargin: 5px;\n}\n</style>\n<p id=\"windsong_otf\">Windsong font</p>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/windsong_font.png\"></div><div class=\"info\">OTF font test</div></div>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"ttf1\" class=\"visual\"></div><div class=\"vis_test\"><style>\n@font-face {\n\tfont-family: 'Windsong_ttf';\n\tsrc: url('caniuse_files/Windsong-webfont.ttf');\n}\n\n#windsong_ttf {\n\tfont: 18px Windsong_ttf;\n\tmargin: 5px;\n}\n</style>\n<p id=\"windsong_ttf\">Windsong font</p>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/windsong_font.png\"></div><div class=\"info\">TTF font test</div></div>\n\n</td></tr>\n<tr><th><h3>WOFF - Web Open Font Format</h3><span class=\"links\">[<a href=\"http://caniuse.com/woff\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=woff&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"woff0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n@font-face {\n\tfont-family: 'Windsong_woff';\n\tsrc: url('caniuse_files/Windsong-webfont.woff');\n}\n\n#windsong_woff {\n\tfont: 18px Windsong_woff;\n\tmargin: 5px;\n}\n</style>\n<p id=\"windsong_woff\">Windsong font</p>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/windsong_font.png\"></div></div>\n\n</td></tr>\n<tr><th><h3>Progress &amp; Meter</h3><span class=\"links\">[<a href=\"http://caniuse.com/progressmeter\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=progressmeter&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"progressmeter0\" class=\"visual\"></div><div class=\"vis_test\"><div style=\"display:inline-block;vertical-align:middle\">\n<progress value=\"5\" max=\"10\">fail</progress>\n<meter value=\"5\" max=\"10\">fail</meter>\n</div></div><p class=\"condition\">Progress and meter widgets at 50%</p></div>\n\n</td></tr>\n<tr><th><h3>Datalist element</h3><span class=\"links\">[<a href=\"http://caniuse.com/datalist\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=datalist&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"datalist0\" class=\"interact\"></div><input type=\"text\" list=\"mydatalist\">\n<datalist id=\"mydatalist\">\n<option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option>\n<option value=\"foobar\">foobar</option>\n</datalist><p class=\"condition\">Show \"foo\" and \"foobar\" as options when \"f\" is entered</p></div>\n\n</td></tr>\n<tr><th><h3>Form validation</h3><span class=\"links\">[<a href=\"http://caniuse.com/form-validation\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=form-validation&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"form-validation0\" class=\"interact\"></div><iframe src=\"./caniuse_files/form_validation.html\" width=\"300\" height=\"80\"></iframe><p class=\"condition\">Form should show warning and NOT submit</p></div>\n\n</td></tr>\n<tr><th><h3>MPEG-4/H.264 video format</h3><span class=\"links\">[<a href=\"http://caniuse.com/mpeg4\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=mpeg4&prefix=all\">Single feat</a>]</span></th><td class=\"current fail\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"mpeg40\" class=\"auto pass\"></div><script>\nvar v = document.createElement('video'); \nsetResult('mpeg40', !!(v.canPlayType && v.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '')));\n</script></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"mpeg41\" class=\"interact\"></div><video src=\"video.mp4\" width=\"160\" height=\"120\" controls=\"\">fail</video><div class=\"info\">Video, no MIME, no type attribute.</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"mpeg42\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"video.mp4\" type=\"video/ogg; codecs=&quot;theora, vorbis&quot;\">\n</video><div class=\"info\">Video with source element</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"mpeg43\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"mimevid.php?type=.mp4\" type=\"video/mp4; codecs=&quot;avc1.42E01E, mp4a.40.2&quot;\">\n</video><div class=\"info\">Video with source element and MIME set</div></div>\n\n</td></tr>\n<tr><th><h3>Ogg/Theora video format</h3><span class=\"links\">[<a href=\"http://caniuse.com/ogv\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=ogv&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"ogv0\" class=\"auto pass\"></div><script>\nvar v = document.createElement('video'); \nsetResult('ogv0', !!(v.canPlayType && v.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '')));\n</script></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"ogv1\" class=\"interact\"></div><video src=\"video.ogv\" width=\"160\" height=\"120\" controls=\"\">fail</video><div class=\"info\">Video, no MIME, no type attribute.</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"ogv2\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"mimevid.php?type=.ogv\" type=\"video/ogg; codecs=&quot;theora, vorbis&quot;\">\n</video><div class=\"info\">Video with source element and MIME set</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"ogv3\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"video.ogv\" type=\"video/ogg; codecs=&quot;theora, vorbis&quot;\">\n</video><div class=\"info\">Video with source element</div></div>\n\n</td></tr>\n<tr><th><h3>WebM/VP8 video format</h3><span class=\"links\">[<a href=\"http://caniuse.com/webm\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=webm&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"webm0\" class=\"auto pass\"></div><script>\nvar v = document.createElement('video'); \nsetResult('webm0', !!(v.canPlayType && v.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '')));\n</script></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"webm1\" class=\"interact\"></div><video src=\"video.webm\" width=\"160\" height=\"120\" controls=\"\">fail</video><div class=\"info\">Video, no MIME, no type attribute.</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"webm2\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"video.webm\" type=\"video/ogg; codecs=&quot;theora, vorbis&quot;\">\n</video><div class=\"info\">Video with source element</div></div>\n\n<div class=\"test_wrap\"><h3>Interact</h3><div id=\"webm3\" class=\"interact\"></div><video width=\"160\" height=\"120\" controls=\"\">\n <source src=\"mimevid.php?type=.webm\" type=\"video/webm; codecs=&quot;vp8, vorbis&quot;\">\n</video><div class=\"info\">Video with source element and MIME set</div></div>\n\n</td></tr>\n<tr><th><h3>Animated PNG (APNG) [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/apng\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=apng&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"apng0\" class=\"auto fail\"></div><script>\n(function() {\n\t// From: http://eligrey.com/blog/post/apng-feature-detection\n\tvar apngTest = new Image();\n\tvar canv = document.createElement(\"canvas\");\n\tvar apng_supported = null;\n\tif(canv.getContext && canv.getContext(\"2d\").drawImage) {\n\t\tvar ctx = canv.getContext(\"2d\");\n\t\tvar apng_supported = false;\n\t\tapngTest.onload = function () {\n\t\t\tctx.drawImage(apngTest, 0, 0);\n\t\t\tapng_supported = ( ctx.getImageData(0, 0, 1, 1).data[3] === 0 );\n\t\t\tsetResult('apng0', apng_supported);\n\t\t};\n\t\tapngTest.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==\";\n\t} else {\n\t\tsetResult('apng0', false);\n\t}\n}());\n\n\n</script><div class=\"info\">Test for second frame using Canvas element </div></div>\n\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"apng1\" class=\"visual\"></div><div class=\"vis_test\"><img src=\"./caniuse_files/apng_test.png\" width=\"16\" height=\"16\"></div><p class=\"condition\">Must animate</p></div>\n\n</td></tr>\n<tr><th><h3>CSS Canvas Drawings [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-canvas\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-canvas&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"css-canvas0\" class=\"auto pass\"></div><script>\nsetResult('css-canvas0', 'getCSSCanvasContext' in document)\n</script><div class=\"info\">'getCSSCanvasContext' in document</div></div>\n\n</td></tr>\n<tr><th><h3>CSS Reflections [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-reflections\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-reflections&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"css-reflections0\" class=\"auto pass\"></div><script>setResult('css-reflections0', Modernizr.cssreflections);</script><div class=\"info\">Modernizr test for: \"cssreflections\"</div></div>\n\n\n<div class=\"test_wrap\"><h3>Visual-square</h3><div id=\"reflections1\" class=\"visual-square\"></div><div class=\"square\">\n\n  <div style=\"width:30px; height:30px; overflow:hidden; position:relative; background:red;\">\n <div style=\"background: lime;\n            height: 30px;\n            position: relative;\n            top: -30px;\n            width: 30px;\n            -webkit-box-reflect: below 0;\n               -moz-box-reflect: below 0;\n                -ms-box-reflect: below 0;\n                 -o-box-reflect: below 0;\n                    box-reflect: below 0;\n            \"></div>\n\n</div></div></div>\n\n\n</td></tr>\n<tr><th><h3>Web SQL Database [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/sql-storage\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=sql-storage&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto (m)</h3><div id=\"sql-storage0\" class=\"auto pass\"></div><script>setResult('sql-storage0', Modernizr.websqldatabase);</script><div class=\"info\">Modernizr test for: \"websqldatabase\"</div></div>\n\n</td></tr>\n<tr><th><h3>Stream API [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/stream\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=stream&prefix=all\">Single feat</a>]</span></th><td class=\"current unknown\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Auto</h3><div id=\"stream0\" class=\"auto fail\"></div><script>\nsetResult('stream0', \"getUserMedia\" in navigator);\n</script><div class=\"info\">Test for \"getUserMedia\" in navigator object</div></div>\n\n</td></tr>\n<tr><th><h3>CSS Masks [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/css-masks\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=css-masks&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"css-masks0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#masktest {\n\t-webkit-mask-image: url(caniuse_files/alpha.png);\n-moz-mask-image: url(caniuse_files/alpha.png);\n-ms-mask-image: url(caniuse_files/alpha.png);\n-o-mask-image: url(caniuse_files/alpha.png);\nmask-image: url(caniuse_files/alpha.png);\n    background: black;\n    height: 16px;\n    width: 32px;\n    display: inline-block;\n    margin-left: -32px;\n}\n#masktestbg {\n    display: inline-block;\n\tbackground: lime;\n    height: 16px;\n    width: 32px;\n\tleft: -32px;\n}\n\n</style>\n<div id=\"masktestbg\"></div><div id=\"masktest\"></div>\n\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/png_alpha_result.png\"></div><div class=\"info\">mask-image: url(caniuse_files/alpha.png);</div></div>\n\n</td></tr>\n<tr><th><h3>CSS3 Text-overflow [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/text-overflow\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=text-overflow&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"text-overflow0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#textof {\n width: 4em;\n display: inline-block;\n overflow: hidden;\n font: 16px courier, monospace;\n-webkit-text-overflow: ellipsis; \n-moz-text-overflow: ellipsis; \n-ms-text-overflow: ellipsis; \n-o-text-overflow: ellipsis; \ntext-overflow: ellipsis; \n\n text-overflow: ellipsis; \n}\n</style>\n\n<div id=\"textof\">\nabcdefghijklmnopqrstuvwxyz\n</div></div><p class=\"condition\">Should end with ellipsis</p><div class=\"info\">text-overflow: ellipsis;</div></div>\n\n</td></tr>\n<tr><th><h3>CSS text-stroke [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/text-stroke\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=text-stroke&prefix=all\">Single feat</a>]</span></th><td class=\"current pass\">&nbsp;<span>-pre-</span></td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"text-stroke0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n#textstroke {\n-webkit-text-stroke: 2px lime;\n-moz-text-stroke: 2px lime;\n-ms-text-stroke: 2px lime;\n-o-text-stroke: 2px lime;\ntext-stroke: 2px lime;\n\ncolor: #000;\nfont-size: 15px;\npadding: 5px;\nfont-family: Times New Roman, Times, serif;\n}\n</style>\n\n<div id=\"textstroke\">\ngreen stroked text\n</div></div><div class=\"vis_ref\"><img src=\"./caniuse_files/stroked-text.png\"></div><div class=\"info\">text-stroke: 2px lime;</div></div>\n\n</td></tr>\n<tr><th><h3>EOT - Embedded OpenType fonts [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/eot\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=eot&prefix=all\">Single feat</a>]</span></th><td class=\"current fail\">&nbsp;</td><td>\n<div class=\"test_wrap\"><h3>Visual</h3><div id=\"eot0\" class=\"visual\"></div><div class=\"vis_test\"><style>\n@font-face {\n\tfont-family: 'Windsong_eot';\n\tsrc: url('caniuse_files/Windsong-webfont.eot');\n}\n\n#windsong_eot {\n\tfont: 18px Windsong_eot;\n\tmargin: 5px;\n}\n</style>\n<p id=\"windsong_eot\">Windsong font</p>\n</div><div class=\"vis_ref\"><img src=\"./caniuse_files/windsong_font.png\"></div></div>\n\n</td></tr>\n<tr><th><h3>XHTML+SMIL animation [unoff]</h3><span class=\"links\">[<a href=\"http://caniuse.com/xhtmlsmil\">Table</a>] [<a href=\"http://tests.caniuse.com/?feat=xhtmlsmil&prefix=all\">Single feat</a>]</span></th><td class=\"current fail\">&nbsp;</td><td>\n\n</td></tr>\n</tbody></table>\n<p>Most tests by <a href=\"http://a.deveria.com/\">Alexis Deveria</a>, additional contributions by <a href=\"http://paulirish.com/\">Paul Irish</a></p>\n\n<script>\n(function() {\nvar gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n}());\n</script><script src=\"./caniuse_files/ga.js\" type=\"text/javascript\"></script>\n<script>\n(function() {\ntry {\nvar pageTracker = _gat._getTracker(\"UA-16085010-1\");\npageTracker._trackPageview();\n} catch(err) {}\n}());\n</script></body></html>"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/form_validation.html",
    "content": "<!DOCTYPE html>\n<!-- saved from url=(0045)http://tests.caniuse.com/form_validation.html -->\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script>\nif(location.href.indexOf('?') >= 0) {\n\tdocument.write('FAIL');\n}\n</script>\n\n</head><body><form action=\"http://tests.caniuse.com/form_validation.html?\" method=\"post\">\n\n<input type=\"url\" name=\"foo\" required=\"\">\n<input type=\"submit\" value=\"submit me!\">\n\n</form>\n</body></html>"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/ga.js",
    "content": "(function(){var k=void 0,aa=encodeURIComponent,l=String,o=Math,ba=\"push\",ca=\"cookie\",p=\"charAt\",q=\"indexOf\",da=\"getTime\",r=\"toString\",t=\"window\",v=\"length\",w=\"document\",x=\"split\",y=\"location\",ea=\"protocol\",fa=\"href\",z=\"substring\",A=\"join\",C=\"toLowerCase\";var ga=\"_gat\",ha=\"_gaq\",ia=\"4.9.4\",ja=\"_gaUserPrefs\",ka=\"ioo\",D=\"&\",E=\"=\",F=\"__utma=\",H=\"__utmb=\",la=\"__utmc=\",ma=\"__utmk=\",I=\"__utmv=\",J=\"__utmz=\",na=\"__utmx=\",oa=\"GASO=\";var pa=function(){var d=this,f=[],b=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";d.set=function(b){f[b]=!0};d.Sc=function(){for(var d=[],e=0;e<f[v];e++)f[e]&&(d[o.floor(e/6)]^=1<<e%6);for(e=0;e<d[v];e++)d[e]=b[p](d[e]||0);return d[A](\"\")+\"~\"}},qa=new pa;function K(d){qa.set(d)};var ra=function(d,f){var b=this;b.window=d;b.document=f;b.setTimeout=function(b,e){setTimeout(b,e)};b.Jb=function(b){return navigator.userAgent[q](b)>=0};b.Xc=function(){return b.Jb(\"Firefox\")&&![].reduce};b.Vc=function(){return L[t][ja]};b.Gc=function(){return L[t].external};b.Hc=function(){return L[t].performance||L[t].webkitPerformance};b.Ic=function(){return L[t].top==L[t]};b.Ya=function(b){var e=L[t]&&L[t].gaGlobal;if(b&&!e)e={},L[t].gaGlobal=e;return e};b.ec=function(b){L[w][y].href=b};b.qb=\nfunction(d){if(!d||!b.Jb(\"Firefox\"))return d;for(var d=d.replace(/\\n|\\r/g,\" \"),e=0,f=d[v];e<f;++e){var g=d.charCodeAt(e)&255;if(g==10||g==13)d=d[z](0,e)+\"?\"+d[z](e+1)}return d}},L=new ra(window,document);var sa=function(d){return function(f,b,h){d[f]=function(){K(b);return h.apply(d,arguments)};return h}},ta=function(d,f,b,h){d.addEventListener?d.addEventListener(f,b,!!h):d.attachEvent&&d.attachEvent(\"on\"+f,b)},ua=function(d){return Object.prototype[r].call(Object(d))==\"[object Array]\"},M=function(d){return k==d||\"-\"==d||\"\"==d},N=function(d,f,b){var h=\"-\",e;!M(d)&&!M(f)&&!M(b)&&(e=d[q](f),e>-1&&(b=d[q](b,e),b<0&&(b=d[v]),h=d[z](e+f[q](E)+1,b)));return h},xa=function(d){var f=!1,b=0,h,e;if(!M(d)){f=\n!0;for(h=0;h<d[v];h++)e=d[p](h),b+=\".\"==e?1:0,f=f&&b<=1&&(0==h&&\"-\"==e||\".0123456789\"[q](e)>-1)}return f},P=function(d,f){var b=aa;return b instanceof Function?f?encodeURI(d):b(d):(K(68),escape(d))},Q=function(d,f){var b=decodeURIComponent,h,d=d[x](\"+\")[A](\" \");if(b instanceof Function)try{h=f?decodeURI(d):b(d)}catch(e){K(17),h=unescape(d)}else K(68),h=unescape(d);return h},R=function(d,f){return d[q](f)>-1};\nfunction ya(d){if(!d||\"\"==d)return\"\";for(;d[p](0)[v]>0&&\" \\n\\r\\t\"[q](d[p](0))>-1;)d=d[z](1);for(;d[p](d[v]-1)[v]>0&&\" \\n\\r\\t\"[q](d[p](d[v]-1))>-1;)d=d[z](0,d[v]-1);return d}var T=function(d,f){d[ba]||K(94);d[d[v]]=f},za=function(d){var f=1,b=0,h;if(!M(d)){f=0;for(h=d[v]-1;h>=0;h--)b=d.charCodeAt(h),f=(f<<6&268435455)+b+(b<<14),b=f&266338304,f=b!=0?f^b>>21:f}return f},Aa=function(){return o.round(o.random()*2147483647)},Ba=function(){};var Ca=function(d,f){this.ib=d;this.jb=f},Da=function(){function d(b){for(var d=[],b=b[x](\",\"),e,f=0;f<b[v];f++)e=b[f][x](\":\"),d[ba](new Ca(e[0],e[1]));return d}var f=this;f.Ca=\"utm_campaign\";f.Da=\"utm_content\";f.Ea=\"utm_id\";f.Fa=\"utm_medium\";f.Ga=\"utm_nooverride\";f.Ha=\"utm_source\";f.Ia=\"utm_term\";f.Ja=\"gclid\";f.vc=\"dclid\";f.U=0;f.w=0;f.La=15768E6;f.Ma=18E5;f.s=63072E6;f.V=[];f.W=[];f.wc=\"cse\";f.xc=\"q\";f.Ta=50;f.J=d(\"daum:q,eniro:search_word,naver:query,pchome:q,images.google:q,google:q,yahoo:p,yahoo:q,msn:q,bing:q,aol:query,aol:encquery,aol:q,lycos:query,ask:q,altavista:q,netscape:query,cnn:query,about:terms,mamma:q,alltheweb:q,voila:rdata,virgilio:qs,live:q,baidu:wd,alice:qs,yandex:text,najdi:q,mama:query,seznam:q,search:q,wp:szukaj,onet:qt,szukacz:q,yam:k,kvasir:q,sesam:q,ozu:q,terra:query,mynet:q,ekolay:q,rambler:query,rambler:words\");\nf.f=\"/\";f.L=100;f.ga=\"/__utm.gif\";f.la=1;f.ma=1;f.u=\"|\";f.ka=1;f.Ka=1;f.Ua=1;f.b=\"auto\";f.B=1;f.Wb=10;f.zc=10;f.Ac=0.2;f.o=k};var Ea=function(d){function f(a,c,b,j){var i=\"\",d=0,i=N(a,\"2\"+c,\";\");if(!M(i)){a=i[q](\"^\"+b+\".\");if(a<0)return[\"\",0];i=i[z](a+b[v]+2);i[q](\"^\")>0&&(i=i[x](\"^\")[0]);b=i[x](\":\");i=b[1];d=parseInt(b[0],10);!j&&d<e.m&&(i=\"\")}M(i)&&(i=\"\");return[i,d]}function b(a,c){return\"^\"+[[c,a[1]][A](\".\"),a[0]][A](\":\")}function h(a){var c=new Date,a=new Date(c[da]()+a);return\"expires=\"+a.toGMTString()+\"; \"}var e=this,m=d;e.m=(new Date)[da]();var g=[F,H,la,J,I,na,oa];e.g=function(){var a=L[w][ca];return m.o?e.Nc(a,\nm.o):a};e.Nc=function(a,c){for(var b=[],j,i=0;i<g[v];i++)j=f(a,g[i],c)[0],M(j)||(b[b[v]]=g[i]+j+\";\");return b[A](\"\")};e.l=function(a,c,b){var j=b>0?h(b):\"\";m.o&&(c=e.Oc(L[w][ca],a,m.o,c,b),a=\"2\"+a,j=b>0?h(m.s):\"\");a+=c;a=L.qb(a);a[v]>2E3&&(K(69),a=a[z](0,2E3));j=a+\"; path=\"+m.f+\"; \"+j+e.hb();if(!V.pb())L[w].cookie=j};e.Oc=function(a,c,d,j,i){var g=\"\",i=i||m.s,j=b([j,e.m+i*1],d),g=N(a,\"2\"+c,\";\");if(!M(g))return a=b(f(a,c,d,!0),d),g=g[x](a)[A](\"\"),g=j+g;return j};e.hb=function(){return M(m.b)?\"\":\"domain=\"+\nm.b+\";\"}};var Fa=function(d){function f(a){a=ua(a)?a[A](\".\"):\"\";return M(a)?\"-\":a}function b(a,c){var n=[],b;if(!M(a)&&(n=a[x](\".\"),c))for(b=0;b<n[v];b++)xa(n[b])||(n[b]=\"-\");return n}function h(a,c,n){var b=i.I,j,d;for(j=0;j<b[v];j++)d=b[j][0],d+=M(c)?c:c+b[j][4],b[j][2](N(a,d,n))}var e,m,g,a,c,u,j,i=this,s,n=d;i.i=new Ea(d);i.Ba=function(){return k==s||s==i.K()};i.g=function(){return i.i.g()};i.ea=function(){return c?c:\"-\"};i.Pa=function(a){c=a};i.fa=function(a){s=xa(a)?a*1:\"-\"};i.da=function(){return f(u)};\ni.X=function(a){u=b(a)};i.yc=function(){i.i.l(I,\"\",-1)};i.Rb=function(){return s?s:\"-\"};i.hb=function(){return M(n.b)?\"\":\"domain=\"+n.b+\";\"};i.ba=function(){return f(e)};i.Na=function(a){e=b(a,1)};i.z=function(){return f(m)};i.$=function(a){m=b(a,1)};i.ca=function(){return f(g)};i.Oa=function(a){g=b(a,1)};i.qa=function(){return f(a)};i.ra=function(c){a=b(c);for(c=0;c<a[v];c++)c<4&&!xa(a[c])&&(a[c]=\"-\")};i.Fc=function(){return j};i.Dc=function(a){j=a};i.Qb=function(){e=[];m=[];g=[];a=[];c=k;u=[];s=\nk};i.K=function(){for(var a=\"\",c=0;c<i.I[v];c++)a+=i.I[c][1]();return za(a)};i.Z=function(a){var c=i.g(),n=!1;c&&(h(c,a,\";\"),i.fa(l(i.K())),n=!0);return n};i.Sb=function(a){h(a,\"\",D);i.fa(N(a,ma,D))};i.Tb=function(){var a=i.I,c=[],n;for(n=0;n<a[v];n++)T(c,a[n][0]+a[n][1]());T(c,ma+i.K());return c[A](D)};i.Ub=function(a,c){var b=i.I,j=n.f;i.Z(a);n.f=c;for(var d=0;d<b[v];d++)if(!M(b[d][1]()))b[d][3]();n.f=j};i.Qa=function(){i.i.l(F,i.ba(),n.s)};i.aa=function(){i.i.l(H,i.z(),n.Ma)};i.Ra=function(){i.i.l(la,\ni.ca(),0)};i.sa=function(){i.i.l(J,i.qa(),n.La)};i.Sa=function(){i.i.l(na,i.ea(),n.s)};i.Y=function(){i.i.l(I,i.da(),n.s)};i.Ec=function(){i.i.l(oa,i.Fc(),0)};i.I=[[F,i.ba,i.Na,i.Qa,\".\"],[H,i.z,i.$,i.aa,\"\"],[la,i.ca,i.Oa,i.Ra,\"\"],[na,i.ea,i.Pa,i.Sa,\"\"],[J,i.qa,i.ra,i.sa,\".\"],[I,i.da,i.X,i.Y,\".\"]]};var Ga=\"https:\"==L[w][y][ea]?\"https://ssl.google-analytics.com/\":\"http://www.google-analytics.com/\",Ha=Ga+\"p/__utm.gif\",Ja=function(){var d=this;d.Bb=function(f,b,h,e,m){b[v]<=2036||m?d.Aa(f+\"?\"+b,e):b[v]<=8192?L.Xc()?d.Aa(f+\"?\"+h+\"&err=ff2post&len=\"+b[v],e):d.fd(b,e):d.Aa(f+\"?\"+h+\"&err=len&max=8192&len=\"+b[v],e)};d.Aa=function(d,b){var h=new Image(1,1);h.src=d;h.onload=function(){h.onload=null;(b||Ba)()}};d.fd=function(f,b){d.ed(f,b)||d.Ob(f,b)};d.ed=function(d,b){var h,e=L[t].XDomainRequest;if(e)h=\nnew e,h.open(\"POST\",Ha);else if(e=L[t].XMLHttpRequest)e=new e,\"withCredentials\"in e&&(h=e,h.open(\"POST\",Ha,!0),h.setRequestHeader(\"Content-Type\",\"text/plain\"));if(h)return h.onreadystatechange=function(){h.readyState==4&&(b&&b(),h=null)},h.send(d),!0;return!1};d.Ob=function(f,b){var h=L[w];if(h.body){f=aa(f);try{var e=h.createElement('<iframe name=\"'+f+'\"></iframe>')}catch(m){e=h.createElement(\"iframe\"),e.name=f}e.height=\"0\";e.width=\"0\";e.style.display=\"none\";e.style.visibility=\"hidden\";var g=h[y],\ng=g[ea]+\"//\"+g.host+\"/favicon.ico\",g=Ga+\"u/post_iframe.html#\"+aa(g),a=function(){e.src=\"\";e.parentNode&&e.parentNode.removeChild(e)};ta(L[t],\"beforeunload\",a);var c=!1,u=0,j=function(){if(!c){try{if(u>9||e.contentWindow[y].host==h[y].host){c=!0;a();var d=L[t],g=\"beforeunload\",n=a;d.removeEventListener?d.removeEventListener(g,n,!1):d.detachEvent&&d.detachEvent(\"on\"+g,n);b&&b();return}}catch(f){}u++;L.setTimeout(j,200)}};ta(e,\"load\",j);h.body.appendChild(e);e.src=g}else L.setTimeout(function(){d.Ob(f,\nb)},100)}};var Ka=function(d){var f=this,b=d,h=new Fa(b),e=null,m=!V.pb(),g=function(){};f.Uc=function(){return\"https:\"==L[w][y][ea]?\"https://ssl.google-analytics.com/__utm.gif\":\"http://www.google-analytics.com/__utm.gif\"};f.A=function(a,c,d,j,i,s){e||(e=new Ja);var n=b.B,O=L[w][y];h.Z(d);var B=h.z()[x](\".\");if(B[1]<500||j){if(i){var S=(new Date)[da](),X;X=(S-B[3])*(b.Ac/1E3);X>=1&&(B[2]=o.min(o.floor(B[2]*1+X),b.zc),B[3]=S)}if(j||!i||B[2]>=1){!j&&i&&(B[2]=B[2]*1-1);j=B[1]*1+1;B[1]=j;i=\"utmwv=\"+ia;S=\"&utms=\"+\nj;X=\"&utmn=\"+Aa();j=i+\"e\"+S+X;a=i+S+X+(M(O.hostname)?\"\":\"&utmhn=\"+P(O.hostname))+(b.L==100?\"\":\"&utmsp=\"+P(b.L))+a;if(0==n||2==n)O=2==n?g:s||g,m&&e.Bb(b.ga,a,j,O,!0);if(1==n||2==n)c=\"&utmac=\"+c,j+=c,a+=c+\"&utmcc=\"+f.Tc(d),V.Ab&&(d=\"&aip=1\",j+=d,a+=d),a+=\"&utmu=\"+qa.Sc(),m&&e.Bb(f.Uc(),a,j,s)}}h.$(B[A](\".\"));h.aa()};f.Tc=function(a){for(var c=[],b=[F,J,I,na],d=h.g(),i,g=0;g<b[v];g++)if(i=N(d,b[g]+a,\";\"),!M(i)){if(b[g]==I){i=i[x](a+\".\")[1][x](\"|\")[0];if(M(i))continue;i=a+\".\"+i}T(c,b[g]+i+\";\")}return P(c[A](\"+\"))}};var W=function(){var d=this;d.N=[];d.Va=function(f){for(var b,h=d.N,e=0;e<h[v];e++)b=f==h[e].q?h[e]:b;return b};d.Xb=function(f,b,h,e,m,g,a,c){var u=d.Va(f);k==u?(u=new W.Wc(f,b,h,e,m,g,a,c),T(d.N,u)):(u.tb=b,u.zb=h,u.yb=e,u.wb=m,u.ub=g,u.xb=a,u.vb=c);return u}};W.Qc=function(d,f,b,h,e,m){var g=this;g.Fb=d;g.va=f;g.n=b;g.Cb=h;g.Db=e;g.Eb=m;g.ha=function(){return\"&\"+[\"utmt=item\",\"tid=\"+P(g.Fb),\"ipc=\"+P(g.va),\"ipn=\"+P(g.n),\"iva=\"+P(g.Cb),\"ipr=\"+P(g.Db),\"iqt=\"+P(g.Eb)][A](\"&utm\")}};\nW.Wc=function(d,f,b,h,e,m,g,a){var c=this;c.q=d;c.tb=f;c.zb=b;c.yb=h;c.wb=e;c.ub=m;c.xb=g;c.vb=a;c.M=[];c.Vb=function(a,b,d,g,n){var e=c.Rc(a),f=c.q;k==e?T(c.M,new W.Qc(f,a,b,d,g,n)):(e.Fb=f,e.va=a,e.n=b,e.Cb=d,e.Db=g,e.Eb=n)};c.Rc=function(a){for(var b,d=c.M,g=0;g<d[v];g++)b=a==d[g].va?d[g]:b;return b};c.ha=function(){return\"&\"+[\"utmt=tran\",\"id=\"+P(c.q),\"st=\"+P(c.tb),\"to=\"+P(c.zb),\"tx=\"+P(c.yb),\"sp=\"+P(c.wb),\"ci=\"+P(c.ub),\"rg=\"+P(c.xb),\"co=\"+P(c.vb)][A](\"&utmt\")}};var La=function(d){function f(){var b,a,c;a=\"ShockwaveFlash\";var d=\"$version\",j=L[t].navigator;if((j=j?j.plugins:k)&&j[v]>0)for(b=0;b<j[v]&&!c;b++)a=j[b],R(a.name,\"Shockwave Flash\")&&(c=a.description[x](\"Shockwave Flash \")[1]);else{a=a+\".\"+a;try{b=new ActiveXObject(a+\".7\"),c=b.GetVariable(d)}catch(e){}if(!c)try{b=new ActiveXObject(a+\".6\"),c=\"WIN 6,0,21,0\",b.we=\"always\",c=b.GetVariable(d)}catch(f){}if(!c)try{b=new ActiveXObject(a),c=b.GetVariable(d)}catch(n){}c&&(c=c[x](\" \")[1][x](\",\"),c=c[0]+\".\"+\nc[1]+\" r\"+c[2])}return c?c:h}var b=this,h=\"-\",e=L[t].screen,m=L[t].navigator;b.Nb=e?e.width+\"x\"+e.height:h;b.Mb=e?e.colorDepth+\"-bit\":h;b.cd=P(L[w].characterSet?L[w].characterSet:L[w].charset?L[w].charset:h);b.Lb=(m&&m.language?m.language:m&&m.browserLanguage?m.browserLanguage:h)[C]();b.Kb=m&&m.javaEnabled()?1:0;b.dd=d?f():h;b.dc=function(){return D+\"utm\"+[\"cs=\"+P(b.cd),\"sr=\"+b.Nb,\"sc=\"+b.Mb,\"ul=\"+b.Lb,\"je=\"+b.Kb,\"fl=\"+P(b.dd)][A](\"&utm\")};b.cc=function(){for(var d=L[t].navigator,a=L[t].history[v],\nd=d.appName+d.version+b.Lb+d.platform+d.userAgent+b.Kb+b.Nb+b.Mb+(L[w][ca]?L[w][ca]:\"\")+(L[w].referrer?L[w].referrer:\"\"),c=d[v];a>0;)d+=a--^c++;return za(d)}};var Z=function(d,f,b,h){function e(a){var c=\"\",c=a[x](\"://\")[1][C]();R(c,\"/\")&&(c=c[x](\"/\")[0]);return c}var m=h,g=this;g.a=d;g.ob=f;g.m=b;g.mb=function(a){var c=g.ua();return new Z.v(N(a,m.Ea+E,D),N(a,m.Ha+E,D),N(a,m.Ja+E,D),g.R(a,m.Ca,\"(not set)\"),g.R(a,m.Fa,\"(not set)\"),g.R(a,m.Ia,c&&!M(c.G)?Q(c.G):k),g.R(a,m.Da,k),N(a,m.vc+E,D))};g.nb=function(a){var c=e(a),b;b=a;var d=\"\";b=b[x](\"://\")[1][C]();R(b,\"/\")&&(b=b[x](\"/\")[1],R(b,\"?\")&&(d=b[x](\"?\")[0]));b=d;if(R(c,\"google\")&&(a=a[x](\"?\")[A](D),R(a,D+\nm.xc+E)&&b==m.wc))return!0;return!1};g.ua=function(){var a,c=g.ob,b,d=m.J;if(!M(c)&&\"0\"!=c&&R(c,\"://\")&&!g.nb(c)){a=e(c);for(var i=0;i<d[v];i++)if(b=d[i],R(a,b.ib[C]())&&(c=c[x](\"?\")[A](D),R(c,D+b.jb+E)))return a=c[x](D+b.jb+E)[1],R(a,D)&&(a=a[x](D)[0]),new Z.v(k,b.ib,k,\"(organic)\",\"organic\",a,k,k)}};g.R=function(a,c,b){a=N(a,c+E,D);return b=!M(a)?Q(a):!M(b)?b:\"-\"};g.Bc=function(a){var c=m.V,b=!1;if(a&&\"organic\"==a.P)for(var a=Q(a.G)[C](),d=0;d<c[v];d++)b=b||c[d][C]()==a;return b};g.lb=function(){var a=\n\"\",c=\"\",a=g.ob;if(!M(a)&&\"0\"!=a&&R(a,\"://\")&&!g.nb(a))return a=a[x](\"://\")[1],R(a,\"/\")&&(c=a[z](a[q](\"/\")),c=c[x](\"?\")[0],a=a[x](\"/\")[0][C]()),0==a[q](\"www.\")&&(a=a[z](4)),new Z.v(k,a,k,\"(referral)\",\"referral\",k,c,k)};g.kb=function(a){var c=\"\";m.U&&(c=a&&a.hash?a[fa][z](a[fa][q](\"#\")):\"\",c=\"\"!=c?c+D:c);c+=a.search;return c};g.ta=function(){return new Z.v(k,\"(direct)\",k,\"(direct)\",\"(none)\",k,k,k)};g.Cc=function(a){var c=!1,b=m.W;if(a&&\"referral\"==a.P)for(var a=P(a.Q)[C](),d=0;d<b[v];d++)c=c||R(a,b[d][C]());\nreturn c};g.h=function(a){return k!=a&&a.fb()};g.te=function(a){var a=N(a,J+g.a+\".\",\";\"),c=a[x](\".\"),a=new Z.v;a.gb(c.slice(4)[A](\".\"));if(!g.h(a))return!0;c=L[w][y];c=g.kb(c);c=g.mb(c);g.h(c)||(c=g.ua(),g.h(c)||(c=g.lb()));return g.h(c)&&a.H()[C]()!=c.H()[C]()};g.Pb=function(a,c){if(m.Ka){var b=\"\",d=\"-\",e,f=0,n,h,B=g.a;if(a){h=a.g();b=g.kb(L[w][y]);if(m.w&&a.Ba()&&(d=Q(a.qa()),!M(d)&&!R(d,\";\"))){a.ra(d);a.sa();return}d=N(h,J+B+\".\",\";\");e=g.mb(b);if(g.h(e)&&(b=N(b,m.Ga+E,D),\"1\"==b&&!M(d)))return;\nif(!g.h(e)){e=g.ua();b=g.Bc(e);if(!M(d)&&b)return;b&&(e=g.ta())}if(!g.h(e)&&c){e=g.lb();b=g.Cc(e);if(!M(d)&&b)return;b&&(e=g.ta())}g.h(e)||M(d)&&c&&(e=g.ta());if(g.h(e)&&(M(d)||(f=d[x](\".\"),n=new Z.v,n.gb(f.slice(4)[A](\".\")),n=n.H()[C]()==e.H()[C](),f=f[3]*1),!n||c))h=N(h,F+B+\".\",\";\"),n=h.lastIndexOf(\".\"),h=n>9?h[z](n+1)*1:0,f++,h=0==h?1:h,a.ra([B,g.m,h,f,e.H()][A](\".\")),a.sa()}}}};\nZ.v=function(d,f,b,h,e,m,g,a){var c=this;c.q=d;c.Q=f;c.ya=b;c.n=h;c.P=e;c.G=m;c.Gb=g;c.xa=a;c.H=function(){var a=[],b=[[\"cid\",c.q],[\"csr\",c.Q],[\"gclid\",c.ya],[\"ccn\",c.n],[\"cmd\",c.P],[\"ctr\",c.G],[\"cct\",c.Gb],[\"dclid\",c.xa]],d,e;if(c.fb())for(d=0;d<b[v];d++)M(b[d][1])||(e=b[d][1][x](\"+\")[A](\"%20\"),e=e[x](\" \")[A](\"%20\"),T(a,\"utm\"+b[d][0]+E+e));return L.qb(a[A](\"|\"))};c.fb=function(){return!(M(c.q)&&M(c.Q)&&M(c.ya)&&M(c.xa))};c.gb=function(a){var b=function(b){return Q(N(a,\"utm\"+b+E,\"|\"))};c.q=b(\"cid\");\nc.Q=b(\"csr\");c.ya=b(\"gclid\");c.n=b(\"ccn\");c.P=b(\"cmd\");c.G=b(\"ctr\");c.Gb=b(\"cct\");c.xa=b(\"dclid\")}};var Ma=function(d,f,b,h){var e=this,m=f,g=E,a=d,c=h;e.S=b;e.wa=\"\";e.r={};e.$b=function(){var a;a=N(e.S.g(),I+m+\".\",\";\")[x](m+\".\")[1];if(!M(a)){a=a[x](\"|\");var b=e.r,c=a[1],d;if(!M(c))for(var c=c[x](\",\"),n=0;n<c[v];n++)d=c[n],M(d)||(d=d[x](g),d[v]==4&&(b[d[0]]=[Q(d[1]),Q(d[2]),1]));e.wa=Q(a[0]);e.T()}};e.T=function(){e.Pc();var a=P(e.wa),b,c,d=\"\";for(b in e.r)(c=e.r[b])&&1===c[2]&&(d+=b+g+P(c[0])+g+P(c[1])+g+1+\",\");M(d)||(a+=\"|\"+d);M(a)?e.S.yc():(e.S.X(m+\".\"+a),e.S.Y())};e.bc=function(a){e.wa=a;e.T()};\ne.ac=function(b,c,d,g){1!=g&&2!=g&&3!=g&&(g=3);var n=!1;if(c&&d&&b>0&&b<=a.Ta){var f=P(c),h=P(d);f[v]+h[v]<=64&&(e.r[b]=[c,d,g],e.T(),n=!0)}return n};e.Zb=function(a){if((a=e.r[a])&&1===a[2])return a[1]};e.Yb=function(a){var b=e.r;b[a]&&(delete b[a],e.T())};e.Pc=function(){c.t(8);c.t(9);c.t(11);var a=e.r,b,d;for(d in a)if(b=a[d])c.j(8,d,b[0]),c.j(9,d,b[1]),(b=b[2])&&3!=b&&c.j(11,d,\"\"+b)}};var Na=function(){function d(a,b,c,d){k==g[a]&&(g[a]={});k==g[a][b]&&(g[a][b]=[]);g[a][b][c]=d}function f(a,b,c){if(k!=g[a]&&k!=g[a][b])return g[a][b][c]}function b(a,b){if(k!=g[a]&&k!=g[a][b]){g[a][b]=k;var c=!0,d;for(d=0;d<u[v];d++)if(k!=g[a][u[d]]){c=!1;break}c&&(g[a]=k)}}function h(a){var b=\"\",c=!1,d,e;for(d=0;d<u[v];d++)if(e=a[u[d]],k!=e){c&&(b+=u[d]);for(var c=[],g=k,f=k,f=0;f<e[v];f++)if(k!=e[f]){g=\"\";f!=S&&k==e[f-1]&&(g+=f[r]()+n);var h;h=e[f];for(var O=\"\",m=k,U=k,wa=k,m=0;m<h[v];m++)U=h[p](m),\nwa=B[U],O+=k!=wa?wa:U;h=O;g+=h;T(c,g)}e=j+c[A](s)+i;b+=e;c=!1}else c=!0;return b}var e=this,m=sa(e),g={},a=\"k\",c=\"v\",u=[a,c],j=\"(\",i=\")\",s=\"*\",n=\"!\",O=\"'\",B={};B[O]=\"'0\";B[i]=\"'1\";B[s]=\"'2\";B[n]=\"'3\";var S=1;e.Yc=function(a){return k!=g[a]};e.C=function(){var a=\"\",b;for(b in g)k!=g[b]&&(a+=b[r]()+h(g[b]));return a};e.hc=function(a){if(a==k)return e.C();var b=a.C(),c;for(c in g)k!=g[c]&&!a.Yc(c)&&(b+=c[r]()+h(g[c]));return b};e.j=m(\"_setKey\",89,function(b,c,n){if(typeof n!=\"string\")return!1;d(b,a,\nc,n);return!0});e.ja=m(\"_setValue\",90,function(a,b,n){if(typeof n!=\"number\"&&(k==Number||!(n instanceof Number))||o.round(n)!=n||n==NaN||n==Infinity)return!1;d(a,c,b,n[r]());return!0});e.fc=m(\"_getKey\",87,function(b,c){return f(b,a,c)});e.gc=m(\"_getValue\",88,function(a,b){return f(a,c,b)});e.t=m(\"_clearKey\",85,function(c){b(c,a)});e.ia=m(\"_clearValue\",86,function(a){b(a,c)})};var Oa=function(d,f){var b=this,h=sa(b);b.ze=f;b.gd=d;b.Za=h(\"_trackEvent\",91,function(d,h,g){return f.Za(b.gd,d,h,g)})};var Pa=function(d,f){var b=this,h=L.Gc(),e=L.Hc(),m=10;b.rb=new Na;b.Kc=function(){var b,a=\"timing\",c=\"onloadT\";h&&h[c]!=k&&h.isValidLoadTime?b=h[c]:e&&e[a]&&(b=e[a].loadEventStart-e[a].fetchStart);return b};b.Mc=function(){return d.D()&&d.Xa()%100<m};b.Lc=function(){var e=\"&utmt=event&utme=\"+P(b.rb.C())+d.na();f.A(e,d.p,d.a,!1,!0)};b.Jc=function(b){b=o.min(o.floor(b/100),5E3);return b>0?b+\"00\":\"0\"};b.sb=function(){var d=b.Kc();if(d==k||isNaN(d))return!1;if(d<=0)return!0;if(d>2147483648)return!1;\nvar a=b.rb;a.t(14);a.ia(14);var c=b.Jc(d);a.j(14,1,c)&&a.ja(14,1,d)&&b.Lc();h&&h.isValidLoadTime!=k&&h.setPageReadyTime();return!1};b.Wa=function(){if(!b.Mc())return!1;if(!L.Ic())return!1;b.sb()&&ta(L[t],\"load\",b.sb,!1);return!0}};var $=function(){};$.Zc=function(d){var f=\"gaso=\",b=L[w][y].hash;d=b&&1==b[q](f)?N(b,f,D):(b=L[t].name)&&0<=b[q](f)?N(b,f,D):N(d.g(),oa,\";\");return d};$.ad=function(d,f){var b=(f||\"www\")+\".google.com\",b=\"https://\"+b+\"/analytics/reporting/overlay_js?gaso=\"+d+D+Aa(),h=\"_gasojs\",e=L[w].createElement(\"script\");e.type=\"text/javascript\";e.src=b;if(h)e.id=h;(L[w].getElementsByTagName(\"head\")[0]||L[w].getElementsByTagName(\"body\")[0]).appendChild(e)};\n$.load=function(d,f){if(!$.$c){var b=$.Zc(f),h=b&&b.match(/^(?:\\|([-0-9a-z.]{1,30})\\|)?([-.\\w]{10,1200})$/i);if(h)f.Dc(b),f.Ec(),V._gasoDomain=d.b,V._gasoCPath=d.f,$.ad(h[2],h[1]);$.$c=!0}};var Qa=function(d,f,b){function h(){if(\"auto\"==j.b){var a=L[w].domain;\"www.\"==a[z](0,4)&&(a=a[z](4));j.b=a}j.b=j.b[C]()}function e(){h();var a=j.b,b=a[q](\"www.google.\")*a[q](\".google.\")*a[q](\"google.\");return b||\"/\"!=j.f||a[q](\"google.org\")>-1}function m(b,c,d){if(M(b)||M(c)||M(d))return\"-\";b=N(b,F+a.a+\".\",c);M(b)||(b=b[x](\".\"),b[5]=\"\"+(b[5]?b[5]*1+1:1),b[3]=b[4],b[4]=d,b=b[A](\".\"));return b}function g(){return\"file:\"!=L[w][y][ea]&&e()}var a=this,c=sa(a),u=k,j=new Da,i=!1,s=k;a.n=d;a.m=o.round((new Date)[da]()/\n1E3);a.p=f||\"UA-XXXXX-X\";a.ab=L[w].referrer;a.oa=k;a.d=k;a.F=!1;a.O=k;a.e=k;a.bb=k;a.pa=k;a.a=k;a.k=k;j.o=b?P(b):k;a.eb=!1;a.mc=function(){return Aa()^a.O.cc()&2147483647};a.lc=function(){if(!j.b||\"\"==j.b||\"none\"==j.b)return j.b=\"\",1;h();return j.Ua?za(j.b):1};a.kc=function(a,b){if(M(a))a=\"-\";else{b+=j.f&&\"/\"!=j.f?j.f:\"\";var c=a[q](b),a=c>=0&&c<=8?\"0\":\"[\"==a[p](0)&&\"]\"==a[p](a[v]-1)?\"-\":a}return a};a.na=function(b){var c=\"\";c+=j.ka?a.O.dc():\"\";c+=j.la&&!M(L[w].title)?\"&utmdt=\"+P(L[w].title):\"\";var d;\nd=L.Ya(!0);if(!d.hid)d.hid=Aa();d=d.hid;c+=\"&utmhid=\"+d+\"&utmr=\"+P(l(a.oa))+\"&utmp=\"+P(a.pc(b));return c};a.pc=function(a){var b=L[w][y];a&&K(13);return a=k!=a&&\"\"!=a?P(a,!0):P(b.pathname+b.search,!0)};a.uc=function(b){if(a.D()){var c=\"\";a.e!=k&&a.e.C()[v]>0&&(c+=\"&utme=\"+P(a.e.C()));c+=a.na(b);u.A(c,a.p,a.a)}};a.jc=function(){var b=new Fa(j);return b.Z(a.a)?b.Tb():k};a.cb=c(\"_getLinkerUrl\",52,function(b,c){var d=b[x](\"#\"),e=b,f=a.jc();if(f)if(c&&1>=d[v])e+=\"#\"+f;else if(!c||1>=d[v])1>=d[v]?e+=(R(b,\n\"?\")?D:\"?\")+f:e=d[0]+(R(b,\"?\")?D:\"?\")+f+\"#\"+d[1];return e});a.nc=function(){var b=a.m,c=a.k,d=c.g(),e=a.a+\"\",f=L.Ya(),g,h=R(d,F+e+\".\"),i=R(d,H+e),u=R(d,la+e),s,G=[],Y=\"\",Ia=!1,d=M(d)?\"\":d;if(j.w&&!a.eb){g=L[w][y]&&L[w][y].hash?L[w][y][fa][z](L[w][y][fa][q](\"#\")):\"\";j.U&&!M(g)&&(Y=g+D);Y+=L[w][y].search;if(!M(Y)&&R(Y,F))c.Sb(Y),c.Ba()||c.Qb(),s=c.ba(),a.eb=!0;g=c.ea;var va=c.Pa,U=c.Sa;M(g())||(va(Q(g())),R(g(),\";\")||U());g=c.da;va=c.X;U=c.Y;M(g())||(va(g()),R(g(),\";\")||U())}M(s)?h?(s=!i||!u)?(s=m(d,\n\";\",l(b)),a.F=!0):(s=N(d,F+e+\".\",\";\"),G=N(d,H+e,\";\")[x](\".\")):(s=[e,a.mc(),b,b,b,1][A](\".\"),Ia=a.F=!0):M(c.z())||M(c.ca())?(s=m(Y,D,l(b)),a.F=!0):(G=c.z()[x](\".\"),e=G[0]);s=s[x](\".\");L[t]&&f&&f.dh==e&&!j.o&&(s[4]=f.sid?f.sid:s[4],Ia&&(s[3]=f.sid?f.sid:s[4],f.vid&&(b=f.vid[x](\".\"),s[1]=b[0],s[2]=b[1])));c.Na(s[A](\".\"));G[0]=e;G[1]=G[1]?G[1]:0;G[2]=k!=G[2]?G[2]:j.Wb;G[3]=G[3]?G[3]:s[4];c.$(G[A](\".\"));c.Oa(e);M(c.Rb())||c.fa(c.K());c.Qa();c.aa();c.Ra()};a.oc=function(){u=new Ka(j)};a.getName=c(\"_getName\",\n58,function(){return a.n});a.c=c(\"_initData\",2,function(){var b;if(!i){if(!a.O)a.O=new La(j.ma);a.a=a.lc();a.k=new Fa(j);a.e=new Na;s=new Ma(j,l(a.a),a.k,a.e);a.oc()}if(g()){if(!i)a.oa=a.kc(a.ab,L[w].domain),b=new Z(l(a.a),a.oa,a.m,j);a.nc(b);s.$b()}if(!i)g()&&b.Pb(a.k,a.F),a.bb=new Na,$.load(j,a.k),i=!0});a.Xa=c(\"_visitCode\",54,function(){a.c();var b=N(a.k.g(),F+a.a+\".\",\";\"),b=b[x](\".\");return b[v]<4?\"\":b[1]});a.qd=c(\"_cookiePathCopy\",30,function(b){a.c();a.k&&a.k.Ub(a.a,b)});a.D=function(){return a.Xa()%\n1E4<j.L*100};a.re=c(\"_trackPageview\",1,function(b){if(g())a.c(),a.uc(b),a.F=!1});a.se=c(\"_trackTrans\",18,function(){var b=a.a,c=[],d,e,f;a.c();if(a.d&&a.D()){for(d=0;d<a.d.N[v];d++){e=a.d.N[d];T(c,e.ha());for(f=0;f<e.M[v];f++)T(c,e.M[f].ha())}for(d=0;d<c[v];d++)u.A(c[d],a.p,b,!0)}});a.me=c(\"_setTrans\",20,function(){var b,c,d,e;b=L[w].getElementById?L[w].getElementById(\"utmtrans\"):L[w].utmform&&L[w].utmform.utmtrans?L[w].utmform.utmtrans:k;a.c();if(b&&b.value){a.d=new W;e=b.value[x](\"UTM:\");j.u=!j.u||\n\"\"==j.u?\"|\":j.u;for(b=0;b<e[v];b++){e[b]=ya(e[b]);c=e[b][x](j.u);for(d=0;d<c[v];d++)c[d]=ya(c[d]);\"T\"==c[0]?a.$a(c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8]):\"I\"==c[0]&&a.ic(c[1],c[2],c[3],c[4],c[5],c[6])}}});a.$a=c(\"_addTrans\",21,function(b,c,d,e,f,g,h,i){a.d=a.d?a.d:new W;return a.d.Xb(b,c,d,e,f,g,h,i)});a.ic=c(\"_addItem\",19,function(b,c,d,e,f,g){var h;a.d=a.d?a.d:new W;(h=a.d.Va(b))||(h=a.$a(b,\"\",\"\",\"\",\"\",\"\",\"\",\"\"));h.Vb(c,d,e,f,g)});a.oe=c(\"_setVar\",22,function(b){b&&\"\"!=b&&e()&&(a.c(),s.bc(b),a.D()&&\nu.A(\"&utmt=var\",a.p,a.a))});a.Yd=c(\"_setCustomVar\",10,function(b,c,d,e){a.c();return s.ac(b,c,d,e)});a.td=c(\"_deleteCustomVar\",35,function(b){a.c();s.Yb(b)});a.Cd=c(\"_getVisitorCustomVar\",50,function(b){a.c();return s.Zb(b)});a.fe=c(\"_setMaxCustomVariables\",71,function(a){j.Ta=a});a.link=c(\"_link\",101,function(b,c){j.w&&b&&(a.c(),L.ec(a.cb(b,c)))});a.Fd=c(\"_linkByPost\",102,function(b,c){if(j.w&&b&&b.action)a.c(),b.action=a.cb(b.action,c)});a.pe=c(\"_setXKey\",83,function(b,c,d){a.e.j(b,c,d)});a.qe=\nc(\"_setXValue\",84,function(b,c,d){a.e.ja(b,c,d)});a.Dd=c(\"_getXKey\",76,function(b,c){return a.e.fc(b,c)});a.Ed=c(\"_getXValue\",77,function(b,c){return a.e.gc(b,c)});a.od=c(\"_clearXKey\",72,function(b){a.e.t(b)});a.pd=c(\"_clearXValue\",73,function(b){a.e.ia(b)});a.sd=c(\"_createXObj\",75,function(){a.c();return new Na});a.qc=c(\"_sendXEvent\",78,function(b){var c=\"\";a.c();a.D()&&(c+=\"&utmt=event&utme=\"+P(a.e.hc(b))+a.na(),u.A(c,a.p,a.a,!1,!0))});a.rd=c(\"_createEventTracker\",74,function(b){a.c();return new Oa(b,\na)});a.Za=c(\"_trackEvent\",4,function(b,c,d,e){a.c();var f=a.bb;k!=b&&k!=c&&\"\"!=b&&\"\"!=c?(f.t(5),f.ia(5),(b=f.j(5,1,b)&&f.j(5,2,c)&&(k==d||f.j(5,3,d))&&(k==e||f.ja(5,1,e)))&&a.qc(f)):b=!1;return b});a.Wa=c(\"_trackPageLoadTime\",100,function(){a.c();if(!a.pa)a.pa=new Pa(a,u);return a.pa.Wa()});a.wd=function(){return j};a.ae=c(\"_setDomainName\",6,function(a){j.b=a});a.kd=c(\"_addOrganic\",14,function(a,b,c){j.J.splice(c?0:j.J[v],0,new Ca(a,b))});a.nd=c(\"_clearOrganic\",70,function(){j.J=[]});a.hd=c(\"_addIgnoredOrganic\",\n15,function(a){T(j.V,a)});a.ld=c(\"_clearIgnoredOrganic\",97,function(){j.V=[]});a.jd=c(\"_addIgnoredRef\",31,function(a){T(j.W,a)});a.md=c(\"_clearIgnoredRef\",32,function(){j.W=[]});a.Id=c(\"_setAllowHash\",8,function(a){j.Ua=a?1:0});a.Td=c(\"_setCampaignTrack\",36,function(a){j.Ka=a?1:0});a.Ud=c(\"_setClientInfo\",66,function(a){j.ka=a?1:0});a.vd=c(\"_getClientInfo\",53,function(){return j.ka});a.Vd=c(\"_setCookiePath\",9,function(a){j.f=a});a.ne=c(\"_setTransactionDelim\",82,function(a){j.u=a});a.Xd=c(\"_setCookieTimeout\",\n25,function(b){a.rc(b*1E3)});a.rc=c(\"_setCampaignCookieTimeout\",29,function(a){j.La=a});a.Zd=c(\"_setDetectFlash\",61,function(a){j.ma=a?1:0});a.xd=c(\"_getDetectFlash\",65,function(){return j.ma});a.$d=c(\"_setDetectTitle\",62,function(a){j.la=a?1:0});a.yd=c(\"_getDetectTitle\",56,function(){return j.la});a.ce=c(\"_setLocalGifPath\",46,function(a){j.ga=a});a.zd=c(\"_getLocalGifPath\",57,function(){return j.ga});a.ee=c(\"_setLocalServerMode\",92,function(){j.B=0});a.ie=c(\"_setRemoteServerMode\",63,function(){j.B=\n1});a.de=c(\"_setLocalRemoteServerMode\",47,function(){j.B=2});a.Ad=c(\"_getServiceMode\",59,function(){return j.B});a.je=c(\"_setSampleRate\",45,function(a){j.L=a});a.ke=c(\"_setSessionTimeout\",27,function(b){a.sc(b*1E3)});a.sc=c(\"_setSessionCookieTimeout\",26,function(a){j.Ma=a});a.Jd=c(\"_setAllowLinker\",11,function(a){j.w=a?1:0});a.Hd=c(\"_setAllowAnchor\",7,function(a){j.U=a?1:0});a.Qd=c(\"_setCampNameKey\",41,function(a){j.Ca=a});a.Md=c(\"_setCampContentKey\",38,function(a){j.Da=a});a.Nd=c(\"_setCampIdKey\",\n39,function(a){j.Ea=a});a.Od=c(\"_setCampMediumKey\",40,function(a){j.Fa=a});a.Pd=c(\"_setCampNOKey\",42,function(a){j.Ga=a});a.Rd=c(\"_setCampSourceKey\",43,function(a){j.Ha=a});a.Sd=c(\"_setCampTermKey\",44,function(a){j.Ia=a});a.Ld=c(\"_setCampCIdKey\",37,function(a){j.Ja=a});a.ud=c(\"_getAccount\",64,function(){return a.p});a.Gd=c(\"_setAccount\",3,function(b){a.p=b});a.ge=c(\"_setNamespace\",48,function(a){j.o=a?P(a):k});a.Bd=c(\"_getVersion\",60,function(){return ia});a.Kd=c(\"_setAutoTrackOutbound\",79,Ba);a.le=\nc(\"_setTrackOutboundSubdomains\",81,Ba);a.be=c(\"_setHrefExamineLimit\",80,Ba);a.he=c(\"_setReferrerOverride\",49,function(b){a.ab=b});a.Wd=c(\"_setCookiePersistence\",24,function(b){a.tc(b)});a.tc=c(\"_setVisitorCookieTimeout\",28,function(a){j.s=a})};var Ra=function(){var d=this,f=sa(d);d.Ab=!1;d.Ib={};d.bd=0;d._gasoDomain=k;d._gasoCPath=k;d.ve=f(\"_getTracker\",0,function(b,f){return d.za(b,k,f)});d.za=f(\"_createTracker\",55,function(b,d,e){d&&K(23);e&&K(67);d==k&&(d=\"~\"+V.bd++);return V.Ib[d]=new Qa(d,b,e)});d.Hb=f(\"_getTrackerByName\",51,function(b){b=b||\"\";return V.Ib[b]||V.za(k,b)});d.pb=function(){var b=L.Vc();return b&&b[ka]&&b[ka]()};d.ue=f(\"_anonymizeIp\",16,function(){d.Ab=!0})};var Ta=function(){var d=this,f=sa(d);d.xe=f(\"_createAsyncTracker\",33,function(b,d){return V.za(b,d||\"\")});d.ye=f(\"_getAsyncTracker\",34,function(b){return V.Hb(b)});d.push=function(){K(5);for(var b=arguments,d=0,e=0;e<b[v];e++)try{if(typeof b[e]===\"function\")b[e]();else{var f=\"\",g=b[e][0],a=g.lastIndexOf(\".\");a>0&&(f=g[z](0,a),g=g[z](a+1));var c=f==ga?V:f==ha?Sa:V.Hb(f);c[g].apply(c,b[e].slice(1))}}catch(u){d++}return d}};var V=new Ra;var Ua=L[t][ga];Ua&&typeof Ua._getTracker==\"function\"?V=Ua:L[t][ga]=V;var Sa=new Ta;a:{var Va=L[t][ha],Wa=!1;if(Va&&typeof Va[ba]==\"function\"&&(Wa=ua(Va),!Wa))break a;L[t][ha]=Sa;Wa&&Sa[ba].apply(Sa,Va)};})();\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/hashchange.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>hashchange test</title>\n</head>\n<body style=\"background:red;overflow:hidden;\">\n<script>\naddEventListener('hashchange', function() {\n\tdocument.body.style.background = 'lime';\n}, false);\n\nlocation.hash = Math.random();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/mathml.html",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN\" \"http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:html=\"http://www.w3.org/1999/xhtml\">\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n\t<title>Untitled</title>\n</head>\n<body>\n<math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n<mrow>\n  <mi>k</mi>\n  <mo>=</mo>\n  <mfrac>\n    <mrow>\n      <mfrac>\n         <mrow>\n          <msup>\n            <mo>∂</mo>\n            <mn>2</mn>\n          </msup>\n          <mi>z</mi>\n        </mrow>\n        <mrow>\n          <mo>∂</mo>\n          <msup>\n            <mi>x</mi>\n            <mn>2</mn>\n          </msup>\n        </mrow>\n      </mfrac>\n      <mfrac>\n        <mrow>\n          <msup>\n            <mo>∂</mo>\n            <mn>2</mn>\n          </msup>\n          <mi>z</mi>\n        </mrow>\n        <mrow>\n          <mo>∂</mo>\n          <msup>\n            <mi>y</mi>\n            <mn>2</mn>\n          </msup>\n        </mrow>\n      </mfrac>\n      <mo>-</mo>\n      <msup>\n        <mrow>\n          <mo>(</mo>\n          <mfrac>\n            <mrow>\n              <msup>\n                <mo>∂</mo>\n                <mn>2</mn>\n              </msup>\n              <mi>z</mi>\n            </mrow>\n            <mrow>\n              <mo>∂</mo>\n              <mi>x</mi>\n              <mo>∂</mo>\n              <mi>y</mi>\n              </mrow>\n          </mfrac>\n          <mo>)</mo>\n        </mrow>\n        <mn>2</mn>\n      </msup>\n    </mrow>\n    <mrow>\n      <msup>\n        <mrow>\n          <mo>(</mo>\n          <mn>1</mn>\n          <mo>+</mo>\n          <msup>\n            <mrow>\n              <mo>(</mo>\n              <mfrac>\n                <mrow>\n                  <mo>∂</mo>\n                  <mi>z</mi>\n                </mrow>\n                <mrow>\n                  <mo>∂</mo>\n                  <mi>x</mi>\n                </mrow>\n              </mfrac>\n              <mo>)</mo>\n            </mrow>\n            <mn>2</mn>\n          </msup>\n          <mo>+</mo>\n          <msup>\n            <mrow>\n              <mo>(</mo>\n              <mfrac>\n                <mrow>\n                  <mo>∂</mo>\n                  <mi>z</mi>\n                </mrow>\n                <mrow>\n                  <mo>∂</mo>\n                  <mi>y</mi>\n                </mrow>\n              </mfrac>\n              <mo>)</mo>\n            </mrow>\n            <mn>2</mn>\n          </msup>\n          <mo>)</mo>\n        </mrow>\n        <mn>2</mn>\n      </msup>\n    </mrow>\n  </mfrac>\n</mrow>\n</math>\n</body>\n</html>"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/pushstate.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>popstate event test</title>\n</head>\n<body>\n\n<script>\n\n(function() {\n\tvar test_id;\n\t\n\tfunction showResult(r) {\n\t\tif(test_id && window.parent.setResult) {\n\t\t\tparent.setResult(test_id, r);\n\t\t} else {\n\t\t\talert(r);\n\t\t}\n\t}\n\t\n\tif(location.hash.length) {\n\t\ttest_id = location.hash.substr(1);\n\t}\n\t\n\tif(history.pushState) {\n\t\tvar rand = Math.random();\n\t\tsetTimeout(function() {\n\t\t\thistory.pushState({foo: 'bar'}, \"title\", './' + rand);\n\t\t\tvar result = (location.href.indexOf(rand) > -1);\n\t\t\tshowResult(result);\n\t\t}, 100);\n\t} \n\t\n})();\n\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/style.css",
    "content": "body {\n\tfont-family: \"Lucida Grande\", Lucida, Verdana, sans-serif;\n\tfont-size: 12px;\n}\n\na {\n\ttext-decoration: none;\n}\na:hover {\n\ttext-decoration: underline;\n}\n\ntable, tr, th, td {\n\tborder: 1px solid #AAA;\n}\n\ntable {\n\tmargin-top: 1em;\n\twidth: 100%;\n}\n\ntbody th {\n\ttext-align: left;\n\tfont-size: 14px;\n\twidth: 200px;\n}\n\nth h3 {\n\tmargin: 3px;\n\tfont-size: 12px;\n}\n\nth span.links {\n\tfont-size: 10px;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ntr:hover > th,\ntr:hover > td + td { background-color: #FFC; }\n\ndiv.test_wrap {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n\tborder: 1px solid #CCC;\n\ttext-align: center;\n\tvertical-align: top;\n\tmin-height: 50px;\n\tmargin-right: 5px;\n\tbackground: white;\n\tposition: relative;\n}\n\ndiv.test_wrap h3 {\n\ttext-align: center;\n\tmargin: 2px;\n\tfont-size: 10px;\n}\n\ndiv.auto {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n\tborder: 1px solid;\n\twidth: 30px;\n\theight: 30px;\n}\n\ndiv.square {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n\tborder: 1px solid;\n\twidth: 30px;\n\theight: 30px;\n\tbackground: red;\n}\n\ndiv.info {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 100%;\n\tz-index: 2;\n\tleft: 0;\n\tbackground: white;\n\tpadding: 2px;\n\tmin-width: 300px;\n\tborder: 1px solid;\n\ttext-align: left;\n}\n\ndiv.test_wrap:hover > div.info {\n\tdisplay: block;\n}\n\n\ndiv.vis_test {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n}\n\ndiv.vis_ref {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n\tborder-left: 1px dashed black;\n\tmargin-left: 5px;\n\tpadding-left: 5px;\n\tvertical-align: top;\n}\n\np.condition {\n\tfont-style: italic;\n\tmargin: 2px;\n\tclear: both;\n}\n\n.pass {\n  background: lime;\n}\n\n.fail {\n  background: red;\n}\n\n.partial {\n  background: yellow;\n}\n\n.unknown {\n  background: #aaa;\n}\n\n.current span {\n    border-radius: 6px;\n    -moz-border-radius: 6px;\n    background: none repeat scroll 0 0 #E6EA69;\n    color: black;\n    float: right;\n    font-size: 8px;\n    padding: 0 1px;\n}\n\n#intro, #options {\n\twidth: 400px;\n\tbackground: #EEE;\n\tborder-radius: 10px;\n\tpadding: 5px 10px;\n\tmargin: 10px;\n\tfloat: left;\n}\n\n#intro dt::after {\n\tcontent: ':';\n}\n\n#intro dd {\n\tmargin-bottom: 1em;\n}\n\n#opt_submit {\n\tdisplay: block;\n\tmargin: 10px;\n}\n\n#options label {\n\tdisplay: block;\n\tmargin: 5px;\n}"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/svg-img.svg.1",
    "content": "<?xml version=\"1.0\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\"> \n    <rect fill=\"#00ff00\" x=\"0\" y=\"0\" width=\"30\" height=\"30\"> \n</rect>\n</svg>"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/caniuse_files/xhtml.html",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n\t<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n\t<title>Untitled</title>\n</head>\n<body><p>true</p>\t\n\t<script>\n\t<![CDATA[\n\twindow.parent.setResult('xhtml0', document.body.firstChild.textContent == 'true');\n\t]]>\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/index.html",
    "content": "<!DOCTYPE html>\n<html class=\"+no-js no-js- no-js i-has-no-js\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Modernizr Test Suite</title>\n  <link rel=\"stylesheet\" href=\"qunit/qunit.css\">\n  <style>\n     body { margin-bottom: 150px;}\n     #testbed { font-family: Helvetica; color: #444; padding-bottom: 100px;}\n     #testbed button { margin: 30px; font-size: 13px;}\n     .data-notes, .offScreen { display:none;}\n     table { width: 100%;}\n     tbody tr:nth-child(even) td, tbody tr:nth-child(even) th {  border: 1px solid #ccc; border-left: 0; border-right: 0;}\n     table td:nth-child(even), table th:nth-child(even) { background: #e6e6e6;}\n     table tbody tr:hover td, table tbody tr:hover th { background: #e1e100!important;}\n     td.wrong { background:red!important;}\n     #html5section { visibility: hidden; }\n     h1 label { display:none;}\n     .output { padding: 0 0 0 16px;}\n     .output ul { margin: 0;}\n     .output li { color: #854747; }\n     .output li.yes{color:#090;}\n     .output li b{color:#000;}\n     .output {font:14px/1.3 Inconsolata,Consolas,monospace;\n                    -webkit-column-count: 5;\n                       -moz-column-count: 5;\n                            column-count: 5;}\n      .output + .output { border-top: 5px solid #ccc; }\n      textarea { width: 100%; min-height: 75px;}\n      #caniusetrigger { font-size: 38px; font-family: monospace; display:block; }\n  </style>\n\n\n  <script>window.Modernizr || document.write('<script src=\"../modernizr.js\"><\\/script>')</script>\n\n  <script src=\"https://raw.github.com/Modernizr/Modernizr/master/modernizr.js\"></script>\n\n  <script src=\"js/lib/polyfills.js\"></script>\n  <script src=\"js/lib/detect-global.js\"></script>\n\n  <script src=\"qunit/qunit.js\"></script>\n  <script src=\"js/lib/jquery-1.7b2.js\"></script>\n\n  <script src=\"js/lib/jsonselect.js\"></script>\n  <script src=\"js/lib/uaparser.js\"></script>\n  <script src=\"js/lib/github.js\"></script>\n\n  <script src=\"js/setup.js\"></script>\n\n  <script src=\"js/unit.js\"></script>\n  <script src=\"js/unit-caniuse.js\"></script>\n</head>\n<body>\n  <h1 id=\"qunit-header\">Modernizr Test Suite</h1>\n  <h2 id=\"qunit-banner\"></h2>\n  <div id=\"qunit-testrunner-toolbar\"></div>\n  <h2 id=\"qunit-userAgent\"></h2>\n\n  <ol id=\"qunit-tests\"></ol>\n\n  <div id=\"mod-output\" class=output></div>\n  <div id=\"mod-feattest-output\" class=output></div>\n\n\n  <br>\n\n  <section><aside>this is an aside within a section</aside></section>\n\n\n\n\n  <h5>JSON.stringify(Modernizr)</h5>\n  <textarea></textarea>\n  <a href=\"#\"   id=\"caniusetrigger\"\n                onclick=\"return revealreftests(this)\"\n                title=\"add a #caniuse hash to this page to make this automatic\"\n                >Show the Ref Tests from Caniuse and Modernizr</a>\n\n\n  <script src=\"js/dumpdata.js\"></script>\n  <script>\n    function revealreftests(a){\n\n        if (!a) a = document.getElementById('caniusetrigger');\n        a.parentNode && a.parentNode.removeChild(a);\n\n        var iframe = document.createElement('iframe');\n        iframe.src = 'caniuse.html';\n        iframe.style.cssText = 'width: 100%; height: 7000px; border: 15px double #F0C; \\\n                                -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; ';\n        document.body.appendChild(iframe);\n\n        return false;\n    }\n\n    if (location.hash.replace(/^#/,'') == 'caniuse'){\n        setTimeout(revealreftests, 100);\n    }\n\n  </script>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/basic.html",
    "content": "<!DOCTYPE html>\n<html class=\"+no-js no-js- no-js i-has-no-js\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Modernizr Test Suite</title>\n  <link rel=\"stylesheet\" href=\"qunit/qunit.css\">\n  <style>\n     body { margin-bottom: 150px;}\n     #testbed { font-family: Helvetica; color: #444; padding-bottom: 100px;}\n     #testbed button { margin: 30px; font-size: 13px;}\n     .data-notes, .offScreen { display:none;}\n     table { width: 100%;}\n     tbody tr:nth-child(even) td, tbody tr:nth-child(even) th {  border: 1px solid #ccc; border-left: 0; border-right: 0;}\n     table td:nth-child(even), table th:nth-child(even) { background: #e6e6e6;}\n     table tbody tr:hover td, table tbody tr:hover th { background: #e1e100!important;}\n     td.wrong { background:red!important;}\n     #html5section { visibility: hidden; }\n     h1 label { display:none;}\n     .output { padding: 0 0 0 16px;}\n     .output ul { margin: 0;}\n     .output li { color: #854747; }\n     .output li.yes{color:#090;}\n     .output li b{color:#000;}\n     .output {font:14px/1.3 Inconsolata,Consolas,monospace;\n                    -webkit-column-count: 5;\n                       -moz-column-count: 5;\n                            column-count: 5;}\n      .output + .output { border-top: 5px solid #ccc; }\n      textarea { width: 100%; min-height: 75px;}\n      #caniusetrigger { font-size: 38px; font-family: monospace; display:block; }\n  </style>\n\n  <script src=\"https://raw.github.com/Modernizr/Modernizr/master/modernizr.js\"></script>\n\n  <script>window.Modernizr || document.write('<script src=\"../modernizr.js\"><\\/script>'); console.log(\"Loading in the /js folder *trollface*\")</script>\n\n  <script src=\"js/lib/polyfills.js\"></script>\n  <script src=\"js/lib/detect-global.js\"></script>\n  \n  <script src=\"qunit/qunit.js\"></script>\n  <script src=\"js/lib/jquery-1.7b2.js\"></script>\n  \n  <script src=\"js/setup.js\"></script>\n  \n  <script src=\"js/unit.js\"></script>\n</head>\n<body>\n  <h1 id=\"qunit-header\">Modernizr Test Suite</h1>\n  <h2 id=\"qunit-banner\"></h2>\n  <div id=\"qunit-testrunner-toolbar\"></div>\n  <h2 id=\"qunit-userAgent\"></h2>\n\n  <ol id=\"qunit-tests\"></ol>\n\n  <div id=\"mod-output\" class=output></div>\n  <div id=\"mod-feattest-output\" class=output></div>\n\n\n  <br>\n \n  <section><aside>this is an aside within a section</aside></section>\n  \n  \n</body>\n</html> \n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/dumpdata.js",
    "content": "function dumpModernizr(){\n  var str = '';\n  dumpModernizr.old = dumpModernizr.old || {};\n\n    for (var prop in Modernizr) {\n\n      // skip previously done ones.\n      if (dumpModernizr.old[prop]) continue;\n      else dumpModernizr.old[prop] = true;\n\n      if (typeof Modernizr[prop] === 'function') continue;\n      // skip unit test items\n      if (/^test/.test(prop)) continue;\n\n      if (~TEST.inputs.indexOf(prop)) {\n        str += '<li><b>'+prop+'{}</b><ul>';\n        for (var field in Modernizr[prop]) {\n          str += '<li class=\"' + (Modernizr[prop][field] ? 'yes' : '') + '\">' + field + ': ' + Modernizr[prop][field] + '</li>';\n        }\n        str += '</ul></li>';\n      } else {\n        str += '<li  id=\"'+prop+'\" class=\"' + (Modernizr[prop] ? 'yes' : '') + '\">' + prop + ': ' + Modernizr[prop] + '</li>';\n      }\n  }\n  return str;\n}\n\n\nfunction grabFeatDetects(){\n  // thx github.js\n  $.getScript('https://api.github.com/repos/Modernizr/Modernizr/git/trees/master?recursive=1&callback=processTree');\n}\n\n\nfunction processTree(data){\n  var filenames = [];\n\n  for (var i = 0; i < data.data.tree.length; i++){\n    var file = data.data.tree[i];\n    var match = file.path.match(/^feature-detects\\/(.*)/);\n    if (!match) continue;\n\n    var relpath = location.host == \"modernizr.github.com\" ?\n                    '../modernizr-git/' : '../';\n\n    filenames.push(relpath + match[0]);\n  }\n\n  var jqxhrs = filenames.map(function(filename){\n    return jQuery.getScript(filename);\n  });\n\n  jQuery.when.apply(jQuery, jqxhrs).done(resultsToDOM);\n\n}\n\nfunction resultsToDOM(){\n\n  var modOutput = document.createElement('div'),\n      ref = document.getElementById('qunit-testresult') || document.getElementById('qunit-tests');\n\n  modOutput.className = 'output';\n  modOutput.innerHTML = dumpModernizr();\n\n  ref.parentNode.insertBefore(modOutput, ref);\n\n  // Modernizr object as text\n  document.getElementsByTagName('textarea')[0].innerHTML = JSON.stringify(Modernizr);\n\n}\n\n/* uno    */ resultsToDOM();\n/* dos    */ grabFeatDetects();\n/* tres   */ setTimeout(resultsToDOM,  5e3);\n/* quatro */ setTimeout(resultsToDOM, 15e3);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/lib/detect-global.js",
    "content": "// https://github.com/kangax/detect-global\n\n// tweaked to run without a UI.\n\n(function () {\n    function getPropertyDescriptors(object) {\n      var props = { };\n      for (var prop in object) {\n        \n        // nerfing for firefox who goes crazy over some objects like sessionStorage\n        try {\n          \n          props[prop] = {\n            type:  typeof object[prop],\n            value: object[prop]\n          };\n          \n        } catch(e){\n          props[prop] = {}; \n        }\n      }\n      return props;\n    }\n    \n    function getCleanWindow() {\n      var elIframe = document.createElement('iframe');\n      elIframe.style.display = 'none';\n      \n      var ref = document.getElementsByTagName('script')[0];\n      ref.parentNode.insertBefore(elIframe, ref);\n      \n      elIframe.src = 'about:blank';\n      return elIframe.contentWindow;\n    }\n    \n    function appendControl(el, name) {\n      var elCheckbox = document.createElement('input');\n      elCheckbox.type = 'checkbox';\n      elCheckbox.checked = true;\n      elCheckbox.id = '__' + name;\n      \n      var elLabel = document.createElement('label');\n      elLabel.htmlFor = '__' + name;\n      elLabel.innerHTML = 'Exclude ' + name + ' properties?';\n      elLabel.style.marginLeft = '0.5em';\n      \n      var elWrapper = document.createElement('p');\n      elWrapper.style.marginBottom = '0.5em';\n      \n      elWrapper.appendChild(elCheckbox);\n      elWrapper.appendChild(elLabel);\n\n      el.appendChild(elWrapper);\n    }\n    \n    function appendAnalyze(el) {\n      var elAnalyze = document.createElement('button');\n      elAnalyze.id = '__analyze';\n      elAnalyze.innerHTML = 'Analyze';\n      elAnalyze.style.marginTop = '1em';\n      el.appendChild(elAnalyze);\n    }\n    \n    function appendCancel(el) {\n      var elCancel = document.createElement('a');\n      elCancel.href = '#';\n      elCancel.innerHTML = 'Cancel';\n      elCancel.style.cssText = 'color:#eee;margin-left:0.5em;';\n      elCancel.onclick = function() {\n        el.parentNode.removeChild(el);\n        return false; \n      };\n      el.appendChild(elCancel);\n    }\n    \n    function initConfigPopup() {\n      var el = document.createElement('div');\n      \n      el.style.cssText =  'position:fixed; left:10px; top:10px; width:300px; background:rgba(50,50,50,0.9);' +\n                          '-moz-border-radius:10px; padding:1em; color: #eee; text-align: left;' +\n                          'font-family: \"Helvetica Neue\", Verdana, Arial, sans serif; z-index: 99999;';\n      \n      for (var prop in propSets) {\n        appendControl(el, prop);\n      }\n      \n      appendAnalyze(el);\n      appendCancel(el);\n      \n      var ref = document.getElementsByTagName('script')[0];\n      ref.parentNode.insertBefore(el, ref);\n    }\n    \n    function getPropsCount(object) {\n      var count = 0;\n      for (var prop in object) {\n        count++;\n      }\n      return count;\n    }\n    \n    function shouldDeleteProperty(propToCheck) {\n      for (var prop in propSets) {\n        var elCheckbox = document.getElementById('__' + prop);\n        var isPropInSet = propSets[prop].indexOf(propToCheck) > -1;\n        if (isPropInSet && (elCheckbox ? elCheckbox.checked : true) ) {\n          return true;\n        }\n      }\n    }\n    \n    function analyze() {\n      var global = (function(){ return this; })(),\n          globalProps = getPropertyDescriptors(global),\n          cleanWindow = getCleanWindow();\n          \n      for (var prop in cleanWindow) {\n        if (globalProps[prop]) {\n          delete globalProps[prop];\n        }\n      }\n      for (var prop in globalProps) {\n        if (shouldDeleteProperty(prop)) {\n          delete globalProps[prop];\n        }\n      }\n      \n      window.__globalsCount = getPropsCount(globalProps);\n      window.__globals      = globalProps;\n      \n      window.console && console.log('Total number of global properties: ' + __globalsCount);\n      window.console && console.dir(__globals);\n    }\n    \n    var propSets = {\n      'Prototype':        '$$ $A $F $H $R $break $continue $w Abstract Ajax Class Enumerable Element Field Form ' +\n                          'Hash Insertion ObjectRange PeriodicalExecuter Position Prototype Selector Template Toggle Try'.split(' '),\n                        \n      'Scriptaculous':    'Autocompleter Builder Control Draggable Draggables Droppables Effect Sortable SortableObserver Sound Scriptaculous'.split(' '),\n      'Firebug':          'loadFirebugConsole console _getFirebugConsoleElement _FirebugConsole _FirebugCommandLine _firebug'.split(' '),\n      'Mozilla':          'Components XPCNativeWrapper XPCSafeJSObjectWrapper getInterface netscape GetWeakReference GeckoActiveXObject'.split(' '),\n      'GoogleAnalytics':  'gaJsHost gaGlobal _gat _gaq pageTracker'.split(' '),\n      'lazyGlobals':      'onhashchange'.split(' ')\n    };\n    \n    // initConfigPopup(); // disable because we're going UI-less.\n    \n    var analyzeElem = document.getElementById('__analyze');\n    analyzeElem && (analyzeElem.onclick = analyze);\n    \n    analyze(); // and assign total added globals to window.__globalsCount\n    \n})();"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/lib/jquery-1.7b2.js",
    "content": "/*!\n * jQuery JavaScript Library v1.7b2\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Thu Oct 13 21:12:55 2011 -0400\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n\tnavigator = window.navigator,\n\tlocation = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\tquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/,\n\ttrimRight = /\\s+$/,\n\n\t// Check for digits\n\trdigit = /\\d/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n\t// Useragent RegExp\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n\trmsie = /(msie) ([\\w.]+)/,\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n\t// Matches dashed string for camelizing\n\trdashAlpha = /-([a-z]|[0-9])/ig,\n\trmsPrefix = /^-ms-/,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn ( letter + \"\" ).toUpperCase();\n\t},\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\ttrim = String.prototype.trim,\n\tindexOf = Array.prototype.indexOf,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context && document.body ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = quickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = (context ? context.ownerDocument || context : document);\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn (context || rootjQuery).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif (selector.selector !== undefined) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.7b2\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = this.constructor();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + (this.selector ? \" \" : \"\") + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// Add the callback\n\t\treadyList.add( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, +i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\t\t// Either a released hold or an DOMready/load event and not yet ready\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there are functions bound, to execute\n\t\t\treadyList.fireWith( document, [ jQuery ] );\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.trigger ) {\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).unbind( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tbindReady: function() {\n\t\tif ( readyList ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyList = jQuery.Callbacks( \"once memory\" );\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\t// A crude way of determining if an object is a window\n\tisWindow: function( obj ) {\n\t\treturn obj && typeof obj === \"object\" && \"setInterval\" in obj;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn obj != null && rdigit.test( obj ) && !isNaN( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow msg;\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn (new Function( \"return \" + data ))();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\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// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\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\treturn object;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttrim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// The extra typeof function check is to prevent crashes\n\t\t\t// in Safari 2 (See: #3039)\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\tvar type = jQuery.type( array );\n\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array, i ) {\n\t\tvar len;\n\n\t\tif ( array ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( array, elem, i );\n\t\t\t}\n\n\t\t\tlen = array.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in array && array[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [], retVal;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key, ret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tif ( typeof context === \"string\" ) {\n\t\t\tvar tmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\tvar args = slice.call( arguments, 2 ),\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\n\t\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Mutifunctional method to get and set values to a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, key, value, exec, fn, pass ) {\n\t\tvar length = elems.length;\n\n\t\t// Setting many attributes\n\t\tif ( typeof key === \"object\" ) {\n\t\t\tfor ( var k in key ) {\n\t\t\t\tjQuery.access( elems, k, key[k], exec, fn, value );\n\t\t\t}\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Setting one attribute\n\t\tif ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = !pass && exec && jQuery.isFunction(value);\n\n\t\t\tfor ( var i = 0; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t}\n\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Getting an attribute\n\t\treturn length ? fn( elems[0], key ) : undefined;\n\t},\n\n\tnow: function() {\n\t\treturn (new Date()).getTime();\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = rwebkit.exec( ua ) ||\n\t\t\tropera.exec( ua ) ||\n\t\t\trmsie.exec( ua ) ||\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n\t\t\t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tsub: function() {\n\t\tfunction jQuerySub( selector, context ) {\n\t\t\treturn new jQuerySub.fn.init( selector, context );\n\t\t}\n\t\tjQuery.extend( true, jQuerySub, this );\n\t\tjQuerySub.superclass = this;\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\n\t\tjQuerySub.fn.constructor = jQuerySub;\n\t\tjQuerySub.sub = this.sub;\n\t\tjQuerySub.fn.init = function init( selector, context ) {\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\t\tcontext = jQuerySub( context );\n\t\t\t}\n\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t\t};\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\t\tvar rootjQuerySub = jQuerySub(document);\n\t\treturn jQuerySub;\n\t},\n\n\tbrowser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n\ttrimLeft = /^[\\s\\xA0]+/;\n\ttrimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch(e) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\nreturn jQuery;\n\n})();\n\n\n// String to Object flags format cache\nvar flagsCache = {};\n\n// Convert String-formatted flags into Object-formatted ones and store in cache\nfunction createFlags( flags ) {\n\tvar object = flagsCache[ flags ] = {},\n\t\ti, length;\n\tflags = flags.split( /\\s+/ );\n\tfor ( i = 0, length = flags.length; i < length; i++ ) {\n\t\tobject[ flags[i] ] = true;\n\t}\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\tflags:\tan optional list of space-separated flags that will change how\n *\t\t\tthe callback list behaves\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible flags:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( flags ) {\n\n\t// Convert flags from String-formatted to Object-formatted\n\t// (we check in cache first)\n\tflags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\n\n\tvar // Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = [],\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Add one or several callbacks to the list\n\t\tadd = function( args ) {\n\t\t\tvar i,\n\t\t\t\tlength,\n\t\t\t\telem,\n\t\t\t\ttype,\n\t\t\t\tactual;\n\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\n\t\t\t\telem = args[ i ];\n\t\t\t\ttype = jQuery.type( elem );\n\t\t\t\tif ( type === \"array\" ) {\n\t\t\t\t\t// Inspect recursively\n\t\t\t\t\tadd( elem );\n\t\t\t\t} else if ( type === \"function\" ) {\n\t\t\t\t\t// Add if not in unique mode and callback is not in\n\t\t\t\t\tif ( !flags.unique || !self.has( elem ) ) {\n\t\t\t\t\t\tlist.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Fire callbacks\n\t\tfire = function( context, args ) {\n\t\t\targs = args || [];\n\t\t\tmemory = !flags.memory || [ context, args ];\n\t\t\tfiring = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\n\t\t\t\t\tmemory = true; // Mark as halted\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\tif ( stack && stack.length ) {\n\t\t\t\t\t\tmemory = stack.shift();\n\t\t\t\t\t\tself.fireWith( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t} else {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar length = list.length;\n\t\t\t\t\tadd( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away, unless previous\n\t\t\t\t\t// firing was halted (stopOnFalse)\n\t\t\t\t\t} else if ( memory && memory !== true ) {\n\t\t\t\t\t\tfiringStart = length;\n\t\t\t\t\t\tfire( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar args = arguments,\n\t\t\t\t\t\targIndex = 0,\n\t\t\t\t\t\targLength = args.length;\n\t\t\t\t\tfor ( ; argIndex < argLength ; argIndex++ ) {\n\t\t\t\t\t\tfor ( var i = 0; i < list.length; i++ ) {\n\t\t\t\t\t\t\tif ( args[ argIndex ] === list[ i ] ) {\n\t\t\t\t\t\t\t\t// Handle firingIndex and firingLength\n\t\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\t\tif ( i <= firingLength ) {\n\t\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t\t\tif ( i <= firingIndex ) {\n\t\t\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t\t\t}\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\t// Remove the element\n\t\t\t\t\t\t\t\tlist.splice( i--, 1 );\n\t\t\t\t\t\t\t\t// If we have some unicity property then\n\t\t\t\t\t\t\t\t// we only need to do this once\n\t\t\t\t\t\t\t\tif ( flags.unique ) {\n\t\t\t\t\t\t\t\t\tbreak;\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\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar i = 0,\n\t\t\t\t\t\tlength = list.length;\n\t\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\t\tif ( fn === list[ i ] ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory || memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\t\t\tstack.push( [ context, args ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( !( flags.once && memory ) ) {\n\t\t\t\t\t\tfire( context, args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!memory;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\n\n\nvar // Static reference to slice\n\tsliceDeferred = [].slice;\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar doneList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tfailList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tprogressList = jQuery.Callbacks( \"memory\" ),\n\t\t\tstate = \"pending\",\n\t\t\tlists = {\n\t\t\t\tresolve: doneList,\n\t\t\t\treject: failList,\n\t\t\t\tnotify: progressList\n\t\t\t},\n\t\t\tpromise = {\n\t\t\t\tdone: doneList.add,\n\t\t\t\tfail: failList.add,\n\t\t\t\tprogress: progressList.add,\n\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\n\t\t\t\t// Deprecated\n\t\t\t\tisResolved: doneList.fired,\n\t\t\t\tisRejected: failList.fired,\n\n\t\t\t\tthen: function( doneCallbacks, failCallbacks, progressCallbacks ) {\n\t\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\treturn deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\n\t\t\t\t},\n\t\t\t\tpipe: function( fnDone, fnFail, fnProgress ) {\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( {\n\t\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\n\t\t\t\t\t\t\tfail: [ fnFail, \"reject\" ],\n\t\t\t\t\t\t\tprogress: [ fnProgress, \"notify\" ]\n\t\t\t\t\t\t}, function( handler, data ) {\n\t\t\t\t\t\t\tvar fn = data[ 0 ],\n\t\t\t\t\t\t\t\taction = data[ 1 ],\n\t\t\t\t\t\t\t\treturned;\n\t\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\n\t\t\t\t\t\t\t\tdeferred[ handler ](function() {\n\t\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\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\tdeferred[ handler ]( newDefer[ action ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\tif ( obj == null ) {\n\t\t\t\t\t\tobj = promise;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor( var key in promise ) {\n\t\t\t\t\t\t\tobj[ key ] = promise[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = promise.promise({}),\n\t\t\tkey;\n\n\t\tfor ( key in lists ) {\n\t\t\tdeferred[ key ] = lists[ key ].fire;\n\t\t\tdeferred[ key + \"With\" ] = lists[ key ].fireWith;\n\t\t}\n\n\t\t// Handle state\n\t\tdeferred.done( function() {\n\t\t\tstate = \"resolved\";\n\t\t}, failList.disable, progressList.lock ).fail( function() {\n\t\t\tstate = \"rejected\";\n\t\t}, doneList.disable, progressList.lock );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( firstParam ) {\n\t\tvar args = sliceDeferred.call( arguments, 0 ),\n\t\t\ti = 0,\n\t\t\tlength = args.length,\n\t\t\tpValues = new Array( length ),\n\t\t\tcount = length,\n\t\t\tpCount = length,\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n\t\t\t\tfirstParam :\n\t\t\t\tjQuery.Deferred(),\n\t\t\tpromise = deferred.promise();\n\t\tfunction resolveFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tfunction progressFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\tpValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tdeferred.notifyWith( promise, pValues );\n\t\t\t};\n\t\t}\n\t\tif ( length > 1 ) {\n\t\t\tfor( ; i < length; i++ ) {\n\t\t\t\tif ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\n\t\t\t\t} else {\n\t\t\t\t\t--count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !count ) {\n\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t}\n\t\t} else if ( deferred !== firstParam ) {\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n\t\t}\n\t\treturn promise;\n\t}\n});\n\n\n\n\njQuery.support = (function() {\n\n\tvar div = document.createElement( \"div\" ),\n\t\tdocumentElement = document.documentElement,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tmarginDiv,\n\t\tsupport,\n\t\tfragment,\n\t\tbody,\n\t\ttestElementParent,\n\t\ttestElement,\n\t\ttestElementStyle,\n\t\ttds,\n\t\tevents,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\toffsetSupport;\n\n\t// Preliminary tests\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>\";\n\n\n\tall = div.getElementsByTagName( \"*\" );\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement( \"select\" );\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName( \"tbody\" ).length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName( \"link\" ).length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute( \"href\" ) === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure unknown elements (like HTML5 elems) are handled appropriately\n\t\tunknownElems: !!div.getElementsByTagName( \"nav\" ).length,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.firstChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\tdiv.innerHTML = \"\";\n\n\t// Figure out if the W3C box model works as expected\n\tdiv.style.width = div.style.paddingLeft = \"1px\";\n\n\t// We don't want to do body-related feature tests on frameset\n\t// documents, which lack a body. So we use\n\t// document.getElementsByTagName(\"body\")[0], which is undefined in\n\t// frameset documents, while document.body isn’t. (7398)\n\tbody = document.getElementsByTagName(\"body\")[ 0 ];\n\t// We use our own, invisible, body unless the body is already present\n\t// in which case we use a div (#9239)\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\tjQuery.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-999px\",\n\t\t\ttop: \"-999px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tsupport.boxModel = div.offsetWidth === 2;\n\n\tif ( \"zoom\" in div.style ) {\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\t// (IE < 8 does this)\n\t\tdiv.style.display = \"inline\";\n\t\tdiv.style.zoom = 1;\n\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );\n\n\t\t// Check if elements with layout shrink-wrap their children\n\t\t// (IE 6 does this)\n\t\tdiv.style.display = \"\";\n\t\tdiv.innerHTML = \"<div style='width:4px;'></div>\";\n\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 2 );\n\t}\n\n\tdiv.innerHTML = \"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";\n\ttds = div.getElementsByTagName( \"td\" );\n\n\t// Check if table cells still have offsetWidth/Height when they are set\n\t// to display:none and there are still other visible table cells in a\n\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t// determining if an element has been hidden directly using\n\t// display:none (it is still safe to use offsets if a parent element is\n\t// hidden; don safety goggles and see bug #4512 for more information).\n\t// (only IE 8 fails this test)\n\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\ttds[ 0 ].style.display = \"\";\n\ttds[ 1 ].style.display = \"none\";\n\n\t// Check if empty table cells still have offsetWidth/Height\n\t// (IE < 8 fail this test)\n\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\tdiv.innerHTML = \"\";\n\n\t// Check if div with explicit width and no margin-right incorrectly\n\t// gets computed margin-right based on width of container. For more\n\t// info see bug #3333\n\t// Fails in WebKit before Feb 2011 nightlies\n\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\tif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\t\tmarginDiv = document.createElement( \"div\" );\n\t\tmarginDiv.style.width = \"0\";\n\t\tmarginDiv.style.marginRight = \"0\";\n\t\tdiv.appendChild( marginDiv );\n\t\tsupport.reliableMarginRight =\n\t\t\t( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n\t}\n\n\t// Remove the body element we added\n\ttestElement.innerHTML = \"\";\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor( i in {\n\t\t\tsubmit: 1,\n\t\t\tchange: 1,\n\t\t\tfocusin: 1\n\t\t} ) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\t// Determine fixed-position support early\n\ttestElement.style.position = \"static\";\n\ttestElement.style.top = \"0px\";\n\ttestElement.style.marginTop = \"1px\";\n\toffsetSupport = (function( body, container ) {\n\n\t\tvar outer, inner, table, td, supports,\n\t\t\tbodyMarginTop = parseFloat( body.style.marginTop ) || 0,\n\t\t\tptlm = \"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\",\n\t\t\tstyle = \"style='\" + ptlm + \"border:5px solid #000;padding:0;'\",\n\t\t\thtml = \"<div \" + style + \"><div></div></div>\" +\n\t\t\t\t\t\t\t\"<table \" + style + \" cellpadding='0' cellspacing='0'>\" +\n\t\t\t\t\t\t\t\"<tr><td></td></tr></table>\";\n\n\t\tcontainer.style.cssText = ptlm + \"border:0;visibility:hidden\";\n\n\t\tcontainer.innerHTML = html;\n\t\tbody.insertBefore( container, body.firstChild );\n\t\touter = container.firstChild;\n\t\tinner = outer.firstChild;\n\t\ttd = outer.nextSibling.firstChild.firstChild;\n\n\t\tsupports = {\n\t\t\tdoesNotAddBorder: (inner.offsetTop !== 5),\n\t\t\tdoesAddBorderForTableAndCells: (td.offsetTop === 5)\n\t\t};\n\n\t\tinner.style.position = \"fixed\";\n\t\tinner.style.top = \"20px\";\n\n\t\t// safari subtracts parent border width here which is 5px\n\t\tsupports.supportsFixedPosition = (inner.offsetTop === 20 || inner.offsetTop === 15);\n\t\tinner.style.position = inner.style.top = \"\";\n\n\t\touter.style.overflow = \"hidden\";\n\t\touter.style.position = \"relative\";\n\n\t\tsupports.subtractsBorderForOverflowNotVisible = (inner.offsetTop === -5);\n\t\tsupports.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);\n\n\t\treturn supports;\n\n\t})( testElement, div );\n\n\tjQuery.extend( support, offsetSupport );\n\ttestElementParent.removeChild( testElement );\n\n\t// Null connected elements to avoid leaks in IE\n\ttestElement = fragment = select = opt = body = marginDiv = div = input = null;\n\n\treturn support;\n})();\n\n// Keep track of boxModel\njQuery.boxModel = jQuery.support.boxModel;\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ jQuery.expando ] = id = ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = jQuery.expando;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object \n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should\n\t\t// not attempt to inspect the internal events object using jQuery.data, as this\n\t\t// internal data object is undocumented and subject to change.\n\t\tif ( name === \"events\" && !thisCache[name] ) {\n\t\t\treturn thisCache[ internalKey ] && thisCache[ internalKey ].events;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\t// Reference to internal data cache key\n\t\t\tinternalKey = jQuery.expando,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support space separated names\n\t\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\t\tname = name;\n\t\t\t\t} else if ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split( \" \" );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\n\t\t// the window, but it will allow it on all other JS objects; other browsers\n\t\t// don't care\n\t\t// Ensure that `cache` is not a window object #10080\n\t\tif ( jQuery.support.deleteExpando || !cache.setInterval ) {\n\t\t\tdelete cache[ id ];\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\n\t\t// We destroyed the cache and need to eliminate the expando on the node to avoid\n\t\t// false lookups in the cache for entries that no longer exist\n\t\tif ( isNode ) {\n\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t// we must handle all of these cases\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ jQuery.expando ];\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t} else {\n\t\t\t\telem[ jQuery.expando ] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tif ( elem.nodeName ) {\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t\tif ( match ) {\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, attr, name,\n\t\t\tdata = null;\n\n\t\tif ( typeof key === \"undefined\" ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( this[0] );\n\n\t\t\t\tif ( this[0].nodeType === 1 && !jQuery._data( this[0], \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = this[0].attributes;\n\t\t\t\t\tfor ( var i = 0, l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( this[0], name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( this[0], \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t} else if ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split(\".\");\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\n\t\tif ( value === undefined ) {\n\t\t\tdata = this.triggerHandler(\"getData\" + parts[1] + \"!\", [parts[0]]);\n\n\t\t\t// Try to fetch any internally stored data first\n\t\t\tif ( data === undefined && this.length ) {\n\t\t\t\tdata = jQuery.data( this[0], key );\n\t\t\t\tdata = dataAttr( this[0], key, data );\n\t\t\t}\n\n\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\tdata;\n\n\t\t} else {\n\t\t\treturn this.each(function() {\n\t\t\t\tvar $this = jQuery( this ),\n\t\t\t\t\targs = [ parts[0], value ];\n\n\t\t\t\t$this.triggerHandler( \"setData\" + parts[1] + \"!\", args );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\t$this.triggerHandler( \"changeData\" + parts[1] + \"!\", args );\n\t\t\t});\n\t\t}\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\tjQuery.isNumeric( data ) ? parseFloat( data ) :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tfor ( var name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n\tvar deferDataKey = type + \"defer\",\n\t\tqueueDataKey = type + \"queue\",\n\t\tmarkDataKey = type + \"mark\",\n\t\tdefer = jQuery._data( elem, deferDataKey );\n\tif ( defer &&\n\t\t( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\n\t\t( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\n\t\t// Give room for hard-coded callbacks to fire first\n\t\t// and eventually mark/queue something else on the element\n\t\tsetTimeout( function() {\n\t\t\tif ( !jQuery._data( elem, queueDataKey ) &&\n\t\t\t\t!jQuery._data( elem, markDataKey ) ) {\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\n\t\t\t\tdefer.fire();\n\t\t\t}\n\t\t}, 0 );\n\t}\n}\n\njQuery.extend({\n\n\t_mark: function( elem, type ) {\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"mark\";\n\t\t\tjQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\n\t\t}\n\t},\n\n\t_unmark: function( force, elem, type ) {\n\t\tif ( force !== true ) {\n\t\t\ttype = elem;\n\t\t\telem = force;\n\t\t\tforce = false;\n\t\t}\n\t\tif ( elem ) {\n\t\t\ttype = type || \"fx\";\n\t\t\tvar key = type + \"mark\",\n\t\t\t\tcount = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\n\t\t\tif ( count ) {\n\t\t\t\tjQuery._data( elem, key, count );\n\t\t\t} else {\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tqueue: function( elem, type, data ) {\n\t\tvar q;\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"queue\";\n\t\t\tq = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\t\t\tq = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tq.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn q || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\trunner = {};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\tjQuery._data( elem, type + \".run\", runner );\n\t\t\tfn.call( elem, function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, runner );\n\t\t}\n\n\t\tif ( !queue.length ) {\n\t\t\tjQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t}\n\n\t\tif ( data === undefined ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, runner ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\trunner.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, object ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobject = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\t\tvar defer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = elements.length,\n\t\t\tcount = 1,\n\t\t\tdeferDataKey = type + \"defer\",\n\t\t\tqueueDataKey = type + \"queue\",\n\t\t\tmarkDataKey = type + \"mark\",\n\t\t\ttmp;\n\t\tfunction resolve() {\n\t\t\tif ( !( --count ) ) {\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t}\n\t\t}\n\t\twhile( i-- ) {\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise();\n\t}\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea)?$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tnodeHook, boolHook, fixSpecified;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.attr );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.prop );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\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\tremoveClass: function( value ) {\n\t\tvar classNames, i, l, elem, className, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tclassNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[ c ] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\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\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \";\n\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar isFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar self = jQuery(this), val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {\n\t\t\t\t\tvar option = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar nType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( !(\"getAttribute\" in elem) ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// Normalize the name if needed\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || (rboolean.test( name ) ? boolHook : nodeHook);\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn undefined;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar propName, attrNames, name, l,\n\t\t\ti = 0;\n\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tattrNames = (value || \"\").split( rspace );\n\t\t\tl = attrNames.length;\n\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tname = attrNames[ i ].toLowerCase();\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\telem.removeAttribute( name );\n\n\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\tif ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar nType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn (elem[ name ] = value);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !jQuery.support.getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && (fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified) ?\n\t\t\t\tret.nodeValue :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn (ret.nodeValue = value + \"\");\n\t\t}\n\t};\n\n\t// Apply the nodeHook to tabindex\n\tjQuery.attrHooks.tabindex.set = nodeHook.set;\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn (elem.style.cssText = \"\" + value);\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);\n\t\t\t}\n\t\t}\n\t});\n});\n\n\n\n\nvar rnamespaces = /\\.(.*)$/,\n\trformElems = /^(?:textarea|input|select)$/i,\n\trperiod = /\\./g,\n\trspaces = / /g,\n\trescape = /[^\\w\\s.|`]/g,\n\trtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\n\trhoverHack = /\\bhover(\\.\\S+)?/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trquickIs = /^([\\w\\-]+)?(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?(?:\\[([\\w+\\-]+)=[\"']?([\\w\\-]*)[\"']?\\])?$/,\n\tquickParse = function( selector ) {\n\t\tvar quick = rquickIs.exec( selector );\n\t\tif ( quick ) {\n\t\t\t//   0  1    2   3      4         5\n\t\t\t// [ _, tag, id, class, attrName, attrValue ]\n\t\t\tquick[1] = ( quick[1] || \"\" ).toLowerCase();\n\t\t\tquick[3] = quick[3] && new RegExp( \"\\\\b\" + quick[3] + \"\\\\b\" );\n\t\t}\n\t\treturn quick;\n\t},\n\tquickIs = function( elem, m ) {\n\t\treturn (\n\t\t\t(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\n\t\t\t(!m[2] || elem.id === m[2]) &&\n\t\t\t(!m[3] || m[3].test( elem.className )) &&\n\t\t\t(!m[4] || elem.getAttribute( m[4] ) == m[5])\n\t\t);\n\t};\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, quick, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.handle.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = types.replace( rhoverHack, \"mouseover$1 mouseout$1\" ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = (tns[2] || \"\").split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: tns[1],\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Delegated event; pre-analyze selector so it's processed quickly on event dispatch\n\t\t\tif ( selector ) {\n\t\t\t\thandleObj.quick = quickParse( selector );\n\t\t\t\tif ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {\n\t\t\t\t\thandleObj.isPositional = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector ) {\n\n\t\tvar elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n\t\t\tt, tns, type, namespaces, origCount,\n\t\t\tj, events, special, handle, eventType, handleObj;\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For removal, types can be an Event object\n\t\tif ( types && types.type && types.handler ) {\n\t\t\thandler = types.handler;\n\t\t\ttypes = types.type;\n\t\t\tselector = types.selector;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = (types || \"\").replace( rhoverHack, \"mouseover$1 mouseout$1\" ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = tns[2];\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tnamespaces = namespaces? \".\" + namespaces : \"\";\n\t\t\t\tfor ( j in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, j + namespaces, handler, selector );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\n\t\t\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Only need to loop for special events or selective removal\n\t\t\tif ( handler || namespaces || selector || special.remove ) {\n\t\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\t\tif ( !handler || handler.guid === handleObj.guid ) {\n\t\t\t\t\t\tif ( !namespaces || namespaces.test( handleObj.namespace ) ) {\n\t\t\t\t\t\t\tif ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) {\n\t\t\t\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\t\t\t\teventType.delegateCount--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\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\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Removing all events\n\t\t\t\teventType.length = 0;\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\thandle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, [ \"events\", \"handle\" ], true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tnamespaces = [],\n\t\t\tcache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\n\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// triggerHandler() and global events don't bubble or run the default action\n\t\tif ( onlyHandlers || !elem ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tevent.stopPropagation();\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\told = null;\n\t\t\tfor ( cur = elem.parentNode; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( old && old === elem.ownerDocument ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length; i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = (jQuery._data( cur, \"events\" ) || {})[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.call( elem.ownerDocument, event, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandle: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event || window.event );\n\n\t\tvar handlers = ((jQuery._data( this, \"events\" ) || {})[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = [].slice.call( arguments, 0 ),\n\t\t\thandlerQueue = [],\n\t\t\ti, cur, selMatch, matches, handleObj, sel, hit, related;\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\n\t\t// Determine handlers that should run if there are delegated events\n\t\t// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !event.target.disabled && !(event.button && event.type === \"click\") ) {\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\tselMatch = {};\n\t\t\t\tmatches = [];\n\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\tsel = handleObj.selector;\n\t\t\t\t\thit = selMatch[ sel ];\n\n\t\t\t\t\tif ( handleObj.isPositional ) {\n\t\t\t\t\t\t// Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/\n\t\t\t\t\t\thit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;\n\t\t\t\t\t} else if ( hit === undefined ) {\n\t\t\t\t\t\thit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( hit ) {\n\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( matches.length ) {\n\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the remaining (bound) handlers in case they're changed\n\t\thandlers = handlers.slice( delegateCount );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tevent.delegateTarget = this;\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tdispatch( matched.elem, event, matched.matches, args );\n\t\t}\n\t\tdelete event.delegateTarget;\n\n\t\t// Run non-delegated handlers for this level\n\t\tif ( handlers.length ) {\n\t\t\tdispatch( this, event, handlers, args );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement layerX layerY offsetX offsetY pageX pageY screenX screenY toElement wheelDelta\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n\t\t\t\tevent.pageY = original.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\n\t\tif ( event.metaKey === undefined ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady\n\t\t},\n\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\",\n\t\t\tnoBubble: true\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\",\n\t\t\tnoBubble: true\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.handle.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\n// Run jQuery handler functions; called from jQuery.event.handle\nfunction dispatch( target, event, handlers, args ) {\n\tvar run_all = !event.exclusive && !event.namespace,\n\t\tspecialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,\n\t\tj, handleObj, ret;\n\n\tevent.currentTarget = target;\n\tfor ( j = 0; j < handlers.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\thandleObj = handlers[ j ];\n\n\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t// Pass in a reference to the handler function itself\n\t\t\t// So that we can later remove it\n\t\t\tevent.handler = handleObj.handler;\n\t\t\tevent.data = handleObj.data;\n\t\t\tevent.handleObj = handleObj;\n\n\t\t\tret = ( specialHandle || handleObj.handler ).apply( target, args );\n\n\t\t\tif ( ret !== undefined ) {\n\t\t\t\tevent.result = ret;\n\t\t\t\tif ( ret === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.detachEvent ) {\n\t\t\telem.detachEvent( \"on\" + type, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar target = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector,\n\t\t\t\toldType, ret;\n\n\t\t\t// For a real mouseover/out, always call the handler; for\n\t\t\t// mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\toldType = event.type;\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = oldType;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !form._submit_attached ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\t// Form was submitted, bubble the event up the tree\n\t\t\t\t\t\tif ( this.parentNode ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tform._submit_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\telem._change_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\tjQuery.event.remove( event.delegateTarget || this, event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on.call( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tif ( types && types.preventDefault ) {\n\t\t\t// ( event )  native or jQuery.Event\n\t\t\treturn this.off( types.type, types.handler, types.selector );\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( var type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.bind( name, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\texpando = \"sizcache\" + (Math.random() + '').replace('.', ''),\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\trBackslash = /\\\\/g,\n\trReturn = /\\r\\n/g,\n\trNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\n\tvar origContext = context;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\t\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\n\t\tprune = true,\n\t\tcontextXML = Sizzle.isXML( context ),\n\t\tparts = [],\n\t\tsoFar = selector;\n\t\n\t// Reset the position of the chunker regexp (start from head)\n\tdo {\n\t\tchunker.exec( \"\" );\n\t\tm = chunker.exec( soFar );\n\n\t\tif ( m ) {\n\t\t\tsoFar = m[3];\n\t\t\n\t\t\tparts.push( m[1] );\n\t\t\n\t\t\tif ( m[2] ) {\n\t\t\t\textra = m[3];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while ( m );\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context, seed );\n\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tset = posProcess( selector, set, seed );\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\n\t\t\t\tret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n\t\t\tset = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\n\t\t\t\tret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray( set );\n\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tcur = parts.pop();\n\t\t\t\tpop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function( results ) {\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function( expr, set ) {\n\treturn Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n\tvar set, i, len, match, type, left;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\n\t\ttype = Expr.order[i];\n\t\t\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tleft = match[1];\n\t\t\tmatch.splice( 1, 1 );\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\n\t\t\t[];\n\t}\n\n\treturn { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n\tvar match, anyFound,\n\t\ttype, found, item, filter, left,\n\t\ti, pass,\n\t\told = expr,\n\t\tresult = [],\n\t\tcurLoop = set,\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n\twhile ( expr && set.length ) {\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tfilter = Expr.filter[ type ];\n\t\t\t\tleft = match[1];\n\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tpass = not ^ found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow \"Syntax error, unrecognized expression: \" + msg;\n};\n\n/**\n * Utility function for retreiving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = Sizzle.getText = function( elem ) {\n    var i, node,\n\t\tnodeType = elem.nodeType,\n\t\tret = \"\";\n\n\tif ( nodeType ) {\n\t\tif ( nodeType === 1 ) {\n\t\t\t// Use textContent || innerText for elements\n\t\t\tif ( typeof elem.textContent === 'string' ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else if ( typeof elem.innerText === 'string' ) {\n\t\t\t\t// Replace IE's carriage returns\n\t\t\t\treturn elem.innerText.replace( rReturn, '' );\n\t\t\t} else {\n\t\t\t\t// Traverse it's children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( i = 0; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tif ( node.nodeType !== 8 ) {\n\t\t\t\tret += getText( node );\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\n\tleftMatch: {},\n\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\n\tattrHandle: {\n\t\thref: function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\" );\n\t\t},\n\t\ttype: function( elem ) {\n\t\t\treturn elem.getAttribute( \"type\" );\n\t\t}\n\t},\n\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\n\t\t\">\": function( checkSet, part ) {\n\t\t\tvar elem,\n\t\t\t\tisPartStr = typeof part === \"string\",\n\t\t\t\ti = 0,\n\t\t\t\tl = checkSet.length;\n\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t},\n\n\t\t\"~\": function( checkSet, part, isXML ) {\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t}\n\t},\n\n\tfind: {\n\t\tID: function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t},\n\n\t\tNAME: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\n\t\tTAG: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( match[1] );\n\t\t\t}\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tID: function( match ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" );\n\t\t},\n\n\t\tTAG: function( match, curLoop ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\n\t\t},\n\n\t\tCHILD: function( match ) {\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\t\t\telse if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\n\t\t\t\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\t// Handle if an un-quoted value was used\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\treturn match;\n\t\t},\n\n\t\tPOS: function( match ) {\n\t\t\tmatch.unshift( true );\n\n\t\t\treturn match;\n\t\t}\n\t},\n\t\n\tfilters: {\n\t\tenabled: function( elem ) {\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\n\t\tdisabled: function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\tchecked: function( elem ) {\n\t\t\treturn elem.checked === true;\n\t\t},\n\t\t\n\t\tselected: function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\t\t\t\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\n\t\tempty: function( elem ) {\n\t\t\treturn !elem.firstChild;\n\t\t},\n\n\t\thas: function( elem, i, match ) {\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\n\t\theader: function( elem ) {\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) \n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n\t\t},\n\n\t\tradio: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n\t\t},\n\n\t\tcheckbox: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n\t\t},\n\n\t\tfile: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n\t\t},\n\n\t\tpassword: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n\t\t},\n\n\t\tsubmit: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n\t\t},\n\n\t\timage: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n\t\t},\n\n\t\treset: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function( elem, i ) {\n\t\t\treturn i === 0;\n\t\t},\n\n\t\tlast: function( elem, i, match, array ) {\n\t\t\treturn i === array.length - 1;\n\t\t},\n\n\t\teven: function( elem, i ) {\n\t\t\treturn i % 2 === 0;\n\t\t},\n\n\t\todd: function( elem, i ) {\n\t\t\treturn i % 2 === 1;\n\t\t},\n\n\t\tlt: function( elem, i, match ) {\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\n\t\tgt: function( elem, i, match ) {\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\n\t\tnth: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\n\t\teq: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function( elem, match, i, array ) {\n\t\t\tvar name = match[1],\n\t\t\t\tfilter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\n\t\t\t\t\tif ( not[j] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\t\t\t\tSizzle.error( name );\n\t\t\t}\n\t\t},\n\n\t\tCHILD: function( elem, match ) {\n\t\t\tvar first, last,\n\t\t\t\tdoneName, parent, cache,\n\t\t\t\tcount, diff,\n\t\t\t\ttype = match[1],\n\t\t\t\tnode = elem;\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"only\":\n\t\t\t\tcase \"first\":\n\t\t\t\t\twhile ( (node = node.previousSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( type === \"first\" ) { \n\t\t\t\t\t\treturn true; \n\t\t\t\t\t}\n\n\t\t\t\t\tnode = elem;\n\n\t\t\t\tcase \"last\":\n\t\t\t\t\twhile ( (node = node.nextSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase \"nth\":\n\t\t\t\t\tfirst = match[2];\n\t\t\t\t\tlast = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tdoneName = match[0];\n\t\t\t\t\tparent = elem.parentNode;\n\t\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tcount = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} \n\n\t\t\t\t\t\tparent[ expando ] = doneName;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tdiff = elem.nodeIndex - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tID: function( elem, match ) {\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\n\t\tTAG: function( elem, match ) {\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\n\t\t},\n\t\t\n\t\tCLASS: function( elem, match ) {\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\n\t\tATTR: function( elem, match ) {\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Sizzle.attr ?\n\t\t\t\t\tSizzle.attr( elem, name ) :\n\t\t\t\t\tExpr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\t!type && Sizzle.attr ?\n\t\t\t\tresult != null :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\n\t\tPOS: function( elem, match, i, array ) {\n\t\t\tvar name = match[2],\n\t\t\t\tfilter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS,\n\tfescape = function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t};\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n\nvar makeArray = function( array, results ) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\t\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n\tmakeArray = function( array, results ) {\n\t\tvar i = 0,\n\t\t\tret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date()).getTime(),\n\t\troot = document.documentElement;\n\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function( elem, match ) {\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\n\t// release memory in IE\n\troot = form = null;\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function( match, context ) {\n\t\t\tvar results = context.getElementsByTagName( match[1] );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n\t\tExpr.attrHandle.href = function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t};\n\t}\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle,\n\t\t\tdiv = document.createElement(\"div\"),\n\t\t\tid = \"__sizzle__\";\n\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tSizzle = function( query, context, extra, seed ) {\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\n\t\t\t\t// See if we find a selector to speed up\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n\t\t\t\t\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t\t\tif ( match[1] ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\n\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\n\t\t\t\t\t// The body element only exists once, optimize finding it\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\n\t\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\t\t\t} else if ( match && match[3] ) {\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\n\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn makeArray( [], extra );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t\t} catch(qsaError) {}\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar oldContext = context,\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\n\t\t\t\t\t\tnid = old || id,\n\t\t\t\t\t\thasParent = context.parentNode,\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\n\t\t\t\t\t\tcontext = context.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch(pseudoError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\t// release memory in IE\n\t\tdiv = null;\n\t})();\n}\n\n(function(){\n\tvar html = document.documentElement,\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n\tif ( matches ) {\n\t\t// Check to see if it's possible to do matchesSelector\n\t\t// on a disconnected node (IE 9 fails this)\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n\t\t\tpseudoWorks = false;\n\n\t\ttry {\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\n\t\n\t\t} catch( pseudoError ) {\n\t\t\tpseudoWorks = true;\n\t\t}\n\n\t\tSizzle.matchesSelector = function( node, expr ) {\n\t\t\t// Make sure that attribute selectors are quoted\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n\t\t\tif ( !Sizzle.isXML( node ) ) {\n\t\t\t\ttry { \n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\n\t\t};\n\t}\n})();\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\t\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function( match, context, isXML ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\t\t\t\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nif ( document.documentElement.contains ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\n\t};\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\n\t};\n\n} else {\n\tSizzle.contains = function() {\n\t\treturn false;\n\t};\n}\n\nSizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833) \n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context, seed ) {\n\tvar match,\n\t\ttmpSet = [],\n\t\tlater = \"\",\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet, seed );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\nSizzle.selectors.attrMap = {};\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\tslice = Array.prototype.slice,\n\tPOS = jQuery.expr.match.POS,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar self = this,\n\t\t\ti, l;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\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\tvar ret = this.pushStack( \"\", \"find\", selector ),\n\t\t\tlength, n, r;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\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\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && ( \n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\tPOS.test( selector ) ? \n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar ret = [], i, l, cur = this[0];\n\t\t\n\t\t// Array (deprecated as of jQuery 1.7)\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar level = 1;\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\tfor ( i = 0; i < selectors.length; i++ ) {\n\n\t\t\t\t\tif ( jQuery( cur ).is( selectors[ i ] ) ) {\n\t\t\t\t\t\tret.push({ selector: selectors[ i ], elem: cur, level: level });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcur = cur.parentNode;\n\t\t\t\tlevel++;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\t// String\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\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\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( elem.parentNode.firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until ),\n\t\t\t// The variable 'args' was introduced in\n\t\t\t// https://github.com/jquery/jquery/commit/52a0238\n\t\t\t// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.\n\t\t\t// http://code.google.com/p/v8/issues/detail?id=1050\n\t\t\targs = slice.call(arguments);\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, args.join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn (elem === qualifier) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn (jQuery.inArray( elem, qualifier ) >= 0) === keep;\n\t});\n}\n\n\n\n\nfunction createSafeFragment( document ) {\n\tvar nodeNames = (\n\t\t\"abbr article aside audio canvas datalist details figcaption figure footer \" +\n\t\t\"header hgroup mark meter nav output progress section summary time video\"\n\t).split( \" \" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( nodeNames.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tnodeNames.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar rinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( text ) {\n\t\tif ( jQuery.isFunction(text) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.text( text.call(this, i, self.text()) );\n\t\t\t});\n\t\t}\n\n\t\tif ( typeof text !== \"object\" && text !== undefined ) {\n\t\t\treturn this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );\n\t\t}\n\n\t\treturn jQuery.text( this );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery( this ).wrapAll( html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery(arguments[0]);\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery(arguments[0]).toArray() );\n\t\t\treturn set;\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\tif ( value === undefined ) {\n\t\t\treturn this[0] && this[0].nodeType === 1 ?\n\t\t\t\tthis[0].innerHTML.replace(rinlinejQuery, \"\") :\n\t\t\t\tnull;\n\n\t\t// See if we can take a shortcut and just use innerHTML\n\t\t} else if ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&\n\t\t\t!wrapMap[ (rtagName.exec( value ) || [\"\", \"\"])[1].toLowerCase() ] ) {\n\n\t\t\tvalue = value.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\ttry {\n\t\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\tif ( this[i].nodeType === 1 ) {\n\t\t\t\t\t\tjQuery.cleanData( this[i].getElementsByTagName(\"*\") );\n\t\t\t\t\t\tthis[i].innerHTML = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t} catch(e) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\n\t\t} else if ( jQuery.isFunction( value ) ) {\n\t\t\tthis.each(function(i){\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.html( value.call(this, i, self.html()) );\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.empty().append( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.length ?\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\t\tthis;\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, fragment, parent,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [];\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\t}\n\n\t\t\tfragment = results.fragment;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\n\t\t\t\t\t\t// in certain situations (Bug #8070).\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\n\t\t\t\t\t\t// in place.\n\t\t\t\t\t\tresults.cacheable || (l > 1 && i < lastIndex) ?\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, evalScript );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction root( elem, cur ) {\n\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\telem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? \".\" : \"\" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 fail to clone children inside object elements that use\n\t// the proprietary classid attribute value (rather than the type\n\t// attribute) to identify the type of content to display\n\tif ( nodeName === \"object\" ) {\n\t\tdest.outerHTML = src.outerHTML;\n\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\tif ( src.checked ) {\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\t}\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults, doc;\n\n  // nodes may contain either an explicit document object,\n  // a jQuery collection or context object.\n  // If nodes[0] contains a valid object to assign to doc\n  if ( nodes && nodes[0] ) {\n    doc = nodes[0].ownerDocument || nodes[0];\n  }\n\n  // Ensure that an attr object doesn't incorrectly stand in as a document object\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\n\t// Fixes #8950\n\tif ( !doc.createDocumentFragment ) {\n\t\tdoc = document;\n\t}\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\tif ( args.length === 1 && typeof args[0] === \"string\" && args[0].length < 512 && doc === document &&\n\t\targs[0].charAt(0) === \"<\" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {\n\n\t\tcacheable = true;\n\n\t\tcacheresults = jQuery.fragments[ args[0] ];\n\t\tif ( cacheresults && cacheresults !== 1 ) {\n\t\t\tfragment = cacheresults;\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = (i > 0 ? this.clone(true) : this).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n\tvar nodeName = (elem.nodeName || \"\").toLowerCase();\n\tif ( nodeName === \"input\" ) {\n\t\tfixDefaultChecked( elem );\n\t// Skip scripts, get other children\n\t} else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar clone = elem.cloneNode(true),\n\t\t\t\tsrcElements,\n\t\t\t\tdestElements,\n\t\t\t\ti;\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName\n\t\t\t// instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar checkScriptType;\n\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tvar ret = [], j;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\t\tvar tag = (rtagName.exec( elem ) || [\"\", \"\"])[1].toLowerCase(),\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\t\tdiv = context.createElement(\"div\");\n\n\t\t\t\t\t// Append wrapper element to unknown element safe doc fragment\n\t\t\t\t\tif ( context === document ) {\n\t\t\t\t\t\t// Use the fragment we've already created for this document\n\t\t\t\t\t\tsafeFragment.appendChild( div );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Use a fragment created with the owner document\n\t\t\t\t\t\tcreateSafeFragment( context ).appendChild( div );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\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// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resets defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tvar len;\n\t\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\n\t\t\t\t\t\tfindInputs( elem[j] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfindInputs( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tcheckScriptType = function( elem ) {\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\n\t\t\t};\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\n\t\t\t\tif ( scripts && jQuery.nodeName( ret[i], \"script\" ) && (!ret[i].type || ret[i].type.toLowerCase() === \"text/javascript\") ) {\n\t\t\t\t\tscripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( ret[i].nodeType === 1 ) {\n\t\t\t\t\t\tvar jsTags = jQuery.grep( ret[i].getElementsByTagName( \"script\" ), checkScriptType );\n\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( ret[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, id, \n\t\t\tcache = jQuery.cache,\n\t\t\tspecial = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tid = elem[ jQuery.expando ];\n\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ];\n\n\t\t\t\tif ( data && data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\n\t\t\t\t\tif ( data.handle ) {\n\t\t\t\t\t\tdata.handle.elem = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction evalScript( i, elem ) {\n\tif ( elem.src ) {\n\t\tjQuery.ajax({\n\t\t\turl: elem.src,\n\t\t\tasync: false,\n\t\t\tdataType: \"script\"\n\t\t});\n\t} else {\n\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n\t}\n\n\tif ( elem.parentNode ) {\n\t\telem.parentNode.removeChild( elem );\n\t}\n}\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\t// fixed for IE9, see #8346\n\trupper = /([A-Z]|^ms)/g,\n\trnumpx = /^-?\\d+(?:px)?$/i,\n\trnum = /^-?\\d/,\n\trrelNum = /^([\\-+])=([\\-+.\\de]+)/,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssWidth = [ \"Left\", \"Right\" ],\n\tcssHeight = [ \"Top\", \"Bottom\" ],\n\tcurCSS,\n\n\tgetComputedStyle,\n\tcurrentStyle;\n\njQuery.fn.css = function( name, value ) {\n\t// Setting 'undefined' is a no-op\n\tif ( arguments.length === 2 && value === undefined ) {\n\t\treturn this;\n\t}\n\n\treturn jQuery.access( this, name, value, true, function( elem, name, value ) {\n\t\treturn value !== undefined ?\n\t\t\tjQuery.style( elem, name, value ) :\n\t\t\tjQuery.css( elem, name );\n\t});\n};\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\", \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t} else {\n\t\t\t\t\treturn elem.style.opacity;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n\t\tname = jQuery.cssProps[ origName ] || origName;\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra ) {\n\t\tvar ret, hooks;\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.camelCase( name );\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tname = jQuery.cssProps[ name ] || name;\n\n\t\t// cssFloat needs a special treatment\n\t\tif ( name === \"cssFloat\" ) {\n\t\t\tname = \"float\";\n\t\t}\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n\t\t\treturn ret;\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\t} else if ( curCSS ) {\n\t\t\treturn curCSS( elem, name );\n\t\t}\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( var name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tcallback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\t}\n});\n\n// DEPRECATED, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\njQuery.each([\"height\", \"width\"], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tvar val;\n\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\t\treturn getWH( elem, name, extra );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\tval = getWH( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn val;\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tif ( rnumpx.test( value ) ) {\n\t\t\t\t// ignore negative width and height values #1599\n\t\t\t\tvalue = parseFloat( value );\n\n\t\t\t\tif ( value >= 0 ) {\n\t\t\t\t\treturn value + \"px\";\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery(function() {\n\t// This hook cannot be added until DOM ready because the support test\n\t// for it is not run until after DOM ready\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\tvar ret;\n\t\t\t\tjQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tret = curCSS( elem, \"margin-right\", \"marginRight\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = elem.style.marginRight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\t}\n});\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\tgetComputedStyle = function( elem, name ) {\n\t\tvar ret, defaultView, computedStyle;\n\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\tif ( !(defaultView = elem.ownerDocument.defaultView) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nif ( document.documentElement.currentStyle ) {\n\tcurrentStyle = function( elem, name ) {\n\t\tvar left,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\tif ( !rnumpx.test( ret ) && rnum.test( ret ) ) {\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : (ret || 0);\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWH( elem, name, extra ) {\n\n\t// Start with offset property\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\twhich = name === \"width\" ? cssWidth : cssHeight;\n\n\tif ( val > 0 ) {\n\t\tif ( extra !== \"border\" ) {\n\t\t\tjQuery.each( which, function() {\n\t\t\t\tif ( !extra ) {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\t\tval += parseFloat( jQuery.css( elem, extra + this ) ) || 0;\n\t\t\t\t} else {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn val + \"px\";\n\t}\n\n\t// Fall back to computed then uncomputed css if necessary\n\tval = curCSS( elem, name, name );\n\tif ( val < 0 || val == null ) {\n\t\tval = elem.style[ name ] || 0;\n\t}\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Add padding, border, margin\n\tif ( extra ) {\n\t\tjQuery.each( which, function() {\n\t\t\tval += parseFloat( jQuery.css( elem, \"padding\" + this ) ) || 0;\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, extra + this ) ) || 0;\n\t\t\t}\n\t\t});\n\t}\n\n\treturn val + \"px\";\n}\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth,\n\t\t\theight = elem.offsetHeight;\n\n\t\treturn (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trselectTextarea = /^(?:select|textarea)/i,\n\trspacesAjax = /\\s+/,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Document location\n\tajaxLocation,\n\n\t// Document location segments\n\tajaxLocParts,\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n\t\t\t\ti = 0,\n\t\t\t\tlength = dataTypes.length,\n\t\t\t\tdataType,\n\t\t\t\tlist,\n\t\t\t\tplaceBefore;\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor(; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar list = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters ),\n\t\tselection;\n\n\tfor(; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\tfor( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n}\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" && _load ) {\n\t\t\treturn _load.apply( this, arguments );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf( \" \" );\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice( off, url.length );\n\t\t\turl = url.slice( 0, off );\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = undefined;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\t// Complete callback (responseText is used internally)\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\n\t\t\t\t// Store the response as specified by the jqXHR object\n\t\t\t\tresponseText = jqXHR.responseText;\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( jqXHR.isResolved() ) {\n\t\t\t\t\t// #4825: Get the actual response in case\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\n\t\t\t\t\tjqXHR.done(function( r ) {\n\t\t\t\t\t\tresponseText = r;\n\t\t\t\t\t});\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div>\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tresponseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.bind( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\tcontext: true,\n\t\t\turl: true\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || \"abort\";\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\tvar isSuccess,\n\t\t\t\tsuccess,\n\t\t\t\terror,\n\t\t\t\tstatusText = nativeStatusText,\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n\t\t\t\tlastModified,\n\t\t\t\tetag;\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\n\t\t\t\t\t\tstatusText = \"success\";\n\t\t\t\t\t\tisSuccess = true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// We have a parsererror\n\t\t\t\t\t\tstatusText = \"parsererror\";\n\t\t\t\t\t\terror = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.then( tmp, tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefiler, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already\n\t\t\t\tjqXHR.abort();\n\t\t\t\treturn false;\n\n\t\t}\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.error( e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [],\n\t\t\tadd = function( key, value ) {\n\t\t\t\t// If value is a function, invoke it and return its value\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t\t};\n\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\t}\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" || jQuery.isArray(v) ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && obj != null && typeof obj === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( var name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar contents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields,\n\t\tct,\n\t\ttype,\n\t\tfinalDataType,\n\t\tfirstDataType;\n\n\t// Fill responseXXX fields\n\tfor( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\tvar dataTypes = s.dataTypes,\n\t\tconverters = {},\n\t\ti,\n\t\tkey,\n\t\tlength = dataTypes.length,\n\t\ttmp,\n\t\t// Current and previous dataTypes\n\t\tcurrent = dataTypes[ 0 ],\n\t\tprev,\n\t\t// Conversion expression\n\t\tconversion,\n\t\t// Conversion function\n\t\tconv,\n\t\t// Conversion functions (transitive conversion)\n\t\tconv1,\n\t\tconv2;\n\n\t// For each dataType in the chain\n\tfor( i = 1; i < length; i++ ) {\n\n\t\t// Create converters map\n\t\t// with lowercased keys\n\t\tif ( i === 1 ) {\n\t\t\tfor( key in s.converters ) {\n\t\t\t\tif( typeof key === \"string\" ) {\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get the dataTypes\n\t\tprev = current;\n\t\tcurrent = dataTypes[ i ];\n\n\t\t// If current is auto dataType, update it to prev\n\t\tif( current === \"*\" ) {\n\t\t\tcurrent = prev;\n\t\t// If no auto and dataTypes are actually different\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t// Get the converter\n\t\t\tconversion = prev + \" \" + current;\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\n\n\t\t\t// If there is no direct converter, search transitively\n\t\t\tif ( !conv ) {\n\t\t\t\tconv2 = undefined;\n\t\t\t\tfor( conv1 in converters ) {\n\t\t\t\t\ttmp = conv1.split( \" \" );\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\n\t\t\t\t\t\tif ( conv2 ) {\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\n\t\t\t\t\t\t\tif ( conv1 === true ) {\n\t\t\t\t\t\t\t\tconv = conv2;\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\n\t\t\t\t\t\t\t\tconv = conv1;\n\t\t\t\t\t\t\t}\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\t\t\t// If we found no converter, dispatch an error\n\t\t\tif ( !( conv || conv2 ) ) {\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n\t\t\t}\n\t\t\t// If found converter is not an equivalence\n\t\t\tif ( conv !== true ) {\n\t\t\t\t// Convert with 1 or 2 converters accordingly\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\n\t\t\t}\n\t\t}\n\t}\n\treturn response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar inspectData = s.contentType === \"application/x-www-form-urlencoded\" &&\n\t\t( typeof s.data === \"string\" );\n\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\n\n\t\tvar responseContainer,\n\t\t\tjsonpCallback = s.jsonpCallback =\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n\t\t\tprevious = window[ jsonpCallback ],\n\t\t\turl = s.url,\n\t\t\tdata = s.data,\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\n\n\t\tif ( s.jsonp !== false ) {\n\t\t\turl = url.replace( jsre, replace );\n\t\t\tif ( s.url === url ) {\n\t\t\t\tif ( inspectData ) {\n\t\t\t\t\tdata = data.replace( jsre, replace );\n\t\t\t\t}\n\t\t\t\tif ( s.data === data ) {\n\t\t\t\t\t// Add callback manually\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ts.url = url;\n\t\ts.data = data;\n\n\t\t// Install callback\n\t\twindow[ jsonpCallback ] = function( response ) {\n\t\t\tresponseContainer = [ response ];\n\t\t};\n\n\t\t// Clean-up function\n\t\tjqXHR.always(function() {\n\t\t\t// Set callback back to previous value\n\t\t\twindow[ jsonpCallback ] = previous;\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\n\t\t\t}\n\t\t});\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0,\n\txhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar xhr = s.xhr(),\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occured\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\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}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// if we're in sync mode or it's in cache\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\n\t\t\t\t\t// we need to manually fire the callback\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n\n\n\nvar elemdisplay = {},\n\tiframe, iframeDoc,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t],\n\tfxNow;\n\njQuery.fn.extend({\n\tshow: function( speed, easing, callback ) {\n\t\tvar elem, display;\n\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t\t\t// being hidden by cascaded rules or not\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set elements which have been overridden with display: none\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t\t\t// for such an element\n\t\t\t\t\tif ( display === \"none\" || ( display === \"\"  && jQuery.css( elem, \"display\" ) === \"none\" ) ) {\n\t\t\t\t\t\tjQuery._data(elem, \"olddisplay\", defaultDisplay(elem.nodeName));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of most of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\n\t\t\t\t\t\telem.style.display = jQuery._data(elem, \"olddisplay\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, easing, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tvar display = jQuery.css( this[i], \"display\" );\n\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( this[i], \"olddisplay\" ) ) {\n\t\t\t\t\t\tjQuery._data( this[i], \"olddisplay\", display );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tthis[i].style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2, callback ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, easing, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed( speed, easing, callback );\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete, [ false ] );\n\t\t}\n\n\t\t// Do not change referenced properties as per-property easing will be lost\n\t\tprop = jQuery.extend( {}, prop );\n\n\t\tfunction doAnimation() {\n\t\t\t// XXX 'this' does not always have a nodeName when running the\n\t\t\t// test suite\n\n\t\t\tif ( optall.queue === false ) {\n\t\t\t\tjQuery._mark( this );\n\t\t\t}\n\n\t\t\tvar opt = jQuery.extend( {}, optall ),\n\t\t\t\tisElement = this.nodeType === 1,\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\n\t\t\t\tname, val, p, e,\n\t\t\t\tparts, start, end, unit,\n\t\t\t\tmethod;\n\n\t\t\t// will store per property easing and be used to determine when an animation is complete\n\t\t\topt.animatedProperties = {};\n\n\t\t\tfor ( p in prop ) {\n\n\t\t\t\t// property name normalization\n\t\t\t\tname = jQuery.camelCase( p );\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t}\n\n\t\t\t\tval = prop[ name ];\n\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n\t\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\n\t\t\t\t} else {\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n\t\t\t\t}\n\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call( this );\n\t\t\t\t}\n\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\n\t\t\t\t\t// change the overflow attribute when overflowX and\n\t\t\t\t\t// overflowY are set to the same value\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n\t\t\t\t\t// Set display property to inline-block for height/width\n\t\t\t\t\t// animations on inline elements that are having width/height animated\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\n\n\t\t\t\t\t\t// inline-level elements accept inline-block;\n\t\t\t\t\t\t// block-level elements need to be inline with layout\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.style.zoom = 1;\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\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\te = new jQuery.fx( this, opt, p );\n\t\t\t\tval = prop[ p ];\n\n\t\t\t\tif ( rfxtypes.test( val ) ) {\n\n\t\t\t\t\t// Tracks whether to show or hide based on private\n\t\t\t\t\t// data attached to the element\n\t\t\t\t\tmethod = jQuery._data( this, \"toggle\" + p ) || (val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0);\n\t\t\t\t\tif ( method ) {\n\t\t\t\t\t\tjQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\n\t\t\t\t\t\te[ method ]();\n\t\t\t\t\t} else {\n\t\t\t\t\t\te[ val ]();\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tparts = rfxnum.exec( val );\n\t\t\t\t\tstart = e.cur();\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tend = parseFloat( parts[2] );\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\n\t\t\t\t\t\t\tstart = ((end || 1) / e.cur()) * start;\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t}\n\n\t\treturn optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar i,\n\t\t\t\thadTimers = false,\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\t// clear marker counters if we know they won't be\n\t\t\tif ( !gotoEnd ) {\n\t\t\t\tjQuery._unmark( true, this );\n\t\t\t}\n\n\t\t\tfunction stopQueue( elem, data, i ) {\n\t\t\t\tvar runner = data[ i ];\n\t\t\t\tjQuery.removeData( elem, i, true );\n\t\t\t\trunner.stop( gotoEnd );\n\t\t\t}\n\n\t\t\tif ( type == null ) {\n\t\t\t\tfor ( i in data ) {\n\t\t\t\t\tif ( data[ i ].stop && i.indexOf(\".run\") === i.length - 4 ) {\n\t\t\t\t\t\tstopQueue( this, data, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ( data[ i = type + \".run\" ] && data[ i ].stop ){\n\t\t\t\tstopQueue( this, data, i );\n\t\t\t}\n\n\t\t\tfor ( i = timers.length; i--; ) {\n\t\t\t\tif ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {\n\t\t\t\t\tif ( gotoEnd ) {\n\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[ i ]( true );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimers[ i ].saveState();\n\t\t\t\t\t}\n\t\t\t\t\thadTimers = true;\n\t\t\t\t\ttimers.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( !( gotoEnd && hadTimers ) ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout( clearFxNow, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n\tfxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx( \"show\", 1 ),\n\tslideUp: genFx( \"hide\", 1 ),\n\tslideToggle: genFx( \"toggle\", 1 ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\t\tif ( opt.queue == null || opt.queue === true ) {\n\t\t\topt.queue = \"fx\";\n\t\t}\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\n\t\topt.complete = function( noUnmark ) {\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\n\t\t\tif ( opt.queue ) {\n\t\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t\t} else if ( noUnmark !== false ) {\n\t\t\t\tjQuery._unmark( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p, n, firstNum, diff ) {\n\t\t\treturn firstNum + diff * p;\n\t\t},\n\t\tswing: function( p, n, firstNum, diff ) {\n\t\t\treturn ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\toptions.orig = options.orig || {};\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t(jQuery.fx.step[ this.prop ] || jQuery.fx.step._default)( this );\n\t},\n\n\t// Get the current size\n\tcur: function() {\n\t\tif ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar parsed,\n\t\t\tr = jQuery.css( this.elem, this.prop );\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\n\t\t// simple values such as \"10px\" are parsed to Float.\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tvar self = this,\n\t\t\tfx = jQuery.fx;\n\n\t\tthis.startTime = fxNow || createFxNow();\n\t\tthis.end = to;\n\t\tthis.now = this.start = from;\n\t\tthis.pos = this.state = 0;\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step( gotoEnd );\n\t\t}\n\n\t\tt.queue = this.options.queue;\n\t\tt.elem = this.elem;\n\t\tt.saveState = function() {\n\t\t\tif ( self.options.hide && jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\n\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\n\t\t\t}\n\t\t};\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\ttimerId = setInterval( fx.tick, fx.interval );\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\tvar dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\n\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any flash of content\n\t\tif ( dataShow !== undefined ) {\n\t\t\t// This show is picking up where a previous hide or show left off\n\t\t\tthis.custom( this.cur(), dataShow );\n\t\t} else {\n\t\t\tthis.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\n\t\t}\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom( this.cur(), 0 );\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar p, n, complete,\n\t\t\tt = fxNow || createFxNow(),\n\t\t\tdone = true,\n\t\t\telem = this.elem,\n\t\t\toptions = this.options;\n\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\toptions.animatedProperties[ this.prop ] = true;\n\n\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\tif ( options.animatedProperties[ p ] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\t// Reset the overflow\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[ index ];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( options.hide ) {\n\t\t\t\t\tjQuery( elem ).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( options.hide || options.show ) {\n\t\t\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[ p ] );\n\t\t\t\t\t\tjQuery.removeData( elem, \"fxshow\" + p, true );\n\t\t\t\t\t\t// Toggle data is no longer needed\n\t\t\t\t\t\tjQuery.removeData( elem, \"toggle\" + p, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\t// in the event that the complete function throws an exception\n\t\t\t\t// we must ensure it won't be called twice. #5684\n\n\t\t\t\tcomplete = options.complete;\n\t\t\t\tif ( complete ) {\n\n\t\t\t\t\toptions.complete = false;\n\t\t\t\t\tcomplete.call( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t// classical easing cannot be used with an Infinity duration\n\t\t\tif ( options.duration == Infinity ) {\n\t\t\t\tthis.now = t;\n\t\t\t} else {\n\t\t\t\tn = t - this.startTime;\n\t\t\t\tthis.state = n / options.duration;\n\n\t\t\t\t// Perform the easing function, defaults to swing\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\n\t\t\t\tthis.now = this.start + ( (this.end - this.start) * this.pos );\n\t\t\t}\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tvar timer,\n\t\t\ttimers = jQuery.timers,\n\t\t\ti = 0;\n\n\t\tfor ( ; i < timers.length; i++ ) {\n\t\t\ttimer = timers[ i ];\n\t\t\t// Checks the timer has not already been removed\n\t\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\t\ttimers.splice( i--, 1 );\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\n\tinterval: 13,\n\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\n\tspeeds: {\n\t\tslow: 600,\n\t\tfast: 200,\n\t\t// Default speed\n\t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = fx.now + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Adds width/height step functions\n// Do not set anything below 0\njQuery.each([ \"width\", \"height\" ], function( i, prop ) {\n\tjQuery.fx.step[ prop ] = function( fx ) {\n\t\tjQuery.style( fx.elem, prop, Math.max(0, fx.now) );\n\t};\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n\tif ( !elemdisplay[ nodeName ] ) {\n\n\t\tvar body = document.body,\n\t\t\telem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\n\t\t\tdisplay = elem.css( \"display\" );\n\n\t\telem.remove();\n\n\t\t// If the simple way fails,\n\t\t// get element's real default display by attaching it to a temp iframe\n\t\tif ( display === \"none\" || display === \"\" ) {\n\t\t\t// No iframe to use yet, so create it\n\t\t\tif ( !iframe ) {\n\t\t\t\tiframe = document.createElement( \"iframe\" );\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\n\t\t\t}\n\n\t\t\tbody.appendChild( iframe );\n\n\t\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\t\tiframeDoc.write( ( document.compatMode === \"CSS1Compat\" ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\n\t\t\t\tiframeDoc.close();\n\t\t\t}\n\n\t\t\telem = iframeDoc.createElement( nodeName );\n\n\t\t\tiframeDoc.body.appendChild( elem );\n\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t\tbody.removeChild( iframe );\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn elemdisplay[ nodeName ];\n}\n\n\n\n\nvar rtable = /^t(?:able|d|h)$/i,\n\trroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0], box;\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\ttry {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t} catch(e) {}\n\n\t\tvar doc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure we're not dealing with a disconnected DOM node\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n\t\t}\n\n\t\tvar body = doc.body,\n\t\t\twin = getWindow(doc),\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\n\t\t\tleft = box.left + scrollLeft - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0];\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\tvar computedStyle,\n\t\t\toffsetParent = elem.offsetParent,\n\t\t\tprevOffsetParent = elem,\n\t\t\tdoc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement,\n\t\t\tbody = doc.body,\n\t\t\tdefaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop,\n\t\t\tleft = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent;\n\t\t\t\toffsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.offset = {};\n\njQuery.each(\n\t( \"doesAddBorderForTableAndCells doesNotAddBorder \" +\n\t\t\"doesNotIncludeMarginInBodyOffset subtractsBorderForOverflowNotVisible \" +\n\t\t\"supportsFixedPosition\" ).split(\" \"), function( i, prop ) {\n\n\tjQuery.offset[ prop ] = jQuery.support[ prop ];\n});\n\njQuery.extend( jQuery.offset, {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = (position === \"absolute\" || position === \"fixed\") && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif (options.top != null) {\n\t\t\tprops.top = (options.top - curOffset.top) + curTop;\n\t\t}\n\t\tif (options.left != null) {\n\t\t\tprops.left = (options.left - curOffset.left) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n});\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( [\"Left\", \"Top\"], function( i, name ) {\n\tvar method = \"scroll\" + name;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\tvar elem, win;\n\n\t\tif ( val === undefined ) {\n\t\t\telem = this[ 0 ];\n\n\t\t\tif ( !elem ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\twin = getWindow( elem );\n\n\t\t\t// Return the scroll offset\n\t\t\treturn win ? (\"pageXOffset\" in win) ? win[ i ? \"pageYOffset\" : \"pageXOffset\" ] :\n\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\telem[ method ];\n\t\t}\n\n\t\t// Set the scroll offset\n\t\treturn this.each(function() {\n\t\t\twin = getWindow( this );\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!i ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t i ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\tthis[ method ] = val;\n\t\t\t}\n\t\t});\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\n\n\n\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each([ \"Height\", \"Width\" ], function( i, name ) {\n\n\tvar type = name.toLowerCase();\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[ \"inner\" + name ] = function() {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, \"padding\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[ \"outer\" + name ] = function( margin ) {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( size ) {\n\t\t// Get window width or height\n\t\tvar elem = this[0];\n\t\tif ( !elem ) {\n\t\t\treturn size == null ? null : this;\n\t\t}\n\n\t\tif ( jQuery.isFunction( size ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tvar self = jQuery( this );\n\t\t\t\tself[ type ]( size.call( this, i, self[ type ]() ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode\n\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n\t\t\tvar docElemProp = elem.document.documentElement[ \"client\" + name ],\n\t\t\t\tbody = elem.document.body;\n\t\t\treturn elem.document.compatMode === \"CSS1Compat\" && docElemProp ||\n\t\t\t\tbody && body[ \"client\" + name ] || docElemProp;\n\n\t\t// Get document width or height\n\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\treturn Math.max(\n\t\t\t\telem.documentElement[\"client\" + name],\n\t\t\t\telem.body[\"scroll\" + name], elem.documentElement[\"scroll\" + name],\n\t\t\t\telem.body[\"offset\" + name], elem.documentElement[\"offset\" + name]\n\t\t\t);\n\n\t\t// Get or set width or height on the element\n\t\t} else if ( size === undefined ) {\n\t\t\tvar orig = jQuery.css( elem, type ),\n\t\t\t\tret = parseFloat( orig );\n\n\t\t\treturn jQuery.isNumeric( ret ) ? ret : orig;\n\n\t\t// Set the width or height on the element (default to pixels if value is unitless)\n\t\t} else {\n\t\t\treturn this.css( type, typeof size === \"string\" ? size : size + \"px\" );\n\t\t}\n\t};\n\n});\n\n\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n})(window);\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/lib/jsonselect.js",
    "content": "/*! Copyright (c) 2011, Lloyd Hilaiel, ISC License */\n/*\n * This is the JSONSelect reference implementation, in javascript.\n */\n(function(exports) {\n\n    var // localize references\n    toString = Object.prototype.toString;\n\n    function jsonParse(str) {\n      try {\n          if(JSON && JSON.parse){\n              return JSON.parse(str);\n          }\n          return (new Function(\"return \" + str))();\n      } catch(e) {\n        te(\"ijs\");\n      }\n    }\n\n    // emitted error codes.\n    var errorCodes = {\n        \"ijs\": \"invalid json string\",\n        \"mpc\": \"multiple pseudo classes (:xxx) not allowed\",\n        \"mepf\": \"malformed expression in pseudo-function\",\n        \"nmi\": \"multiple ids not allowed\",\n        \"se\": \"selector expected\",\n        \"sra\": \"string required after '.'\",\n        \"uc\": \"unrecognized char\",\n        \"ujs\": \"unclosed json string\",\n        \"upc\": \"unrecognized pseudo class\"\n    };\n\n    // throw an error message\n    function te(ec) {\n        throw new Error(errorCodes[ec]);\n    }\n\n    // THE LEXER\n    var toks = {\n        psc: 1, // pseudo class\n        psf: 2, // pseudo class function\n        typ: 3, // type\n        str: 4 // string\n    };\n\n    var pat = /^(?:([\\r\\n\\t\\ ]+)|([*.,>])|(string|boolean|null|array|object|number)|(:(?:root|first-child|last-child|only-child))|(:(?:nth-child|nth-last-child))|(:\\w+)|(\\\"(?:[^\\\\]|\\\\[^\\\"])*\\\")|(\\\")|((?:[_a-zA-Z]|[^\\0-\\0177]|\\\\[^\\r\\n\\f0-9a-fA-F])(?:[_a-zA-Z0-9\\-]|[^\\u0000-\\u0177]|(?:\\\\[^\\r\\n\\f0-9a-fA-F]))*))/;\n    var exprPat = /^\\s*\\(\\s*(?:([+\\-]?)([0-9]*)n\\s*(?:([+\\-])\\s*([0-9]))?|(odd|even)|([+\\-]?[0-9]+))\\s*\\)/;\n    var lex = function (str, off) {\n        if (!off) off = 0;\n        var m = pat.exec(str.substr(off));\n        if (!m) return undefined;\n        off+=m[0].length;\n        var a;\n        if (m[1]) a = [off, \" \"];\n        else if (m[2]) a = [off, m[0]];\n        else if (m[3]) a = [off, toks.typ, m[0]];\n        else if (m[4]) a = [off, toks.psc, m[0]];\n        else if (m[5]) a = [off, toks.psf, m[0]];\n        else if (m[6]) te(\"upc\");\n        else if (m[7]) a = [off, toks.str, jsonParse(m[0])];\n        else if (m[8]) te(\"ujs\");\n        else if (m[9]) a = [off, toks.str, m[0].replace(/\\\\([^\\r\\n\\f0-9a-fA-F])/g,\"$1\")];\n        return a;\n    };\n\n    // THE PARSER\n\n    var parse = function (str) {\n        var a = [], off = 0, am;\n\n        while (true) {\n            var s = parse_selector(str, off);\n            a.push(s[1]);\n            s = lex(str, off = s[0]);\n            if (s && s[1] === \" \") s = lex(str, off = s[0]);\n            if (!s) break;\n            // now we've parsed a selector, and have something else...\n            if (s[1] === \">\") {\n                a.push(\">\");\n                off = s[0];\n            } else if (s[1] === \",\") {\n                if (am === undefined) am = [ \",\", a ];\n                else am.push(a);\n                a = [];\n                off = s[0];\n            }\n        }\n        if (am) am.push(a);\n        return am ? am : a;\n    };\n\n    var parse_selector = function(str, off) {\n        var soff = off;\n        var s = { };\n        var l = lex(str, off);\n        // skip space\n        if (l && l[1] === \" \") { soff = off = l[0]; l = lex(str, off); }\n        if (l && l[1] === toks.typ) {\n            s.type = l[2];\n            l = lex(str, (off = l[0]));\n        } else if (l && l[1] === \"*\") {\n            // don't bother representing the universal sel, '*' in the\n            // parse tree, cause it's the default\n            l = lex(str, (off = l[0]));\n        }\n\n        // now support either an id or a pc\n        while (true) {\n            if (l === undefined) {\n                break;\n            } else if (l[1] === \".\") {\n                l = lex(str, (off = l[0]));\n                if (!l || l[1] !== toks.str) te(\"sra\");\n                if (s.id) te(\"nmi\");\n                s.id = l[2];\n            } else if (l[1] === toks.psc) {\n                if (s.pc || s.pf) te(\"mpc\");\n                // collapse first-child and last-child into nth-child expressions\n                if (l[2] === \":first-child\") {\n                    s.pf = \":nth-child\";\n                    s.a = 0;\n                    s.b = 1;\n                } else if (l[2] === \":last-child\") {\n                    s.pf = \":nth-last-child\";\n                    s.a = 0;\n                    s.b = 1;\n                } else {\n                    s.pc = l[2];\n                }\n            } else if (l[1] === toks.psf) {\n                if (s.pc || s.pf ) te(\"mpc\");\n                s.pf = l[2];\n                var m = exprPat.exec(str.substr(l[0]));\n                if (!m) te(\"mepf\");\n                if (m[5]) {\n                    s.a = 2;\n                    s.b = (m[5] === \"odd\") ? 1 : 0;\n                } else if (m[6]) {\n                    s.a = 0;\n                    s.b = parseInt(m[6], 10);\n                } else {\n                    s.a = parseInt((m[1] ? m[1] : \"+\") + (m[2] ? m[2] : \"1\"),10);\n                    s.b = m[3] ? parseInt(m[3] + m[4],10) : 0;\n                }\n                l[0] += m[0].length;\n            } else {\n                break;\n            }\n            l = lex(str, (off = l[0]));\n        }\n\n        // now if we didn't actually parse anything it's an error\n        if (soff === off) te(\"se\");\n\n        return [off, s];\n    };\n\n    // THE EVALUATOR\n\n    function isArray(o) {\n        return Array.isArray ? Array.isArray(o) : \n          toString.call(o) === \"[object Array]\";\n    }\n\n    function mytypeof(o) {\n        if (o === null) return \"null\";\n        var to = typeof o;\n        if (to === \"object\" && isArray(o)) to = \"array\";\n        return to;\n    }\n\n    function mn(node, sel, id, num, tot) {\n        var sels = [];\n        var cs = (sel[0] === \">\") ? sel[1] : sel[0];\n        var m = true, mod;\n        if (cs.type) m = m && (cs.type === mytypeof(node));\n        if (cs.id)   m = m && (cs.id === id);\n        if (m && cs.pf) {\n            if (cs.pf === \":nth-last-child\") num = tot - num;\n            else num++;\n            if (cs.a === 0) {\n                m = cs.b === num;\n            } else {\n                mod = ((num - cs.b) % cs.a);\n\n                m = (!mod && ((num*cs.a + cs.b) >= 0));\n            }\n        }\n\n        // should we repeat this selector for descendants?\n        if (sel[0] !== \">\" && sel[0].pc !== \":root\") sels.push(sel);\n\n        if (m) {\n            // is there a fragment that we should pass down?\n            if (sel[0] === \">\") { if (sel.length > 2) { m = false; sels.push(sel.slice(2)); } }\n            else if (sel.length > 1) { m = false; sels.push(sel.slice(1)); }\n        }\n\n        return [m, sels];\n    }\n\n    function forEach(sel, obj, fun, id, num, tot) {\n        var a = (sel[0] === \",\") ? sel.slice(1) : [sel],\n        a0 = [],\n        call = false,\n        i = 0, j = 0, l = 0, k, x;\n        for (i = 0; i < a.length; i++) {\n            x = mn(obj, a[i], id, num, tot);\n            if (x[0]) {\n                call = true;\n            }\n            for (j = 0; j < x[1].length; j++) {\n                a0.push(x[1][j]);\n            }\n        }\n        if (a0.length && typeof obj === \"object\") {\n            if (a0.length >= 1) {\n                a0.unshift(\",\");\n            }\n            if (isArray(obj)) {\n                for (i = 0; i < obj.length; i++) {\n                    forEach(a0, obj[i], fun, undefined, i, obj.length);\n                }\n            } else {\n                // it's a shame to do this for :last-child and other\n                // properties which count from the end when we don't\n                // even know if they're present.  Also, the stream\n                // parser is going to be pissed.\n                l = 0;\n                for (k in obj) {\n                    if (obj.hasOwnProperty(k)) {\n                        l++;\n                    }\n                }\n                i = 0;\n                for (k in obj) {\n                    if (obj.hasOwnProperty(k)) {\n                        forEach(a0, obj[k], fun, k, i++, l);\n                    }\n                }\n            }\n        }\n        if (call && fun) {\n            fun(obj);\n        }\n    }\n\n    function match(sel, obj) {\n        var a = [];\n        forEach(sel, obj, function(x) {\n            a.push(x);\n        });\n        return a;\n    }\n\n    function compile(sel) {\n        return {\n            sel: parse(sel),\n            match: function(obj){\n                return match(this.sel, obj);\n            },\n            forEach: function(obj, fun) {\n                return forEach(this.sel, obj, fun);\n            }\n        };\n    }\n\n    exports._lex = lex;\n    exports._parse = parse;\n    exports.match = function (sel, obj) {\n        return compile(sel).match(obj);\n    };\n    exports.forEach = function(sel, obj, fun) {\n        return compile(sel).forEach(obj, fun);\n    };\n    exports.compile = compile;\n})(typeof exports === \"undefined\" ? (window.JSONSelect = {}) : exports);\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/lib/polyfills.js",
    "content": "\n// Array.prototype.indexOf  polyfill\nif (!Array.prototype.indexOf){\n  Array.prototype.indexOf = function(searchElement /*, fromIndex */)\n  {\n    \"use strict\";\n\n    if (this === void 0 || this === null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (len === 0)\n      return -1;\n\n    var n = 0;\n    if (arguments.length > 0)\n    {\n      n = Number(arguments[1]);\n      if (n !== n) // shortcut for verifying if it's NaN\n        n = 0;\n      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n\n    if (n >= len)\n      return -1;\n\n    var k = n >= 0\n          ? n\n          : Math.max(len - Math.abs(n), 0);\n\n    for (; k < len; k++)\n    {\n      if (k in t && t[k] === searchElement)\n        return k;\n    }\n    return -1;\n  };\n}\n\n\n// Object.keys()\nif (!Object.keys) Object.keys = function(o){\n  if (o !== Object(o)) throw new TypeError('Object.keys called on non-object');\n  var ret=[], p;\n  for (p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);\n  return ret;\n};\n\n\n\nif (!Array.prototype.map)\n{\n  Array.prototype.map = function(fun /*, thisp */)\n  {\n    \"use strict\";\n\n    if (this === void 0 || this === null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (typeof fun !== \"function\")\n      throw new TypeError();\n\n    var res = new Array(len);\n    var thisp = arguments[1];\n    for (var i = 0; i < len; i++)\n    {\n      if (i in t)\n        res[i] = fun.call(thisp, t[i], i, t);\n    }\n\n    return res;\n  };\n}\n\n\n\n\n/*!\n    http://www.JSON.org/json2.js\n    2011-10-19\n\n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    See http://www.JSON.org/js.html\n\n    This code should be minified before deployment.\n    See http://javascript.crockford.com/jsmin.html\n\n*/\nvar JSON;if(!JSON){JSON={}}(function(){function f(n){return n<10?\"0\"+n:n}if(typeof Date.prototype.toJSON!==\"function\"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+\"-\"+f(this.getUTCMonth()+1)+\"-\"+f(this.getUTCDate())+\"T\"+f(this.getUTCHours())+\":\"+f(this.getUTCMinutes())+\":\"+f(this.getUTCSeconds())+\"Z\":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'\"'+string.replace(escapable,function(a){var c=meta[a];return typeof c===\"string\"?c:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+string+'\"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value===\"object\"&&typeof value.toJSON===\"function\"){value=value.toJSON(key)}if(typeof rep===\"function\"){value=rep.call(holder,key,value)}switch(typeof value){case\"string\":return quote(value);case\"number\":return isFinite(value)?String(value):\"null\";case\"boolean\":case\"null\":return String(value);case\"object\":if(!value){return\"null\"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)===\"[object Array]\"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||\"null\"}v=partial.length===0?\"[]\":gap?\"[\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"]\":\"[\"+partial.join(\",\")+\"]\";gap=mind;return v}if(rep&&typeof rep===\"object\"){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]===\"string\"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}v=partial.length===0?\"{}\":gap?\"{\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"}\":\"{\"+partial.join(\",\")+\"}\";gap=mind;return v}}if(typeof JSON.stringify!==\"function\"){JSON.stringify=function(value,replacer,space){var i;gap=\"\";indent=\"\";if(typeof space===\"number\"){for(i=0;i<space;i+=1){indent+=\" \"}}else{if(typeof space===\"string\"){indent=space}}rep=replacer;if(replacer&&typeof replacer!==\"function\"&&(typeof replacer!==\"object\"||typeof replacer.length!==\"number\")){throw new Error(\"JSON.stringify\")}return str(\"\",{\"\":value})}}if(typeof JSON.parse!==\"function\"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value===\"object\"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\"))){j=eval(\"(\"+text+\")\");return typeof reviver===\"function\"?walk({\"\":j},\"\"):j}throw new SyntaxError(\"JSON.parse\")}}}());\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/lib/uaparser.js",
    "content": "// uaparser by lindsey simon,\n// ported to node by tobie\n// https://github.com/tobie/ua-parser/\n\n// browserized by paul irish\n\n(function(exports){\n\n  exports.uaparse = parse;\n  \n  function parse(ua) {\n    for (var i=0; i < parsers.length; i++) {\n      var result = parsers[i](ua);\n      if (result) { return result; }\n    }\n    return new UserAgent();\n  }\n\n  function UserAgent(family) {\n    this.family = family || 'Other';\n  }\n\n  UserAgent.prototype.toVersionString = function() {\n    var output = '';\n    if (this.major != null) {\n      output += this.major;\n      if (this.minor != null) {\n        output += '.' + this.minor;\n        if (this.patch != null) {\n          output += '.' + this.patch;\n        }\n      }\n    }\n    return output;\n  };\n\n  UserAgent.prototype.toString = function() {\n    var suffix = this.toVersionString();\n    if (suffix) { suffix = ' ' + suffix; }\n    return this.family + suffix;\n  };\n  \n  \n  var regexes = [\n      {\"pattern\":\"^(Opera)/(\\\\d+)\\\\.(\\\\d+) \\\\(Nintendo Wii\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Wii\"},\n      {\"pattern\":\"(Namoroka|Shiretoko|Minefield)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+(?:pre)?)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Firefox ($1)\"},\n      {\"pattern\":\"(Namoroka|Shiretoko|Minefield)/(\\\\d+)\\\\.(\\\\d+)([ab]\\\\d+[a-z]*)?\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Firefox ($1)\"},\n      {\"pattern\":\"(SeaMonkey|Fennec|Camino)/(\\\\d+)\\\\.(\\\\d+)([ab]?\\\\d+[a-z]*)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Flock)/(\\\\d+)\\\\.(\\\\d+)(b\\\\d+?)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Fennec)/(\\\\d+)\\\\.(\\\\d+)(pre)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Navigator)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Netscape\"},\n      {\"pattern\":\"(Navigator)/(\\\\d+)\\\\.(\\\\d+)([ab]\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Netscape\"},\n      {\"pattern\":\"(Netscape6)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Netscape\"},\n      {\"pattern\":\"(MyIBrow)/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"My Internet Browser\"},\n      {\"pattern\":\"(Firefox).*Tablet browser (\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"MicroB\"},\n      {\"pattern\":\"(Opera)/9.80.*Version\\\\/(\\\\d+)\\\\.(\\\\d+)(?:\\\\.(\\\\d+))?\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Firefox)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+(?:pre)?) \\\\(Swiftfox\\\\)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Swiftfox\"},\n      {\"pattern\":\"(Firefox)/(\\\\d+)\\\\.(\\\\d+)([ab]\\\\d+[a-z]*)? \\\\(Swiftfox\\\\)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Swiftfox\"},\n      {\"pattern\":\"(konqueror)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Konqueror\"},\n      {\"pattern\":\"(Jasmine|ANTGalio|Midori|Fresco|Lobo|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Vodafone|NetFront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|Iron|Iris)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Bolt|Jasmine|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Iron|Space Bison|Stainless|Orca)/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(iCab|Lunascape|Opera|Android) (\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(IEMobile) (\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"IE Mobile\"},\n      {\"pattern\":\"(Firefox)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Firefox)/(\\\\d+)\\\\.(\\\\d+)(pre|[ab]\\\\d+[a-z]*)?\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Obigo|OBIGO)[^\\\\d]*(\\\\d+)(?:.(\\\\d+))?\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Obigo\"},\n      {\"pattern\":\"(MAXTHON|Maxthon) (\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Maxthon\"},\n      {\"pattern\":\"(Maxthon|MyIE2|Uzbl|Shiira)\",\n       \"v1_replacement\":\"0\",\n       \"family_replacement\":null},\n      {\"pattern\":\"(PLAYSTATION) (\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"PlayStation\"},\n      {\"pattern\":\"(PlayStation Portable)[^\\\\d]+(\\\\d+).(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(BrowseX) \\\\((\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Opera)/(\\\\d+)\\\\.(\\\\d+).*Opera Mobi\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Opera Mobile\"},\n      {\"pattern\":\"(POLARIS)/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Polaris\"},\n      {\"pattern\":\"(BonEcho)/(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Bon Echo\"},\n      {\"pattern\":\"(iPhone) OS (\\\\d+)_(\\\\d+)(?:_(\\\\d+))?\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Avant)\",\n       \"v1_replacement\":\"1\",\n       \"family_replacement\":null},\n      {\"pattern\":\"(Nokia)[EN]?(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Black[bB]erry)(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Blackberry\"},\n      {\"pattern\":\"(OmniWeb)/v(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Blazer)/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Palm Blazer\"},\n      {\"pattern\":\"(Pre)/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Palm Pre\"},\n      {\"pattern\":\"(Links) \\\\((\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(QtWeb) Internet Browser/(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(Version)/(\\\\d+)\\\\.(\\\\d+)(?:\\\\.(\\\\d+))?.*Safari/\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Safari\"},\n      {\"pattern\":\"(OLPC)/Update(\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(OLPC)/Update()\\\\.(\\\\d+)\",\n       \"v1_replacement\":\"0\",\n       \"family_replacement\":null},\n      {\"pattern\":\"(SamsungSGHi560)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Samsung SGHi560\"},\n      {\"pattern\":\"^(SonyEricssonK800i)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"Sony Ericsson K800i\"},\n      {\"pattern\":\"(Teleca Q7)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":null},\n      {\"pattern\":\"(MSIE) (\\\\d+)\\\\.(\\\\d+)\",\n       \"v1_replacement\":null,\n       \"family_replacement\":\"IE\"}\n\n  ];\n  \n  var parsers = regexes.map(function(obj) {\n    var regexp = new RegExp(obj.pattern),\n        famRep = obj.family_replacement,\n        v1Rep = obj.v1_replacement;\n\n    function parser(ua) {\n      var m = ua.match(regexp);\n\n      if (!m) { return null; }\n\n      var familly = famRep ? famRep.replace('$1', m[1]) : m[1];\n\n      var obj = new UserAgent(familly);\n      obj.major = parseInt(v1Rep ? v1Rep : m[2]);\n      obj.minor = m[3] ? parseInt(m[3]) : null;\n      obj.patch = m[4] ? parseInt(m[4]) : null;\n\n      return obj;\n    }\n\n    return parser;\n  });\n  \n  \n})(window);\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/setup.js",
    "content": "\n// Avoid `console` errors in browsers that lack a console\nif (!(window.console && console.log)) {\n    (function() {\n        var noop = function() {};\n        var methods = ['assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 'markTimeline', 'profile', 'profileEnd', 'markTimeline', 'table', 'time', 'timeEnd', 'timeStamp', 'trace', 'warn'];\n        var length = methods.length;\n        var console = window.console = {};\n        while (length--) {\n            console[methods[length]] = noop;\n        }\n    }());\n}\n\n// test helper object\nwindow.TEST = {\n  // note some unique members of the Modernizr object\n  inputs    : ['input','inputtypes', 'textarea'],\n  audvid    : ['video','audio'],\n  API       : ['addTest', 'mq', 'hasEvent', 'testProp', 'testAllProps', 'testStyles', '_prefixes', '_domPrefixes', '_cssomPrefixes', 'prefixed'],\n  extraclass: ['js'],\n  privates  : ['_enableHTML5','_version','_fontfaceready'],\n  deprecated : [\n                { oldish : 'crosswindowmessaging', newish : 'postmessage'},\n                { oldish : 'historymanagement', newish : 'history'},\n              ],\n\n  // utility methods\n  inArray: function(elem, array) {\n      if (array.indexOf) {\n          return array.indexOf(elem);\n      }\n      for (var i = 0, length = array.length; i < length; i++) {\n          if (array[i] === elem) {\n              return i;\n          }\n      }\n      return -1;\n  },\n  trim : function(str){\n    return str.replace(/^\\s*/, \"\").replace(/\\s*$/, \"\");\n  }\n};\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/unit-caniuse.js",
    "content": "\n\nvar myscript = document.createElement('script'),\n    ref = document.getElementsByTagName('script')[0];\n\nmyscript.src = 'http://caniuse.com/jsonp.php?callback=caniusecb';\n\nsetTimeout(function(){\n  ref.parentNode.insertBefore(myscript, ref);\n}, 100);\n\n// mapping Modernizr terms over to caniuse terms\nvar map = {\n  audio : 'audio',\n  borderimage : 'border-image',\n  borderradius : 'border-radius',\n  canvas : 'canvas',\n  canvastext : 'canvas-text',\n  cssanimations : 'css-animation',\n  boxshadow : 'css-boxshadow',\n  cssgradients : 'css-gradients',\n  opacity : 'css-opacity',\n  cssreflections : 'css-reflections',\n  textshadow : 'css-textshadow',\n  csstransitions : 'css-transitions',\n  hsla : 'css3-colors',\n  rgba : 'css3-colors',\n  draganddrop : 'dragndrop',\n  flexbox : 'flexbox',\n  fontface : 'fontface',\n  geolocation : 'geolocation',\n  hashchange : 'hashchange',\n  history : 'history',\n  indexeddb : 'indexeddb',\n  multiplebgs : 'multibackgrounds',\n  csscolumns : 'multicolumn',\n  localstorage : 'namevalue-storage',\n  applicationcache : 'offline-apps',\n  websqldatabase : 'sql-storage',\n  svg : 'svg',\n  touch : 'touch',\n  csstransforms : 'transforms2d',\n  csstransforms3d : 'transforms3d',\n  video: 'video',\n  webgl: 'webgl',\n  websockets : 'websockets',\n  webworkers : 'webworkers',\n  postmessage : 'x-doc-messaging'\n};\n\nwindow.caniusecb = function(scriptdata) {\n\n  window.doo = scriptdata;\n\n  // quit if JSONSelect didn't make it.\n  if (!window.JSONSelect) return;\n\n  var testdata     = scriptdata.data,\n\n      // parse the current UA with uaparser\n      ua           = uaparse(navigator.userAgent),\n\n      // match the UA from uaparser into the browser used by caniuse\n      browserKey   = JSONSelect.match('.agents .browser', scriptdata).indexOf(ua.family),\n      currBrowser  = Object.keys(scriptdata.agents)[browserKey];\n\n  // So Phantom doesn't kill the caniuse.com matching exit out as it's useless anyway within PhantomJS\n  if(navigator.userAgent.indexOf(\"PhantomJS\") != -1) {\n    return;\n  }\n\n  // translate 'y' 'n' or 'a' into a boolean that Modernizr uses\n  function bool(ciuresult){\n    if (ciuresult == 'y' || ciuresult == 'a') return true;\n    // 'p' is for polyfill\n    if (ciuresult == 'n' || ciuresult == 'p') return false;\n    throw 'unknown return value from can i use';\n  }\n\n  function testify(o){\n\n    var ciubool = bool(o.ciuresult);\n\n    // caniuse says audio/video are yes/no, Modernizr has more detail which we'll dumb down.\n    if (~TEST.audvid.indexOf(o.feature))\n      o.result = !!o.result;\n\n    // if caniuse gave us a 'partial', lets let it pass with a note.\n    if (o.ciuresult == 'a'){\n      return ok(true,\n        o.browser + o.version + ': Caniuse reported partial support for ' + o.ciufeature +\n        '. So.. Modernizr\\'s ' + o.result + ' is good enough...'\n      );\n    }\n\n\n    // change the *documented* false positives\n    if ((o.feature == 'textshadow' && o.browser == 'firefox' && o.version == 3)\n        && ciubool == false\n    ) {\n      ciubool = o.fp = true;\n    }\n\n    // where we actually do most our assertions\n    equal(o.result, ciubool,\n      o.browser + o.version + ': Caniuse result for ' + o.ciufeature +\n      ' matches Modernizr\\'s ' + (o.fp ? '*false positive*' : 'result') + ' for ' + o.feature\n    );\n  }\n\n\n  module('caniuse.com data matches', {\n      setup:function() {\n      },\n      teardown:function() {\n      }\n  });\n\n\n  test(\"we match caniuse data\", function() {\n\n    for (var feature in Modernizr){\n\n      var ciufeatname = map[feature];\n\n      if (ciufeatname === undefined) continue;\n\n      var ciufeatdata = testdata[ciufeatname];\n\n      if (ciufeatdata === undefined) throw 'unknown key of caniusedata';\n\n      // get results for this feature for all versions of this browser\n      var browserResults = ciufeatdata.stats[currBrowser];\n\n      // let's get our versions in order..\n      var minorver   = ua.minor &&                                  // caniuse doesn't use two digit minors\n                       ua.minor.toString().replace(/(\\d)\\d$/,'$1'), // but opera does.\n\n          majorminor = (ua.major + '.' + minorver)\n                          // opera gets grouped in some cases by caniuse\n                          .replace(/(9\\.(6|5))/ , ua.family == 'opera' ? '9.5-9.6'   : \"$1\")\n                          .replace(/(10\\.(0|1))/, ua.family == 'opera' ? '10.0-10.1' : \"$1\"),\n\n          mmResult   = browserResults[majorminor],\n          mResult    = browserResults[ua.major];\n\n\n      // check it against the major.minor: eg. FF 3.6\n      if (mmResult && mmResult != 'u'){ // 'y' 'n' or 'a'\n\n        // data ends w/ ` x` if its still prefixed in the imp\n        mmResult = mmResult.replace(' x','');\n\n        // match it against our data.\n        testify({ feature     : feature\n                , ciufeature  : ciufeatname\n                , result      : Modernizr[feature]\n                , ciuresult   : mmResult\n                , browser     : currBrowser\n                , version     : majorminor\n        });\n\n        continue; // don't check the major version\n      }\n\n      // check it against just the major version: eg. FF 3\n      if (mResult){\n\n        // unknown support from caniuse... He would probably like to know our data, though!\n        if (mResult == 'u') continue;\n\n        // data ends w/ ` x` if its still prefixed in the imp\n        mResult = mResult.replace(' x','');\n\n        testify({ feature     : feature\n                , ciufeature  : ciufeatname\n                , result      : Modernizr[feature]\n                , ciuresult   : mResult\n                , browser     : currBrowser\n                , version     : ua.major\n        });\n\n\n      }\n\n    } // for in loop\n\n  }); // eo test()\n\n\n}; // eo caniusecallback()\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/js/unit.js",
    "content": "QUnit.begin = function() {\n\tconsole.log(\"Starting test suite\");\n\tconsole.log(\"================================================\\n\");\n};\n\nQUnit.moduleDone = function(opts) {\n\tif(opts.failed === 0) {\n\t\tconsole.log(\"\\u2714 All tests passed in '\"+opts.name+\"' module\");\n\t} else {\n\t\tconsole.log(\"\\u2716 \"+ opts.failed +\" tests failed in '\"+opts.name+\"' module\");\n\t}\n};\n\nQUnit.done = function(opts) {\n\tconsole.log(\"\\n================================================\");\n\tconsole.log(\"Tests completed in \"+opts.runtime+\" milliseconds\");\n\tconsole.log(opts.passed + \" tests of \"+opts.total+\" passed, \"+opts.failed+\" failed.\");\n};\n\nmodule('Basics', {\n    setup:function() {\n    },\n    teardown:function() {\n    }\n});\n\ntest(\"globals set up\", function() {\n\n\tok(window.Modernizr, 'global modernizr object created');\n\n});\n\ntest(\"bind is implemented\", function() {\n\n  ok(Function.prototype.bind, 'bind is a member of Function.prototype');\n\n  var a = function(){\n      return this.modernizr;\n  };\n  a = a.bind({modernizr: 'just awsome'});\n\n  equal(\"just awsome\", a(), 'bind works as expected');\n\n\n  // thank you webkit layoutTests\n\n\n  var result;\n\n  function F(x, y)\n  {\n      result = this + \" -> x:\" + x + \", y:\" + y;\n  }\n\n  G = F.bind(\"'a'\", \"'b'\");\n  H = G.bind(\"'Cannot rebind this!'\", \"'c'\");\n\n  G(1,2);\n  equal(result, \"\\'a\\' -> x:\\'b\\', y:1\");\n  H(1,2);\n  equal(result, \"\\'a\\' -> x:\\'b\\', y:\\'c\\'\");\n\n  var f = new F(1,2);\n  equal(result, \"[object Object] -> x:1, y:2\");\n  var g = new G(1,2);\n  equal(result, \"[object Object] -> x:\\'b\\', y:1\");\n  var h = new H(1,2);\n  equal(result, \"[object Object] -> x:\\'b\\', y:\\'c\\'\");\n\n  ok(f instanceof F, \"f instanceof F\");\n  ok(g instanceof F, \"g instanceof F\");\n  ok(h instanceof F, \"h instanceof F\");\n\n  // Bound functions don't have a 'prototype' property.\n  ok(\"prototype\" in F, '\"prototype\" in F');\n\n  // The object passed to bind as 'this' must be callable.\n  raises(function(){\n    Function.bind.call(undefined);\n  });\n\n  // Objects that allow call but not construct can be bound, but should throw if used with new.\n  var abcAt = String.prototype.charAt.bind(\"abc\");\n  equal(abcAt(1), \"b\", 'Objects that allow call but not construct can be bound...');\n\n  equal(1, Function.bind.length, 'it exists');\n\n\n});\n\n\n\ntest(\"document.documentElement is valid and correct\",1, function() {\n\tequal(document.documentElement,document.getElementsByTagName('html')[0]);\n});\n\n\ntest(\"no-js class is gone.\", function() {\n\n\tok(!/(?:^|\\s)no-js(?:^|\\s)/.test(document.documentElement.className),\n\t   'no-js class is gone');\n\n\tok(/(?:^|\\s)js(?:^|\\s)/.test(document.documentElement.className),\n\t   'html.js class is present');\n\n\tok(/(?:^|\\s)\\+no-js(?:\\s|$)/.test(document.documentElement.className),\n\t   'html.+no-js class is still present');\n\n\tok(/(?:^|\\s)no-js-(?:\\s|$)/.test(document.documentElement.className),\n\t   'html.no-js- class is still present');\n\n\tok(/(?:^|\\s)i-has-no-js(?:\\s|$)/.test(document.documentElement.className),\n\t   'html.i-has-no-js class is still present');\n\n\tif (document.querySelector){\n\t  ok(document.querySelector('html.js') == document.documentElement,\n\t     \"document.querySelector('html.js') matches.\");\n\t}\n});\n\ntest('html shim worked', function(){\n  expect(2);\n\n  // the exact test we use in the script\n  var elem = document.getElementsByTagName(\"section\")[0];\n  elem.id = \"html5section\";\n\n  ok( elem.childNodes.length === 1 , 'unknown elements dont collapse');\n\n  elem.style.color = 'red';\n  ok( /red|#ff0000/i.test(elem.style.color), 'unknown elements are styleable')\n\n});\n\n\nmodule('Modernizr classes and bools', {\n    setup:function() {\n    },\n    teardown:function() {\n    }\n});\n\n\ntest('html classes are looking good',function(){\n\n  var classes = TEST.trim(document.documentElement.className).split(/\\s+/);\n\n  var modprops = Object.keys(Modernizr),\n      newprops = modprops;\n\n  // decrement for the properties that are private\n  for (var i = -1, len = TEST.privates.length; ++i < len; ){\n    var item = TEST.privates[i];\n    equal(-1, TEST.inArray(item, classes), 'private Modernizr object '+ item +'should not have matching classes');\n    equal(-1, TEST.inArray('no-' + item, classes), 'private Modernizr object no-'+item+' should not have matching classes');\n  }\n\n  // decrement for the non-boolean objects\n//  for (var i = -1, len = TEST.inputs.length; ++i < len; ){\n//    if (Modernizr[TEST.inputs[i]] != undefined) newprops--;\n//  }\n\n  // TODO decrement for the extraclasses\n\n  // decrement for deprecated ones.\n  $.each( TEST.deprecated, function(key, val){\n    newprops.splice(  TEST.inArray(item, newprops), 1);\n  });\n\n\n  //equal(classes,newprops,'equal number of classes and global object props');\n\n  if (classes.length !== newprops){\n    //window.console && console.log(classes, newprops);\n\n  }\n\n  for (var i = 0, len = classes.length, aclass; i <len; i++){\n    aclass = classes[i];\n\n    // Skip js related classes.\n    if (/^(?:js|\\+no-js|no-js-|i-has-no-js)$/.test(aclass)) continue;\n\n    if (aclass.indexOf('no-') === 0){\n      aclass = aclass.replace('no-','');\n\n      equal(Modernizr[aclass], false,\n            aclass + ' is correctly false in the classes and object')\n\n    } else {\n      equal(Modernizr[aclass], true,\n             aclass + ' is correctly true in the classes and object')\n    }\n  }\n\n\n  for (var i = 0, len = classes.length, aclass; i <len; i++){\n    equal(classes[i],classes[i].toLowerCase(),'all classes are lowerCase.');\n  }\n\n  // Remove fake no-js classes before test.\n  var docElClass = document.documentElement.className;\n  $.each(['\\\\+no-js', 'no-js-', 'i-has-no-js'], function(i, fakeClass) {\n    docElClass = docElClass.replace(new RegExp('(^|\\\\s)' + fakeClass + '(\\\\s|$)', 'g'), '$1$2');\n  });\n  equal(/[^\\s]no-/.test(docElClass), false, 'whitespace between all classes.');\n\n\n})\n\n\ntest('Modernizr properties are looking good',function(){\n\n  var count  = 0,\n      nobool = TEST.API.concat(TEST.inputs)\n                       .concat(TEST.audvid)\n                       .concat(TEST.privates)\n                       .concat(['textarea']); // due to forms-placeholder.js test\n\n  for (var prop in window.Modernizr){\n    if (Modernizr.hasOwnProperty(prop)){\n\n      if (TEST.inArray(prop,nobool) >= 0) continue;\n\n      ok(Modernizr[prop] === true || Modernizr[prop] === false,\n        'Modernizr.'+prop+' is a straight up boolean');\n\n\n      equal(prop,prop.toLowerCase(),'all properties are lowerCase.')\n    }\n  }\n})\n\n\n\ntest('Modernizr.audio and Modernizr.video',function(){\n\n  for (var i = -1, len = TEST.audvid.length; ++i < len;){\n    var prop = TEST.audvid[i];\n\n    if (Modernizr[prop].toString() == 'true'){\n\n      ok(Modernizr[prop],                             'Modernizr.'+prop+' is truthy.');\n      equal(Modernizr[prop] == true,true,            'Modernizr.'+prop+' is == true')\n      equal(typeof Modernizr[prop] === 'object',true,'Moderizr.'+prop+' is truly an object');\n      equal(Modernizr[prop] !== true,true,           'Modernizr.'+prop+' is !== true')\n\n    } else {\n\n      equal(Modernizr[prop] != true,true,            'Modernizr.'+prop+' is != true')\n    }\n  }\n\n\n});\n\n\ntest('Modernizr results match expected values',function(){\n\n  // i'm bringing over a few tests from inside Modernizr.js\n  equal(!!document.createElement('canvas').getContext,Modernizr.canvas,'canvas test consistent');\n\n  equal(!!window.Worker,Modernizr.webworkers,'web workers test consistent')\n\n});\n\n\n\nmodule('Modernizr\\'s API methods', {\n    setup:function() {\n    },\n    teardown:function() {\n    }\n});\n\ntest('Modernizr.addTest()',22,function(){\n\n  var docEl = document.documentElement;\n\n\n  Modernizr.addTest('testtrue',function(){\n    return true;\n  });\n\n  Modernizr.addTest('testtruthy',function(){\n    return 100;\n  });\n\n  Modernizr.addTest('testfalse',function(){\n    return false;\n  });\n\n  Modernizr.addTest('testfalsy',function(){\n    return undefined;\n  });\n\n  ok(docEl.className.indexOf(' testtrue') >= 0,'positive class added');\n  equal(Modernizr.testtrue,true,'positive prop added');\n\n  ok(docEl.className.indexOf(' testtruthy') >= 0,'positive class added');\n  equal(Modernizr.testtruthy,100,'truthy value is not casted to straight boolean');\n\n  ok(docEl.className.indexOf(' no-testfalse') >= 0,'negative class added');\n  equal(Modernizr.testfalse,false,'negative prop added');\n\n  ok(docEl.className.indexOf(' no-testfalsy') >= 0,'negative class added');\n  equal(Modernizr.testfalsy,undefined,'falsy value is not casted to straight boolean');\n\n\n\n  Modernizr.addTest('testcamelCase',function(){\n     return true;\n   });\n\n  ok(docEl.className.indexOf(' testcamelCase') === -1,\n     'camelCase test name toLowerCase()\\'d');\n\n\n  // okay new signature for this API! woo\n\n  Modernizr.addTest('testboolfalse', false);\n\n  ok(~docEl.className.indexOf(' no-testboolfalse'), 'Modernizr.addTest(feature, bool): negative class added');\n  equal(Modernizr.testboolfalse, false, 'Modernizr.addTest(feature, bool): negative prop added');\n\n\n\n  Modernizr.addTest('testbooltrue', true);\n\n  ok(~docEl.className.indexOf(' testbooltrue'), 'Modernizr.addTest(feature, bool): positive class added');\n  equal(Modernizr.testbooltrue, true, 'Modernizr.addTest(feature, bool): positive prop added');\n\n\n\n  Modernizr.addTest({'testobjboolfalse': false,\n                     'testobjbooltrue' : true   });\n\n  ok(~docEl.className.indexOf(' no-testobjboolfalse'), 'Modernizr.addTest({feature: bool}): negative class added');\n  equal(Modernizr.testobjboolfalse, false, 'Modernizr.addTest({feature: bool}): negative prop added');\n\n  ok(~docEl.className.indexOf(' testobjbooltrue'), 'Modernizr.addTest({feature: bool}): positive class added');\n  equal(Modernizr.testobjbooltrue, true, 'Modernizr.addTest({feature: bool}): positive prop added');\n\n\n\n\n  Modernizr.addTest({'testobjfnfalse': function(){ return false },\n                     'testobjfntrue' : function(){ return true }   });\n\n\n  ok(~docEl.className.indexOf(' no-testobjfnfalse'), 'Modernizr.addTest({feature: bool}): negative class added');\n  equal(Modernizr.testobjfnfalse, false, 'Modernizr.addTest({feature: bool}): negative prop added');\n\n  ok(~docEl.className.indexOf(' testobjfntrue'), 'Modernizr.addTest({feature: bool}): positive class added');\n  equal(Modernizr.testobjfntrue, true, 'Modernizr.addTest({feature: bool}): positive prop added');\n\n\n  Modernizr\n    .addTest('testchainone', true)\n    .addTest({ testchaintwo: true })\n    .addTest('testchainthree', function(){ return true; });\n\n  ok( Modernizr.testchainone == Modernizr.testchaintwo == Modernizr.testchainthree, 'addTest is chainable');\n\n\n}); // eo addTest\n\n\n\n\n\ntest('Modernizr.mq: media query testing',function(){\n\n  var $html = $('html');\n  $.mobile = {};\n\n  // from jquery mobile\n\n  $.mobile.media = (function() {\n  \t// TODO: use window.matchMedia once at least one UA implements it\n  \tvar cache = {},\n  \t\ttestDiv = $( \"<div id='jquery-mediatest'>\" ),\n  \t\tfakeBody = $( \"<body>\" ).append( testDiv );\n\n  \treturn function( query ) {\n  \t\tif ( !( query in cache ) ) {\n  \t\t\tvar styleBlock = document.createElement('style'),\n          \t\tcssrule = \"@media \" + query + \" { #jquery-mediatest { position:absolute; } }\";\n  \t        //must set type for IE!\n  \t        styleBlock.type = \"text/css\";\n  \t        if (styleBlock.styleSheet){\n  \t          styleBlock.styleSheet.cssText = cssrule;\n  \t        }\n  \t        else {\n  \t          styleBlock.appendChild(document.createTextNode(cssrule));\n  \t        }\n\n  \t\t\t$html.prepend( fakeBody ).prepend( styleBlock );\n  \t\t\tcache[ query ] = testDiv.css( \"position\" ) === \"absolute\";\n  \t\t\tfakeBody.add( styleBlock ).remove();\n  \t\t}\n  \t\treturn cache[ query ];\n  \t};\n  })();\n\n\n  ok(Modernizr.mq,'Modernizr.mq() doesn\\' freak out.');\n\n  equal($.mobile.media('only screen'), Modernizr.mq('only screen'),'screen media query matches jQuery mobile\\'s result');\n\n  equal(Modernizr.mq('only all'), Modernizr.mq('only all'), 'Cache hit matches');\n\n\n});\n\n\n\n\ntest('Modernizr.hasEvent()',function(){\n\n  ok(typeof Modernizr.hasEvent == 'function','Modernizr.hasEvent() is a function');\n\n\n  equal(Modernizr.hasEvent('click'), true,'click event is supported');\n\n  equal(Modernizr.hasEvent('modernizrcustomevent'), false,'random event is definitely not supported');\n\n  /* works fine in webkit but not gecko\n  equal(  Modernizr.hasEvent('resize', window),\n          !Modernizr.hasEvent('resize', document.createElement('div')),\n          'Resize is supported in window but not a div, typically...');\n  */\n\n});\n\n\n\n\n\ntest('Modernizr.testStyles()',function(){\n\n  equal(typeof Modernizr.testStyles, 'function','Modernizr.testStyles() is a function');\n\n  var style = '#modernizr{ width: 9px; height: 4px; font-size: 0; color: papayawhip; }';\n\n  Modernizr.testStyles(style, function(elem, rule){\n      equal(style, rule, 'rule passsed back matches what i gave it.')\n      equal(elem.offsetWidth, 9, 'width was set through the style');\n      equal(elem.offsetHeight, 4, 'height was set through the style');\n      equal(elem.id, 'modernizr', 'element is indeed the modernizr element');\n  });\n\n});\n\n\ntest('Modernizr._[properties]',function(){\n\n  equal(6, Modernizr._prefixes.length, 'Modernizr._prefixes has 6 items');\n\n  equal(4, Modernizr._domPrefixes.length, 'Modernizr.domPrefixes has 4 items');\n\n});\n\ntest('Modernizr.testProp()',function(){\n\n  equal(true, Modernizr.testProp('margin'), 'Everyone supports margin');\n\n  equal(false, Modernizr.testProp('happiness'), 'Nobody supports the happiness style. :(');\n  equal(true, Modernizr.testProp('fontSize'), 'Everyone supports fontSize');\n  equal(false, Modernizr.testProp('font-size'), 'Nobody supports font-size');\n\n  equal('pointerEvents' in  document.createElement('div').style,\n         Modernizr.testProp('pointerEvents'),\n         'results for `pointer-events` are consistent with a homegrown feature test');\n\n});\n\n\n\ntest('Modernizr.testAllProps()',function(){\n\n  equal(true, Modernizr.testAllProps('margin'), 'Everyone supports margin');\n\n  equal(false, Modernizr.testAllProps('happiness'), 'Nobody supports the happiness style. :(');\n  equal(true, Modernizr.testAllProps('fontSize'), 'Everyone supports fontSize');\n  equal(false, Modernizr.testAllProps('font-size'), 'Nobody supports font-size');\n\n  equal(Modernizr.csstransitions, Modernizr.testAllProps('transition'), 'Modernizr result matches API result: csstransitions');\n\n  equal(Modernizr.csscolumns, Modernizr.testAllProps('columnCount'), 'Modernizr result matches API result: csscolumns')\n\n});\n\n\n\n\n\n\ntest('Modernizr.prefixed() - css and DOM resolving', function(){\n  // https://gist.github.com/523692\n\n  function gimmePrefix(prop, obj){\n    var prefixes = ['Moz','Khtml','Webkit','O','ms'],\n        domPrefixes = ['moz','khtml','webkit','o','ms'],\n        elem     = document.createElement('div'),\n        upper    = prop.charAt(0).toUpperCase() + prop.slice(1);\n\n    if(!obj) {\n      if (prop in elem.style)\n        return prop;\n\n      for (var len = prefixes.length; len--; ){\n        if ((prefixes[len] + upper)  in elem.style)\n          return (prefixes[len] + upper);\n      }\n    } else {\n      if (prop in obj)\n        return prop;\n\n      for (var len = domPrefixes.length; len--; ){\n        if ((domPrefixes[len] + upper)  in obj)\n          return (domPrefixes[len] + upper);\n      }\n    }\n\n\n    return false;\n  }\n\n  var propArr = ['transition', 'backgroundSize', 'boxSizing', 'borderImage',\n                 'borderRadius', 'boxShadow', 'columnCount'];\n\n  var domPropArr = [{ 'prop': 'requestAnimationFrame',  'obj': window },\n                    { 'prop': 'querySelectorAll',       'obj': document },\n                    { 'prop': 'matchesSelector',        'obj': document.createElement('div') }];\n\n  for (var i = -1, len = propArr.length; ++i < len; ){\n    var prop = propArr[i];\n    equal(Modernizr.prefixed(prop), gimmePrefix(prop), 'results for ' + prop + ' match the homebaked prefix finder');\n  }\n\n  for (var i = -1, len = domPropArr.length; ++i < len; ){\n    var prop = domPropArr[i];\n    ok(!!~Modernizr.prefixed(prop.prop, prop.obj, false).toString().indexOf(gimmePrefix(prop.prop, prop.obj)), 'results for ' + prop.prop + ' match the homebaked prefix finder');\n  }\n\n\n\n\n});\n\n\n// FIXME: so a few of these are whitelisting for webkit. i'd like to improve that.\ntest('Modernizr.prefixed autobind', function(){\n\n  var rAFName;\n\n  // quick sniff to find the local rAF prefixed name.\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n  for(var x = 0; x < vendors.length && !rAFName; ++x) {\n    rAFName = window[vendors[x]+'RequestAnimationFrame'] && vendors[x]+'RequestAnimationFrame';\n  }\n\n  if (rAFName){\n    // rAF returns a function\n    equal(\n      'function',\n      typeof Modernizr.prefixed('requestAnimationFrame', window),\n      \"Modernizr.prefixed('requestAnimationFrame', window) returns a function\")\n\n    // unless we false it to a string\n    equal(\n      rAFName,\n      Modernizr.prefixed('requestAnimationFrame', window, false),\n      \"Modernizr.prefixed('requestAnimationFrame', window, false) returns a string (the prop name)\")\n\n  }\n\n  if (document.body.webkitMatchesSelector || document.body.mozMatchesSelector){\n\n    var fn = Modernizr.prefixed('matchesSelector', HTMLElement.prototype, document.body);\n\n    //returns function\n    equal(\n      'function',\n      typeof fn,\n      \"Modernizr.prefixed('matchesSelector', HTMLElement.prototype, document.body) returns a function\");\n\n      // fn scoping\n    equal(\n      true,\n      fn('body'),\n      \"Modernizr.prefixed('matchesSelector', HTMLElement.prototype, document.body) is scoped to the body\")\n\n  }\n\n  // Webkit only: are there other objects that are prefixed?\n  if (window.webkitNotifications){\n    // should be an object.\n\n    equal(\n      'object',\n      typeof Modernizr.prefixed('Notifications', window),\n      \"Modernizr.prefixed('Notifications') returns an object\");\n\n  }\n\n  // Webkit only:\n  if (typeof document.webkitIsFullScreen !== 'undefined'){\n    // boolean\n\n    equal(\n      'boolean',\n      typeof Modernizr.prefixed('isFullScreen', document),\n      \"Modernizr.prefixed('isFullScreen') returns a boolean\");\n  }\n\n\n\n  // Moz only:\n  if (typeof document.mozFullScreen !== 'undefined'){\n    // boolean\n\n    equal(\n      'boolean',\n      typeof Modernizr.prefixed('fullScreen', document),\n      \"Modernizr.prefixed('fullScreen') returns a boolean\");\n  }\n\n\n  // Webkit-only.. takes advantage of Webkit's mixed case of prefixes\n  if (document.body.style.WebkitAnimation){\n    // string\n\n    equal(\n      'string',\n      typeof Modernizr.prefixed('animation', document.body.style),\n      \"Modernizr.prefixed('animation', document.body.style) returns value of that, as a string\");\n\n    equal(\n      animationStyle.toLowerCase(),\n      Modernizr.prefixed('animation', document.body.style, false).toLowerCase(),\n      \"Modernizr.prefixed('animation', document.body.style, false) returns the (case-normalized) name of the property: webkitanimation\");\n\n  }\n\n  equal(\n    false,\n    Modernizr.prefixed('doSomethingAmazing$#$', window),\n    \"Modernizr.prefixed('doSomethingAmazing$#$', window) : Gobbledygook with prefixed(str,obj) returns false\");\n\n  equal(\n    false,\n    Modernizr.prefixed('doSomethingAmazing$#$', window, document.body),\n    \"Modernizr.prefixed('doSomethingAmazing$#$', window) : Gobbledygook with prefixed(str,obj, scope) returns false\");\n\n\n  equal(\n    false,\n    Modernizr.prefixed('doSomethingAmazing$#$', window, false),\n    \"Modernizr.prefixed('doSomethingAmazing$#$', window) : Gobbledygook with prefixed(str,obj, false) returns false\");\n\n\n});\n\n\n\n\n\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/qunit/qunit.css",
    "content": "/**\n * QUnit v1.9.0 - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, Jörn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699a4;\n\tbackground-color: #0d3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: normal;\n\n\tborder-radius: 5px 5px 0 0;\n\t-moz-border-radius: 5px 5px 0 0;\n\t-webkit-border-top-right-radius: 5px;\n\t-webkit-border-top-left-radius: 5px;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #c2ccd1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #fff;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n\tpadding: 0 .5em 0 .1em;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 0 0.5em 2em;\n\tcolor: #5E740B;\n\tbackground-color: #eee;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 0 0.5em 2.5em;\n\tbackground-color: #2b81af;\n\tcolor: #fff;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 0.5em 0.4em 2.5em;\n\tborder-bottom: 1px solid #fff;\n\tlist-style-position: inside;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {\n\tdisplay: none;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #c2ccd1;\n\ttext-decoration: none;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests ol {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 5px;\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: .2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 .5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #e0f2be;\n\tcolor: #374e0c;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #ffcaca;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: black; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #fff;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3c510c;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n\t-moz-border-radius: 0 0 5px 5px;\n\t-webkit-border-bottom-right-radius: 5px;\n\t-webkit-border-bottom-left-radius: 5px;\n}\n\n#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: green;   }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 0.5em 0.5em 2.5em;\n\n\tcolor: #2b81af;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid white;\n}\n#qunit-testresult .module-name {\n\tfont-weight: bold;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/qunit/qunit.js",
    "content": "/**\n * QUnit v1.9.0 - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, Jörn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n(function( window ) {\n\nvar QUnit,\n\tconfig,\n\tonErrorFnPrev,\n\ttestId = 0,\n\tfileName = (sourceFromStacktrace( 0 ) || \"\" ).replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\"),\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tdefined = {\n\tsetTimeout: typeof window.setTimeout !== \"undefined\",\n\tsessionStorage: (function() {\n\t\tvar x = \"qunit-test-string\";\n\t\ttry {\n\t\t\tsessionStorage.setItem( x, x );\n\t\t\tsessionStorage.removeItem( x );\n\t\t\treturn true;\n\t\t} catch( e ) {\n\t\t\treturn false;\n\t\t}\n\t}())\n};\n\nfunction Test( settings ) {\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.testNumber = ++Test.count;\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tinit: function() {\n\t\tvar a, b, li,\n        tests = id( \"qunit-tests\" );\n\n\t\tif ( tests ) {\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.name;\n\n\t\t\t// `a` initialized at top of scope\n\t\t\ta = document.createElement( \"a\" );\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ testNumber: this.testNumber });\n\n\t\t\tli = document.createElement( \"li\" );\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.className = \"running\";\n\t\t\tli.id = this.id = \"qunit-test-output\" + testId++;\n\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif ( this.module !== config.previousModule ) {\n\t\t\tif ( config.previousModule ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\t\t\tname: config.previousModule,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all\n\t\t\t\t});\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t} else if ( config.autorun ) {\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment );\n\n\t\trunLoggingCallbacks( \"testStart\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module\n\t\t});\n\n\t\t// allow utility functions to access the current test environment\n\t\t// TODO why??\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Setup failed on \" + this.testName + \": \" + e.message, extractStacktrace( e, 1 ) );\n\t\t}\n\t},\n\trun: function() {\n\t\tconfig.current = this;\n\n\t\tvar running = id( \"qunit-testresult\" );\n\n\t\tif ( running ) {\n\t\t\trunning.innerHTML = \"Running: <br/>\" + this.name;\n\t\t}\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + e.message, extractStacktrace( e, 0 ) );\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\t},\n\tteardown: function() {\n\t\tconfig.current = this;\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\treturn;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\t} catch( e ) {\n\t\t\t\tQUnit.pushFailure( \"Teardown failed on \" + this.testName + \": \" + e.message, extractStacktrace( e, 1 ) );\n\t\t\t}\n\t\t}\n\t\tcheckPollution();\n\t},\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected == null ) {\n\t\t\tQUnit.pushFailure( \"Expected number of assertions to be defined, but expect() was not called.\", this.stack );\n\t\t} else if ( this.expected != null && this.expected != this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected == null && !this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar assertion, a, b, i, li, ol,\n\t\t\ttest = this,\n\t\t\tgood = 0,\n\t\t\tbad = 0,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tol = document.createElement( \"ol\" );\n\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tassertion = this.assertions[i];\n\n\t\t\t\tli = document.createElement( \"li\" );\n\t\t\t\tli.className = assertion.result ? \"pass\" : \"fail\";\n\t\t\t\tli.innerHTML = assertion.message || ( assertion.result ? \"okay\" : \"failed\" );\n\t\t\t\tol.appendChild( li );\n\n\t\t\t\tif ( assertion.result ) {\n\t\t\t\t\tgood++;\n\t\t\t\t} else {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store result when possible\n\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n\t\t\t\tif ( bad ) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-test-\" + this.module + \"-\" + this.testName, bad );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( bad === 0 ) {\n\t\t\t\tol.style.display = \"none\";\n\t\t\t}\n\n\t\t\t// `b` initialized at top of scope\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.name + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.nextSibling.nextSibling,\n\t\t\t\t\tdisplay = next.style.display;\n\t\t\t\tnext.style.display = display === \"none\" ? \"block\" : \"none\";\n\t\t\t});\n\n\t\t\taddEvent(b, \"dblclick\", function( e ) {\n\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n\t\t\t\tif ( target.nodeName.toLowerCase() == \"span\" || target.nodeName.toLowerCase() == \"b\" ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === \"strong\" ) {\n\t\t\t\t\twindow.location = QUnit.url({ testNumber: test.testNumber });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// `li` initialized at top of scope\n\t\t\tli = id( this.id );\n\t\t\tli.className = bad ? \"fail\" : \"pass\";\n\t\t\tli.removeChild( li.firstChild );\n\t\t\ta = li.firstChild;\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild ( a );\n\t\t\tli.appendChild( ol );\n\n\t\t} else {\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tif ( !this.assertions[i].result ) {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length\n\t\t});\n\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar bad,\n\t\t\ttest = this;\n\n\t\tsynchronize(function() {\n\t\t\ttest.init();\n\t\t});\n\t\tfunction run() {\n\t\t\t// each of these can by async\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.setup();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.run();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.teardown();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.finish();\n\t\t\t});\n\t\t}\n\n\t\t// `bad` initialized at top of scope\n\t\t// defer when previous test run passed, if storage is available\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\n\t\tif ( bad ) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize( run, true );\n\t\t}\n\t}\n};\n\n// Root QUnit object.\n// `QUnit` initialized at top of scope\nQUnit = {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment ) {\n\t\tconfig.currentModule = name;\n\t\tconfig.currentModuleTestEnviroment = testEnvironment;\n\t},\n\n\tasyncTest: function( testName, expected, callback ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tQUnit.test( testName, expected, callback, true );\n\t},\n\n\ttest: function( testName, expected, callback, async ) {\n\t\tvar test,\n\t\t\tname = \"<span class='test-name'>\" + escapeInnerText( testName ) + \"</span>\";\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tif ( config.currentModule ) {\n\t\t\tname = \"<span class='module-name'>\" + config.currentModule + \"</span>: \" + name;\n\t\t}\n\n\t\ttest = new Test({\n\t\t\tname: name,\n\t\t\ttestName: testName,\n\t\t\texpected: expected,\n\t\t\tasync: async,\n\t\t\tcallback: callback,\n\t\t\tmodule: config.currentModule,\n\t\t\tmoduleTestEnvironment: config.currentModuleTestEnviroment,\n\t\t\tstack: sourceFromStacktrace( 2 )\n\t\t});\n\n\t\tif ( !validTest( test ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttest.queue();\n\t},\n\n\t// Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tconfig.current.expected = asserts;\n\t},\n\n\tstart: function( count ) {\n\t\tconfig.semaphore -= count || 1;\n\t\t// don't start until equal number of stop-calls\n\t\tif ( config.semaphore > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t// ignore if start is called more often then stop\n\t\tif ( config.semaphore < 0 ) {\n\t\t\tconfig.semaphore = 0;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tif ( config.semaphore > 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( config.timeout ) {\n\t\t\t\t\tclearTimeout( config.timeout );\n\t\t\t\t}\n\n\t\t\t\tconfig.blocking = false;\n\t\t\t\tprocess( true );\n\t\t\t}, 13);\n\t\t} else {\n\t\t\tconfig.blocking = false;\n\t\t\tprocess( true );\n\t\t}\n\t},\n\n\tstop: function( count ) {\n\t\tconfig.semaphore += count || 1;\n\t\tconfig.blocking = true;\n\n\t\tif ( config.testTimeout && defined.setTimeout ) {\n\t\t\tclearTimeout( config.timeout );\n\t\t\tconfig.timeout = window.setTimeout(function() {\n\t\t\t\tQUnit.ok( false, \"Test timed out\" );\n\t\t\t\tconfig.semaphore = 1;\n\t\t\t\tQUnit.start();\n\t\t\t}, config.testTimeout );\n\t\t}\n\t}\n};\n\n// Asssert helpers\n// All of these must call either QUnit.push() or manually do:\n// - runLoggingCallbacks( \"log\", .. );\n// - config.current.assertions.push({ .. });\nQUnit.assert = {\n\t/**\n\t * Asserts rough true-ish result.\n\t * @name ok\n\t * @function\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function( result, msg ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"ok() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\t\tresult = !!result;\n\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tresult: result,\n\t\t\t\tmessage: msg\n\t\t\t};\n\n\t\tmsg = escapeInnerText( msg || (result ? \"okay\" : \"failed\" ) );\n\t\tmsg = \"<span class='test-message'>\" + msg + \"</span>\";\n\n\t\tif ( !result ) {\n\t\t\tsource = sourceFromStacktrace( 2 );\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\tmsg += \"<table><tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr></table>\";\n\t\t\t}\n\t\t}\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\t\tconfig.current.assertions.push({\n\t\t\tresult: result,\n\t\t\tmessage: msg\n\t\t});\n\t},\n\n\t/**\n\t * Assert that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t * @name equal\n\t * @function\n\t * @example equal( format( \"Received {0} bytes.\", 2), \"Received 2 bytes.\", \"format() replaces {0} with next argument\" );\n\t */\n\tequal: function( actual, expected, message ) {\n\t\tQUnit.push( expected == actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notEqual\n\t * @function\n\t */\n\tnotEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected != actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name deepEqual\n\t * @function\n\t */\n\tdeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notDeepEqual\n\t * @function\n\t */\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name strictEqual\n\t * @function\n\t */\n\tstrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected === actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notStrictEqual\n\t * @function\n\t */\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected !== actual, actual, expected, message );\n\t},\n\n\tthrows: function( block, expected, message ) {\n\t\tvar actual,\n\t\t\tok = false;\n\n\t\t// 'expected' is optional\n\t\tif ( typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tconfig.current.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( config.current.testEnvironment );\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\t\tconfig.current.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\t// we don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a regexp\n\t\t\t} else if ( QUnit.objectType( expected ) === \"regexp\" ) {\n\t\t\t\tok = expected.test( actual );\n\t\t\t// expected is a constructor\n\t\t\t} else if ( actual instanceof expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a validation function which returns true is validation passed\n\t\t\t} else if ( expected.call( {}, actual ) === true ) {\n\t\t\t\tok = true;\n\t\t\t}\n\n\t\t\tQUnit.push( ok, actual, null, message );\n\t\t} else {\n\t\t\tQUnit.pushFailure( message, null, 'No exception was thrown.' );\n\t\t}\n\t}\n};\n\n/**\n * @deprecate since 1.8.0\n * Kept assertion helpers in root for backwards compatibility\n */\nextend( QUnit, QUnit.assert );\n\n/**\n * @deprecated since 1.9.0\n * Kept global \"raises()\" for backwards compatibility\n */\nQUnit.raises = QUnit.assert.throws;\n\n/**\n * @deprecated since 1.0.0, replaced with error pushes since 1.3.0\n * Kept to avoid TypeErrors for undefined methods.\n */\nQUnit.equals = function() {\n\tQUnit.push( false, false, false, \"QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead\" );\n};\nQUnit.same = function() {\n\tQUnit.push( false, false, false, \"QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead\" );\n};\n\n// We want access to the constructor's prototype\n(function() {\n\tfunction F() {}\n\tF.prototype = QUnit;\n\tQUnit = new F();\n\t// Make F QUnit's constructor so that we can add to the prototype later\n\tQUnit.constructor = F;\n}());\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nconfig = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// when enabled, show only failing tests\n\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n\thidepassed: false,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// when enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// add checkboxes that are persisted in the query-string\n\t// when enabled, the id is set to `true` as a `QUnit.config` property\n\turlConfig: [\n\t\t{\n\t\t\tid: \"noglobals\",\n\t\t\tlabel: \"Check for Globals\",\n\t\t\ttooltip: \"Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"notrycatch\",\n\t\t\tlabel: \"No try-catch\",\n\t\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings.\"\n\t\t}\n\t],\n\n\t// logging callback queues\n\tbegin: [],\n\tdone: [],\n\tlog: [],\n\ttestStart: [],\n\ttestDone: [],\n\tmoduleStart: [],\n\tmoduleDone: []\n};\n\n// Initialize more QUnit.config and QUnit.urlParams\n(function() {\n\tvar i,\n\t\tlocation = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {},\n\t\tcurrent;\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t}\n\t}\n\n\tQUnit.urlParams = urlParams;\n\n\t// String search anywhere in moduleName+testName\n\tconfig.filter = urlParams.filter;\n\n\t// Exact match of the module name\n\tconfig.module = urlParams.module;\n\n\tconfig.testNumber = parseInt( urlParams.testNumber, 10 ) || null;\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = location.protocol === \"file:\";\n}());\n\n// Export global variables, unless an 'exports' object exists,\n// in that case we assume we're in CommonJS (dealt with on the bottom of the script)\nif ( typeof exports === \"undefined\" ) {\n\textend( window, QUnit );\n\n\t// Expose QUnit object\n\twindow.QUnit = QUnit;\n}\n\n// Extend QUnit object,\n// these after set here because they should not be exposed as global functions\nextend( QUnit, {\n\tconfig: config,\n\n\t// Initialize the configuration options\n\tinit: function() {\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: +new Date(),\n\t\t\tupdateRate: 1000,\n\t\t\tblocking: false,\n\t\t\tautostart: true,\n\t\t\tautorun: false,\n\t\t\tfilter: \"\",\n\t\t\tqueue: [],\n\t\t\tsemaphore: 0\n\t\t});\n\n\t\tvar tests, banner, result,\n\t\t\tqunit = id( \"qunit\" );\n\n\t\tif ( qunit ) {\n\t\t\tqunit.innerHTML =\n\t\t\t\t\"<h1 id='qunit-header'>\" + escapeInnerText( document.title ) + \"</h1>\" +\n\t\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t\t}\n\n\t\ttests = id( \"qunit-tests\" );\n\t\tbanner = id( \"qunit-banner\" );\n\t\tresult = id( \"qunit-testresult\" );\n\n\t\tif ( tests ) {\n\t\t\ttests.innerHTML = \"\";\n\t\t}\n\n\t\tif ( banner ) {\n\t\t\tbanner.className = \"\";\n\t\t}\n\n\t\tif ( result ) {\n\t\t\tresult.parentNode.removeChild( result );\n\t\t}\n\n\t\tif ( tests ) {\n\t\t\tresult = document.createElement( \"p\" );\n\t\t\tresult.id = \"qunit-testresult\";\n\t\t\tresult.className = \"result\";\n\t\t\ttests.parentNode.insertBefore( result, tests );\n\t\t\tresult.innerHTML = \"Running...<br/>&nbsp;\";\n\t\t}\n\t},\n\n\t// Resets the test setup. Useful for tests that modify the DOM.\n\t// If jQuery is available, uses jQuery's html(), otherwise just innerHTML.\n\treset: function() {\n\t\tvar fixture;\n\n\t\tif ( window.jQuery ) {\n\t\t\tjQuery( \"#qunit-fixture\" ).html( config.fixture );\n\t\t} else {\n\t\t\tfixture = id( \"qunit-fixture\" );\n\t\t\tif ( fixture ) {\n\t\t\t\tfixture.innerHTML = config.fixture;\n\t\t\t}\n\t\t}\n\t},\n\n\t// Trigger an event on an element.\n\t// @example triggerEvent( document.body, \"click\" );\n\ttriggerEvent: function( elem, type, event ) {\n\t\tif ( document.createEvent ) {\n\t\t\tevent = document.createEvent( \"MouseEvents\" );\n\t\t\tevent.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,\n\t\t\t\t0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n\t\t\telem.dispatchEvent( event );\n\t\t} else if ( elem.fireEvent ) {\n\t\t\telem.fireEvent( \"on\" + type );\n\t\t}\n\t},\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) == type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif ( typeof obj === \"undefined\" ) {\n\t\t\t\treturn \"undefined\";\n\t\t// consider: typeof null === object\n\t\t}\n\t\tif ( obj === null ) {\n\t\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar type = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/)[1] || \"\";\n\n\t\tswitch ( type ) {\n\t\t\tcase \"Number\":\n\t\t\t\tif ( isNaN(obj) ) {\n\t\t\t\t\treturn \"nan\";\n\t\t\t\t}\n\t\t\t\treturn \"number\";\n\t\t\tcase \"String\":\n\t\t\tcase \"Boolean\":\n\t\t\tcase \"Array\":\n\t\t\tcase \"Date\":\n\t\t\tcase \"RegExp\":\n\t\t\tcase \"Function\":\n\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif ( typeof obj === \"object\" ) {\n\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tpush: function( result, actual, expected, message ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"assertion outside test context, was \" + sourceFromStacktrace() );\n\t\t}\n\n\t\tvar output, source,\n\t\t\tdetails = {\n\t\t\t\tresult: result,\n\t\t\t\tmessage: message,\n\t\t\t\tactual: actual,\n\t\t\t\texpected: expected\n\t\t\t};\n\n\t\tmessage = escapeInnerText( message ) || ( result ? \"okay\" : \"failed\" );\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\tif ( !result ) {\n\t\t\texpected = escapeInnerText( QUnit.jsDump.parse(expected) );\n\t\t\tactual = escapeInnerText( QUnit.jsDump.parse(actual) );\n\t\t\toutput += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + expected + \"</pre></td></tr>\";\n\n\t\t\tif ( actual != expected ) {\n\t\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + actual + \"</pre></td></tr>\";\n\t\t\t\toutput += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + QUnit.diff( expected, actual ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\toutput += \"</table>\";\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\n\t\tvar output,\n\t\t\tdetails = {\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message\n\t\t\t};\n\n\t\tmessage = escapeInnerText( message ) || \"error\";\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\toutput += \"<table>\";\n\n\t\tif ( actual ) {\n\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeInnerText( actual ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\toutput += \"</table>\";\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: false,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\turl: function( params ) {\n\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n\t\tvar key,\n\t\t\tquerystring = \"?\";\n\n\t\tfor ( key in params ) {\n\t\t\tif ( !hasOwn.call( params, key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t}\n\t\treturn window.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent\n\t// load, equiv, jsDump, diff: Attached later\n});\n\n/**\n * @deprecated: Created for backwards compatibility with test runner that set the hook function\n * into QUnit.{hook}, instead of invoking it and passing the hook function.\n * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.\n * Doing this allows us to tell if the following methods have been overwritten on the actual\n * QUnit object.\n */\nextend( QUnit.constructor.prototype, {\n\n\t// Logging callbacks; all receive a single argument with the listed properties\n\t// run test/logs.html for any related changes\n\tbegin: registerLoggingCallback( \"begin\" ),\n\n\t// done: { failed, passed, total, runtime }\n\tdone: registerLoggingCallback( \"done\" ),\n\n\t// log: { result, actual, expected, message }\n\tlog: registerLoggingCallback( \"log\" ),\n\n\t// testStart: { name }\n\ttestStart: registerLoggingCallback( \"testStart\" ),\n\n\t// testDone: { name, failed, passed, total }\n\ttestDone: registerLoggingCallback( \"testDone\" ),\n\n\t// moduleStart: { name }\n\tmoduleStart: registerLoggingCallback( \"moduleStart\" ),\n\n\t// moduleDone: { name, failed, passed, total }\n\tmoduleDone: registerLoggingCallback( \"moduleDone\" )\n});\n\nif ( typeof document === \"undefined\" || document.readyState === \"complete\" ) {\n\tconfig.autorun = true;\n}\n\nQUnit.load = function() {\n\trunLoggingCallbacks( \"begin\", QUnit, {} );\n\n\t// Initialize the config, saving the execution queue\n\tvar banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,\n\t\turlConfigHtml = \"\",\n\t\toldconfig = extend( {}, config );\n\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tlen = config.urlConfig.length;\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\tval = config.urlConfig[i];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val,\n\t\t\t\ttooltip: \"[no tooltip available]\"\n\t\t\t};\n\t\t}\n\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + val.id + \"' name='\" + val.id + \"' type='checkbox'\" + ( config[ val.id ] ? \" checked='checked'\" : \"\" ) + \" title='\" + val.tooltip + \"'><label for='qunit-urlconfig-\" + val.id + \"' title='\" + val.tooltip + \"'>\" + val.label + \"</label>\";\n\t}\n\n\t// `userAgent` initialized at top of scope\n\tuserAgent = id( \"qunit-userAgent\" );\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\n\t// `banner` initialized at top of scope\n\tbanner = id( \"qunit-header\" );\n\tif ( banner ) {\n\t\tbanner.innerHTML = \"<a href='\" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + \"'>\" + banner.innerHTML + \"</a> \";\n\t}\n\n\t// `toolbar` initialized at top of scope\n\ttoolbar = id( \"qunit-testrunner-toolbar\" );\n\tif ( toolbar ) {\n\t\t// `filter` initialized at top of scope\n\t\tfilter = document.createElement( \"input\" );\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar tmp,\n\t\t\t\tol = document.getElementById( \"qunit-tests\" );\n\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\ttmp = \" \" + ol.className.replace( /[\\n\\t\\r]/g, \" \" ) + \" \";\n\t\t\t\tol.className = tmp.replace( / hidepass /, \" \" );\n\t\t\t}\n\t\t\tif ( defined.sessionStorage ) {\n\t\t\t\tif (filter.checked) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-filter-passed-tests\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-filter-passed-tests\" );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( \"qunit-filter-passed-tests\" ) ) {\n\t\t\tfilter.checked = true;\n\t\t\t// `ol` initialized at top of scope\n\t\t\tol = document.getElementById( \"qunit-tests\" );\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\t// `label` initialized at top of scope\n\t\tlabel = document.createElement( \"label\" );\n\t\tlabel.setAttribute( \"for\", \"qunit-filter-pass\" );\n\t\tlabel.setAttribute( \"title\", \"Only show tests and assertons that fail. Stored in sessionStorage.\" );\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\n\t\turlConfigCheckboxes = document.createElement( 'span' );\n\t\turlConfigCheckboxes.innerHTML = urlConfigHtml;\n\t\taddEvent( urlConfigCheckboxes, \"change\", function( event ) {\n\t\t\tvar params = {};\n\t\t\tparams[ event.target.name ] = event.target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t\ttoolbar.appendChild( urlConfigCheckboxes );\n\t}\n\n\t// `main` initialized at top of scope\n\tmain = id( \"qunit-fixture\" );\n\tif ( main ) {\n\t\tconfig.fixture = main.innerHTML;\n\t}\n\n\tif ( config.autostart ) {\n\t\tQUnit.start();\n\t}\n};\n\naddEvent( window, \"load\", QUnit.load );\n\n// `onErrorFnPrev` initialized at top of scope\n// Preserve other handlers\nonErrorFnPrev = window.onerror;\n\n// Cover uncaught exceptions\n// Returning true will surpress the default browser handler,\n// returning false will let it run.\nwindow.onerror = function ( error, filePath, linerNr ) {\n\tvar ret = false;\n\tif ( onErrorFnPrev ) {\n\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t}\n\n\t// Treat return value as window.onerror itself does,\n\t// Only do our handling if not surpressed.\n\tif ( ret !== true ) {\n\t\tif ( QUnit.config.current ) {\n\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t} else {\n\t\t\tQUnit.test( \"global failure\", function() {\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn ret;\n};\n\nfunction done() {\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.currentModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\tname: config.currentModule,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all\n\t\t});\n\t}\n\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\truntime = +new Date() - config.started,\n\t\tpassed = config.stats.all - config.stats.bad,\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\truntime,\n\t\t\t\" milliseconds.<br/>\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tpassed,\n\t\t\t\"</span> tests of <span class='total'>\",\n\t\t\tconfig.stats.all,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tconfig.stats.bad,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = ( config.stats.bad ? \"qunit-fail\" : \"qunit-pass\" );\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && typeof document !== \"undefined\" && document.title ) {\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( config.stats.bad ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {\n\t\t// `key` & `i` initialized at top of scope\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\trunLoggingCallbacks( \"done\", QUnit, {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t});\n}\n\n/** @return Boolean: true if this test should be ran */\nfunction validTest( test ) {\n\tvar include,\n\t\tfilter = config.filter && config.filter.toLowerCase(),\n\t\tmodule = config.module && config.module.toLowerCase(),\n\t\tfullName = (test.module + \": \" + test.testName).toLowerCase();\n\n\tif ( config.testNumber ) {\n\t\treturn test.testNumber === config.testNumber;\n\t}\n\n\tif ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {\n\t\treturn false;\n\t}\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tinclude = filter.charAt( 0 ) !== \"!\";\n\tif ( !include ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\t// If the filter matches, we need to honour include\n\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\treturn include;\n\t}\n\n\t// Otherwise, do the opposite\n\treturn !include;\n}\n\n// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)\n// Later Safari and IE10 are supposed to support error.stack as well\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 3 : offset;\n\n\tvar stack, include, i, regex;\n\n\tif ( e.stacktrace ) {\n\t\t// Opera\n\t\treturn e.stacktrace.split( \"\\n\" )[ offset + 3 ];\n\t} else if ( e.stack ) {\n\t\t// Firefox, Chrome\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif (/^error$/i.test( stack[0] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) != -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\t} else if ( e.sourceURL ) {\n\t\t// Safari, PhantomJS\n\t\t// hopefully one day Safari provides actual stacktraces\n\t\t// exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\t\t// for actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\nfunction sourceFromStacktrace( offset ) {\n\ttry {\n\t\tthrow new Error();\n\t} catch ( e ) {\n\t\treturn extractStacktrace( e, offset );\n\t}\n}\n\nfunction escapeInnerText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\treturn s.replace( /[\\&<>]/g, function( s ) {\n\t\tswitch( s ) {\n\t\t\tcase \"&\": return \"&amp;\";\n\t\t\tcase \"<\": return \"&lt;\";\n\t\t\tcase \">\": return \"&gt;\";\n\t\t\tdefault: return s;\n\t\t}\n\t});\n}\n\nfunction synchronize( callback, last ) {\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = new Date().getTime();\n\tconfig.depth = config.depth ? config.depth + 1 : 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\twindow.setTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n\t\t\tif ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconfig.pollution.push( key );\n\t\t}\n\t}\n}\n\nfunction checkPollution( name ) {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join(\", \") );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[i] === b[j] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction extend( a, b ) {\n\tfor ( var prop in b ) {\n\t\tif ( b[ prop ] === undefined ) {\n\t\t\tdelete a[ prop ];\n\n\t\t// Avoid \"Member not found\" error in IE8 caused by setting window.constructor\n\t\t} else if ( prop !== \"constructor\" || a !== window ) {\n\t\t\ta[ prop ] = b[ prop ];\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction addEvent( elem, type, fn ) {\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t} else {\n\t\tfn();\n\t}\n}\n\nfunction id( name ) {\n\treturn !!( typeof document !== \"undefined\" && document && document.getElementById ) &&\n\t\tdocument.getElementById( name );\n}\n\nfunction registerLoggingCallback( key ) {\n\treturn function( callback ) {\n\t\tconfig[key].push( callback );\n\t};\n}\n\n// Supports deprecated method of completely overwriting logging callbacks\nfunction runLoggingCallbacks( key, scope, args ) {\n\t//debugger;\n\tvar i, callbacks;\n\tif ( QUnit.hasOwnProperty( key ) ) {\n\t\tQUnit[ key ].call(scope, args );\n\t} else {\n\t\tcallbacks = config[ key ];\n\t\tfor ( i = 0; i < callbacks.length; i++ ) {\n\t\t\tcallbacks[ i ].call( scope, args );\n\t\t}\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = (function() {\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks( o, callbacks, args ) {\n\t\tvar prop = QUnit.objectType( o );\n\t\tif ( prop ) {\n\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === \"function\" ) {\n\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n\t\t\t} else {\n\t\t\t\treturn callbacks[ prop ]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\t// the real equiv function\n\tvar innerEquiv,\n\t\t// stack to decide between skip/abort functions\n\t\tcallers = [],\n\t\t// stack to avoiding loops from circular referencing\n\t\tparents = [],\n\n\t\tgetProto = Object.getPrototypeOf || function ( obj ) {\n\t\t\treturn obj.__proto__;\n\t\t},\n\t\tcallbacks = (function () {\n\n\t\t\t// for string, boolean, number and null\n\t\t\tfunction useStrictEquality( b, a ) {\n\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n\t\t\t\t\t// to catch short annotaion VS 'new' annotation of a\n\t\t\t\t\t// declaration\n\t\t\t\t\t// e.g. var i = 1;\n\t\t\t\t\t// var j = new Number(1);\n\t\t\t\t\treturn a == b;\n\t\t\t\t} else {\n\t\t\t\t\treturn a === b;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t\"string\": useStrictEquality,\n\t\t\t\t\"boolean\": useStrictEquality,\n\t\t\t\t\"number\": useStrictEquality,\n\t\t\t\t\"null\": useStrictEquality,\n\t\t\t\t\"undefined\": useStrictEquality,\n\n\t\t\t\t\"nan\": function( b ) {\n\t\t\t\t\treturn isNaN( b );\n\t\t\t\t},\n\n\t\t\t\t\"date\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t\t},\n\n\t\t\t\t\"regexp\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"regexp\" &&\n\t\t\t\t\t\t// the regex itself\n\t\t\t\t\t\ta.source === b.source &&\n\t\t\t\t\t\t// and its modifers\n\t\t\t\t\t\ta.global === b.global &&\n\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\t\ta.multiline === b.multiline;\n\t\t\t\t},\n\n\t\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t\t// - abort otherwise,\n\t\t\t\t// initial === would have catch identical references anyway\n\t\t\t\t\"function\": function() {\n\t\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t\t},\n\n\t\t\t\t\"array\": function( b, a ) {\n\t\t\t\t\tvar i, j, len, loop;\n\n\t\t\t\t\t// b could be an object literal here\n\t\t\t\t\tif ( QUnit.objectType( b ) !== \"array\" ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlen = a.length;\n\t\t\t\t\tif ( len !== b.length ) {\n\t\t\t\t\t\t// safe and faster\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\tloop = true;// dont rewalk array\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparents.pop();\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t\"object\": function( b, a ) {\n\t\t\t\t\tvar i, j, loop,\n\t\t\t\t\t\t// Default to true\n\t\t\t\t\t\teq = true,\n\t\t\t\t\t\taProperties = [],\n\t\t\t\t\t\tbProperties = [];\n\n\t\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t\t// instanceof\n\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\t\tif ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||\n\t\t\t\t\t\t\t( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// stack constructor before traversing properties\n\t\t\t\t\tcallers.push( a.constructor );\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\n\t\t\t\t\tfor ( i in a ) { // be strict: don't ensures hasOwnProperty\n\t\t\t\t\t\t\t\t\t// and go deep\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\t// don't go down the same path twice\n\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\taProperties.push(i); // collect a's properties\n\n\t\t\t\t\t\tif (!loop && !innerEquiv( a[i], b[i] ) ) {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallers.pop(); // unstack, we are done\n\t\t\t\t\tparents.pop();\n\n\t\t\t\t\tfor ( i in b ) {\n\t\t\t\t\t\tbProperties.push( i ); // collect b's properties\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensures identical properties name\n\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t\t\t}\n\t\t\t};\n\t\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = [].slice.apply( arguments );\n\t\tif ( args.length < 2 ) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn (function( a, b ) {\n\t\t\tif ( a === b ) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if ( a === null || b === null || typeof a === \"undefined\" ||\n\t\t\t\t\ttypeof b === \"undefined\" ||\n\t\t\t\t\tQUnit.objectType(a) !== QUnit.objectType(b) ) {\n\t\t\t\treturn false; // don't lose time with error prone cases\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t}( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );\n\t};\n\n\treturn innerEquiv;\n}());\n\n/**\n * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n * http://flesler.blogspot.com Licensed under BSD\n * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n *\n * @projectDescription Advanced and extensible data dumping for Javascript.\n * @version 1.0.0\n * @author Ariel Flesler\n * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n */\nQUnit.jsDump = (function() {\n\tfunction quote( str ) {\n\t\treturn '\"' + str.toString().replace( /\"/g, '\\\\\"' ) + '\"';\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = jsDump.separator(),\n\t\t\tbase = jsDump.indent(),\n\t\t\tinner = jsDump.indent(1);\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join(s);\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length, ret = new Array(i);\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tjsDump = {\n\t\t\tparse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance\n\t\t\t\tstack = stack || [ ];\n\t\t\t\tvar inStack, res,\n\t\t\t\t\tparser = this.parsers[ type || this.typeOf(obj) ];\n\n\t\t\t\ttype = typeof parser;\n\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack != -1 ) {\n\t\t\t\t\treturn \"recursion(\" + (inStack - stack.length) + \")\";\n\t\t\t\t}\n\t\t\t\t//else\n\t\t\t\tif ( type == \"function\" )  {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\t// else\n\t\t\t\treturn ( type == \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\" ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\t\t\t\t\t// native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && typeof obj.item !== \"undefined\" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === \"undefined\" ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ?\tthis.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&nbsp;\" : \" \";\n\t\t\t},\n\t\t\tindent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&nbsp;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this._depth_ + (extra||0) ).join(chr);\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis._depth_ += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis._depth_ -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[name] = parser;\n\t\t\t},\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\t//\n\t\t\t_depth_: 1,\n\t\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: \"[ERROR]\", //when no parser is found, shouldn\"t happen\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"( \";\n\n\t\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,\"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar ret = [ ], keys, key, val, i;\n\t\t\t\t\tQUnit.jsDump.up();\n\t\t\t\t\tif ( Object.keys ) {\n\t\t\t\t\t\tkeys = Object.keys( map );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkeys = [];\n\t\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( QUnit.jsDump.parse( key, \"key\" ) + \": \" + QUnit.jsDump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tQUnit.jsDump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar a, val,\n\t\t\t\t\t\topen = QUnit.jsDump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = QUnit.jsDump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag;\n\n\t\t\t\t\tfor ( a in QUnit.jsDump.DOMAttrs ) {\n\t\t\t\t\t\tval = node[ QUnit.jsDump.DOMAttrs[a] ];\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tret += \" \" + a + \"=\" + QUnit.jsDump.parse( val, \"attribute\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn ret + close + open + \"/\" + tag + close;\n\t\t\t\t},\n\t\t\t\tfunctionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array(l);\n\t\t\t\t\twhile ( l-- ) {\n\t\t\t\t\t\targs[l] = String.fromCharCode(97+l);//97 is 'a'\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\t\t\t\tkey: quote, //object calls it internally, the key part of an item in a map\n\t\t\t\tfunctionCode: \"[code]\", //function calls it internally, it's the content of the function\n\t\t\t\tattribute: quote, //node calls it internally, it's an html attribute value\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal, //regex\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\t\t\tDOMAttrs: {\n\t\t\t\t//attributes to dump from nodes, name=>realName\n\t\t\t\tid: \"id\",\n\t\t\t\tname: \"name\",\n\t\t\t\t\"class\": \"className\"\n\t\t\t},\n\t\t\tHTML: false,//if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tindentChar: \"  \",//indentation unit\n\t\t\tmultiline: true //if true, items in a collection, are separated by a \\n, else just a space.\n\t\t};\n\n\treturn jsDump;\n}());\n\n// from Sizzle.js\nfunction getText( elems ) {\n\tvar i, elem,\n\t\tret = \"\";\n\n\tfor ( i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff( \"the quick brown fox jumped over\", \"the quick fox jumps over\" ) == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\tfunction diff( o, n ) {\n\t\tvar i,\n\t\t\tns = {},\n\t\t\tos = {};\n\n\t\tfor ( i = 0; i < n.length; i++ ) {\n\t\t\tif ( ns[ n[i] ] == null ) {\n\t\t\t\tns[ n[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tns[ n[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i = 0; i < o.length; i++ ) {\n\t\t\tif ( os[ o[i] ] == null ) {\n\t\t\t\tos[ o[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tos[ o[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i in ns ) {\n\t\t\tif ( !hasOwn.call( ns, i ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ns[i].rows.length == 1 && typeof os[i] != \"undefined\" && os[i].rows.length == 1 ) {\n\t\t\t\tn[ ns[i].rows[0] ] = {\n\t\t\t\t\ttext: n[ ns[i].rows[0] ],\n\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t};\n\t\t\t\to[ os[i].rows[0] ] = {\n\t\t\t\t\ttext: o[ os[i].rows[0] ],\n\t\t\t\t\trow: ns[i].rows[0]\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n\t\t\tif ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&\n\t\t\t\t\t\tn[ i + 1 ] == o[ n[i].row + 1 ] ) {\n\n\t\t\t\tn[ i + 1 ] = {\n\t\t\t\t\ttext: n[ i + 1 ],\n\t\t\t\t\trow: n[i].row + 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row + 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row + 1 ],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n\t\t\tif ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&\n\t\t\t\t\t\tn[ i - 1 ] == o[ n[i].row - 1 ]) {\n\n\t\t\t\tn[ i - 1 ] = {\n\t\t\t\t\ttext: n[ i - 1 ],\n\t\t\t\t\trow: n[i].row - 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row - 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row - 1 ],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function( o, n ) {\n\t\to = o.replace( /\\s+$/, \"\" );\n\t\tn = n.replace( /\\s+$/, \"\" );\n\n\t\tvar i, pre,\n\t\t\tstr = \"\",\n\t\t\tout = diff( o === \"\" ? [] : o.split(/\\s+/), n === \"\" ? [] : n.split(/\\s+/) ),\n\t\t\toSpace = o.match(/\\s+/g),\n\t\t\tnSpace = n.match(/\\s+/g);\n\n\t\tif ( oSpace == null ) {\n\t\t\toSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\toSpace.push( \" \" );\n\t\t}\n\n\t\tif ( nSpace == null ) {\n\t\t\tnSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\tnSpace.push( \" \" );\n\t\t}\n\n\t\tif ( out.n.length === 0 ) {\n\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n\t\t\t\tstr += \"<del>\" + out.o[i] + oSpace[i] + \"</del>\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( out.n[0].text == null ) {\n\t\t\t\tfor ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\tstr += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n\t\t\t\tif (out.n[i].text == null) {\n\t\t\t\t\tstr += \"<ins>\" + out.n[i] + nSpace[i] + \"</ins>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// `pre` initialized at top of scope\n\t\t\t\t\tpre = \"\";\n\n\t\t\t\t\tfor ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\t\tpre += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[i].text + nSpace[i] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n}());\n\n// for CommonJS enviroments, export everything\nif ( typeof exports !== \"undefined\" ) {\n\textend(exports, QUnit);\n}\n\n// get at whatever the global object is, like window in browsers\n}( (function() {return this;}.call()) ));\n"
  },
  {
    "path": "third_party/ui/bower_components/modernizr/test/qunit/run-qunit.js",
    "content": "/**\n* Wait until the test condition is true or a timeout occurs. Useful for waiting\n* on a server response or for a ui change (fadeIn, etc.) to occur.\n*\n* @param testFx javascript condition that evaluates to a boolean,\n* it can be passed in as a string (e.g.: \"1 == 1\" or \"$('#bar').is(':visible')\" or\n* as a callback function.\n* @param onReady what to do when testFx condition is fulfilled,\n* it can be passed in as a string (e.g.: \"1 == 1\" or \"$('#bar').is(':visible')\" or\n* as a callback function.\n* @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.\n*/\nfunction waitFor(testFx, onReady, timeOutMillis) {\n    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timout is 3s\n        start = new Date().getTime(),\n        condition = false,\n        interval = setInterval(function() {\n            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {\n                // If not time-out yet and condition not yet fulfilled\n                condition = (typeof(testFx) === \"string\" ? eval(testFx) : testFx()); //< defensive code\n            } else {\n                if(!condition) {\n                    // If condition still not fulfilled (timeout but condition is 'false')\n                    console.log(\"'waitFor()' timeout\");\n                    phantom.exit(1);\n                } else {\n                    // Condition fulfilled (timeout and/or condition is 'true')\n                    typeof(onReady) === \"string\" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled\n                    clearInterval(interval); //< Stop this interval\n                }\n            }\n        }, 100); //< repeat check every 250ms\n};\n\n\nif (phantom.args.length === 0 || phantom.args.length > 2) {\n    console.log('Usage: run-qunit.js URL');\n    phantom.exit();\n}\n\nvar page = new WebPage();\n\n// Route \"console.log()\" calls from within the Page context to the main Phantom context (i.e. current \"this\")\npage.onConsoleMessage = function(msg) {\n    console.log(msg);\n};\n\npage.open(phantom.args[0], function(status){\n    if (status !== \"success\") {\n        console.log(\"Unable to access network\");\n        phantom.exit();\n    } else {\n        waitFor(function(){\n            return page.evaluate(function(){\n                var el = document.getElementById('qunit-testresult');\n                if (el && el.innerText.match('completed')) {\n                    return true;\n                }\n                return false;\n            });\n        }, function(){\n            var failedNum = page.evaluate(function(){\n                var el = document.getElementById('qunit-testresult');\n                try {\n                    return el.getElementsByClassName('failed')[0].innerHTML;\n                } catch (e) { }\n                return 10000;\n            });\n            phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0);\n        });\n    }\n});"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.bower.json",
    "content": "{\n  \"name\": \"ng-lodash\",\n  \"version\": \"0.2.0\",\n  \"description\": \"An Angular module wrapper for lodash\",\n  \"author\": [\n    \"Rockabox <tech@rockabox.com> (http://www.rockabox.com)\"\n  ],\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"nglodash\",\n    \"angular\",\n    \"lodash\"\n  ],\n  \"ignore\": [\n    \"test\",\n    \"*.\",\n    \"karma.conf.js\",\n    \"Gruntfile.js\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/rockabox/ng-lodash.git\"\n  },\n  \"main\": [\n    \"build/ng-lodash.js\"\n  ],\n  \"dependencies\": {\n    \"angular\": \">=1.2\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \">=1.2\"\n  },\n  \"homepage\": \"https://github.com/rockabox/ng-lodash\",\n  \"_release\": \"0.2.0\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.2.0\",\n    \"commit\": \"f5831b8b9e425c7a2e3ff60e73963ef13a38bb41\"\n  },\n  \"_source\": \"git://github.com/rockabox/ng-lodash.git\",\n  \"_target\": \"~0.2.0\",\n  \"_originalSource\": \"ng-lodash\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.bowerrc",
    "content": "{\n    \"directory\": \"lib\"\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.editorconfig",
    "content": "# editorconfig.org\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nmax_line_length = 120\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.gitignore",
    "content": ".grunt\nnode_modules\nlib\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.jscsrc",
    "content": "{\n    \"requireCurlyBraces\": [\n        \"if\",\n        \"else\",\n        \"for\",\n        \"while\",\n        \"do\",\n        \"try\",\n        \"catch\"\n    ],\n    \"requireSpaceAfterKeywords\": [\n        \"if\",\n        \"else\",\n        \"for\",\n        \"while\",\n        \"do\",\n        \"switch\",\n        \"return\",\n        \"try\",\n        \"catch\"\n    ],\n    \"requireSpaceBeforeBlockStatements\": true,\n    \"requireSpacesInConditionalExpression\": {\n        \"afterTest\": true,\n        \"beforeConsequent\": true,\n        \"afterConsequent\": true,\n        \"beforeAlternate\": true\n    },\n    \"requireSpacesInFunctionExpression\": {\n        \"beforeOpeningRoundBrace\": true,\n        \"beforeOpeningCurlyBrace\": true\n    },\n    \"requireSpacesInAnonymousFunctionExpression\": {\n        \"beforeOpeningRoundBrace\": true,\n        \"beforeOpeningCurlyBrace\": true\n    },\n    \"requireSpacesInNamedFunctionExpression\": {\n        \"beforeOpeningRoundBrace\": true,\n        \"beforeOpeningCurlyBrace\": true\n    },\n    \"requireSpacesInFunctionDeclaration\": {\n        \"beforeOpeningRoundBrace\": true,\n        \"beforeOpeningCurlyBrace\": true\n    },\n    \"requireMultipleVarDecl\": true,\n    \"requireBlocksOnNewline\": 1,\n    \"disallowEmptyBlocks\": true,\n    \"disallowSpacesInsideObjectBrackets\": true,\n    \"disallowSpacesInsideArrayBrackets\": true,\n    \"disallowSpacesInsideParentheses\": true,\n    \"disallowSpaceAfterObjectKeys\": true,\n    \"requireCommaBeforeLineBreak\": true,\n    \"requireOperatorBeforeLineBreak\": [\n        \"?\",\n        \"=\",\n        \"+\",\n        \"-\",\n        \"/\",\n        \"*\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\",\n        \">\",\n        \">=\",\n        \"<\",\n        \"<=\"\n    ],\n    \"requireSpaceBeforeBinaryOperators\": [\n        \"?\",\n        \"=\",\n        \"+\",\n        \"-\",\n        \"/\",\n        \"*\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\",\n        \">\",\n        \">=\",\n        \"<\",\n        \"<=\"\n    ],\n    \"requireSpaceAfterBinaryOperators\": [\n        \"?\",\n        \"=\",\n        \"+\",\n        \"/\",\n        \"*\",\n        \":\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\",\n        \">\",\n        \">=\",\n        \"<\",\n        \"<=\",\n        \",\"\n    ],\n    \"disallowSpaceBeforeBinaryOperators\": [\",\"],\n    \"disallowSpaceAfterPrefixUnaryOperators\": [\"++\", \"--\", \"+\", \"-\", \"~\", \"!\"],\n    \"disallowSpaceBeforePostfixUnaryOperators\": [\"++\", \"--\"],\n    \"requireSpaceBeforeBinaryOperators\": [\n        \"=\",\n        \"+\",\n        \"-\",\n        \"/\",\n        \"*\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\"\n    ],\n    \"requireSpaceAfterBinaryOperators\": [\n        \"=\",\n        \",\",\n        \"+\",\n        \"-\",\n        \"/\",\n        \"*\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\"\n    ],\n    \"disallowImplicitTypeConversion\": [\n        \"numeric\",\n        \"boolean\",\n        \"binary\",\n        \"string\"\n    ],\n    \"requireCamelCaseOrUpperCaseIdentifiers\": true,\n    \"disallowKeywords\": [\"with\"],\n    \"disallowMultipleLineBreaks\": true,\n    \"validateLineBreaks\": \"LF\",\n    \"validateQuoteMarks\": \"'\",\n    \"validateIndentation\": 4,\n    \"disallowMixedSpacesAndTabs\": true,\n    \"disallowTrailingWhitespace\": true,\n    \"disallowTrailingComma\": true,\n    \"disallowKeywordsOnNewLine\": [\"else\"],\n    \"maximumLineLength\": 120,\n    \"safeContextKeyword\": [\"$this\"],\n    \"disallowYodaConditions\": true,\n    \"validateJSDoc\": {\n        \"checkParamNames\": true,\n        \"checkRedundantParams\": true,\n        \"requireParamTypes\": true\n    },\n    \"requireLineFeedAtFileEnd\": true\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.jshintrc",
    "content": "{\n    // Predefined globals\n    \"browser\"       : true,     // Standard browser globals\n\n    // Development\n    \"debug\"         : false,    // Allow debugger statements e.g. browser breakpoints.\n    \"devel\"         : true,     // Allow development statements e.g. `console.log();`.\n\n    // The Good Parts\n    \"evil\"          : false,    // Tolerate use of `eval`.\n    \"regexdash\"     : true,     // Tolerate unescaped last dash i.e. `[-...]`.\n    \"trailing\"      : true,     // Prohibit trailing whitespaces.\n    \"sub\"           : true,     // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`.\n    \"eqeqeq\"        : false,    // Require triple equals i.e. `===`.\n\n    // Styling preferences.\n    \"indent\"        : 4,        // Indent level\n    \"camelcase\"     : true      // Use CAMEL Casing for variables\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/.travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"0.10\"\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis document outlines general guidelines, best practices and coding style rules\nfor developers contributing to the project.\n\n## Contents\n\n- [Pull requests](#pull-requests)\n- [Bugs](#bugs)\n- [Features](#features)\n- [Node dependencies](#node-dependencies)\n- [Frontend dependencies](#frontend-dependencies)\n- [Using grunt](#grunt)\n- [JS Guidelines](#js)\n\n## Pull requests\n\nIf you fixed or added something useful to the project, you can send a\npull request. It will be reviewed by maintainer and accepted, or commented for\nrework, or declined.\n\n## Bugs\n\nIf you found an error, typo or any other flaw in the project, please report\nabout it using GitHub Issues. The more details you provide, the easier it could\nbe reproduced and the faster it could be fixed. Unfortunately, sometimes the\nbug can only be reproduced in your project or in your environment, so\nmaintainers cannot reproduce it. In this case we believe you can fix the bug\nand send us the fix.\n\n## Features\n\nIf you've got an idea about a new feature, it's most likely that you'll have to\nimplement it on your own. If you cannot implement the feature, but it is very\nimportant, you can create an issue at GitHub, but expect it to be declined by\nthe maintainer.\n\n## Node dependencies\n\nThis project's build process uses Node npm modules defined via the\n`package.json` file.\n\nTo add the latest version of new npm package to the project and automatically\nappend it to `package.json` run:\n\n```\nnpm install <pkg> --save-dev\n```\n\nIf new packages have been added by other contributors then run:\n\n```\nnpm update\n```\n\nTo update all your local packages to the latest possible versions as constrained\nby `package.json` then run:\n\n```\nnpm install\n```\n\n### JS\n\n#### General top level guidelines\n\n- Don't skip semicolons\n- 4 spaces for indentation\n- Single quotes for strings\n- Use `{}` instead of `new Object();`\n- Use `[]` instead of `new Array();`\n- Don't use single line `if` statements.\n- 80 chars maximum line length.\n- Use inline comments only where needed to document dense code, code should\notherwise be clearly comprehensible without redundant commenting\n- Add a whitespace char when writing inline comments, i.e `// Good` vs `//Bad`.\n\n#### Variable naming\n\n- Always use `var` to declare variables.\n- Use only one `var` for multiple variables.\n- Define variables before use.\n- Define constants in CAPS.\n\n```js\n// Good\nvar aVariable = 0,\n    aSecondVariable = null,\n    A_CONSTANT = 'constant';\n\n// Bad\nvar a_variable = 0;\nvar a_second_variable = null;\n```\n\n#### Whitespace\n\nOur JavaScript code is compressed so don't try and save on space when writing\ncode, focus on readability by trying to (however do not add unnecessary spaces).\n\n - Use one (and only one) blank line to separate logical sets of code.\n - Add a whitespace character after keywords like `if` and after right\nparenthesis.\n - Add a whitespace character after commas.\n - Leave a line before a function or `if` statement.\n\n```js\nif (foo === 'foo') {\n    var array = ['one', 'two', 'three'];\n    bar(array);\n\n    foo = 'bar';\n}\n\nfunction (arg1, arg2) {\n    var foo = arg1;\n    bar(foo);\n}\n```\n\n- Don't add superfluos newlines when writing short/simple indented blocks:\n\n```js\n// Bad\n\nif ( foo ) {\n\n    bar();\n}\n\nfunction ( baz ) {\n\n    bar();\n}\n```\n\n- Do add newlines in blocks when the opening part of the block has wrapped onto\na newline due to the 80 char line length limit:\n\n```js\n// Good\n\nangular.module('foo')\n    .controller('FooCtrl', function ($scope, $someReallyLongServiceName,\n        $anotherService, $somethingElse) {\n\n        $scope.bar = 'baz';\n        $scope.qux = 'quux';\n    });\n```\n\n#### JSHint\n\nThis repo uses [JSHint](http://www.jshint.com/about/), defined in\n[.jshintrc](../../.jshintrc). Files are checked on save, and errors are visible\nin the console. Optionally this config file can also be used by your code\neditor.\n\nThe following guidelines are checked by JSHint.\n\n- Four spaces for indentation, never tabs.\n- Lines no longer than 80 Characters (including comments).\n- Use single `'` quotes for strings.\n- Use `===` and `!==` over `==` and `!=`\n- Use `camelCase` for variables.\n- Don't leave trailing whitespace.\n\n#### JS Code Style (JSCS)\n\nThis repo also uses [JSCS](https://github.com/mdevils/node-jscs), defined in\n[.jscsrc](../../.jscsrc). Files are checked on save, and errors are visible in\nthe console. Optionally this config file can also be used by your code editor.\n\nThe following rules have been defined.\n\n##### `requireCurlyBraces`\n\nUse curly braces after statements.\n\n```js\n// Good\nif (x) {\n    x++;\n}\n\n// Bad\nif (x) x++;\n```\n\n##### `requireSpaceAfterKeywords`\n\nUse spaces after keywords:\n\n```js\n// Good\nif (x) {\n    x++;\n}\n\n// Bad\nif(x) {\n    x++;\n}\n```\n\n##### `requireSpaceBeforeBlockStatements`\n\nUse spaces after parenthesis, before curly brace:\n\n```js\n// Good\nif (x) {\n    x++;\n}\n\n// Bad\nif (x){\n    x++;\n}\n```\n\n##### `requireSpacesInConditionalExpression`\n\nUse spaces around conditional expressions:\n\n```js\n// Good\nvar a = b ? c : d;\n\n// Bad\nvar a=b?c:d;\n```\n\n##### `requireSpacesInFunctionExpression`\n\n\n##### `requireSpacesInAnonymousFunctionExpression`\n\n\n##### `requireSpacesInNamedFunctionExpression`\n\n\n##### `requireSpacesInFunctionDeclaration`\n\nUse spaces before and after parenthesis:\n\n```js\n// Good\nfunction a () {}\n\n// Bad\nfunction a() {}\nfunction a (){}\n```\n\n##### `requireMultipleVarDecl`\n\nUse one `var` statement for multiple variables:\n\n```js\n// Good\nvar x = 1,\n    y = 2;\n\n// Bad\nvar x = 1;\nvar y = 2;\n```\n\n##### `requireBlocksOnNewline`\n\nUse new lines for multiple statements\n\n```js\n// Good\nif (true) {\n    doSomething();\n    doSomethingElse();\n}\n\n// Bad\nif (true) { doSomething(); doSomethingElse(); }\n```\n\n##### `disallowEmptyBlocks`\n\nDon't use empty blocks\n\n```js\n// Good\nif ( a === b ) {\n    c = d;\n}\n\n// Bad\nif ( a !== b ) {\n\n} else {\n    c = d;\n}\n```\n\n##### `disallowSpacesInsideObjectBrackets`\n\nDon't use a space after an opening or before a closing curly bracket\n\n```js\n// Good\nvar x = {a: 1};\n\n// Bad\nvar x = { a: 1 };\n```\n\n##### `disallowSpacesInsideArrayBrackets`\n\nDon't use a space after an opening or before a closing square bracket\n\n```js\n// Good\nvar x = [1];\n\n// Bad\nvar x = [ 1 ];\n```\n\n##### `disallowSpacesInsideParentheses`\n\nDon't use a space after an opening or before a closing parenthesis\n\n```js\n// Good\nvar x = (1 + 2) * 3;\n\n// Bad\nvar x = ( 1 + 2 ) * 3;\n```\n\n##### `disallowSpaceAfterObjectKeys`\n\nDon't use a space after a key in an object\n\n```js\n// Good\nvar x = {a: 1};\n\n// Bad\nvar x = {a : 1};\n```\n\n##### `requireCommaBeforeLineBreak`\n\nDon't put commas on the following line\n\n```js\n// Good\nvar x = {\n    one: 1,\n    two: 2\n};\n\n// Bad\nvar x = {\n    one: 1\n    , two: 2\n};\n```\n\n##### `requireOperatorBeforeLineBreak`\n\nBreak lines after (not before) an operator\n\n```js\n// Good\nx = y ?\n    1 : 2;\n\n// Bad\nx = y\n    ? 1 : 2;\n```\n\n##### `disallowLeftStickedOperators`\n\nPut a space before an operator\n\n```js\n// Good\nx = y ? 1 : 2;\n\n// Bad\nx = y? 1 : 2;\n```\n\n##### `disallowRightStickedOperators`\n\nPut a space after an operator\n\n```js\n// Good\nx = y + 1;\n\n// Bad\nx = y +1;\n```\n\n##### `requireLeftStickedOperators`\n\nDon't put a space before a comma\n\n```js\n// Good\nx = [1, 2];\n\n// Bad\nx = [1 , 2];\n```\n\n##### `disallowSpaceAfterPrefixUnaryOperators`\n\nDon't put a space after a prefix unary operator\n\n```js\n// Good\nx = !y;\ny = ++z;\n// Bad\nx = ! y;\ny = ++ z;\n```\n\n##### `disallowSpaceBeforePostfixUnaryOperators`\n\nDon't put a space after a postfix unary operator\n\n```js\n// Good\nx = y++;\n\n// Bad\nx = y ++;\n```\n\n##### `requireSpaceBeforeBinaryOperators`\n\nPut a space before binary operators\n\n```js\n// Good\nx !== y;\n\n// Bad\nx!== y;\n```\n\n##### `requireSpaceAfterBinaryOperators`\n\nPut a space after binary operators\n\n```js\n// Good\nx + y;\n\n// Bad\nx +y;\n```\n\n##### `disallowImplicitTypeConversion`\n\nDon't use implicit type conversion\n\n```js\n// Good\nx = Boolean(y);\nx = Number(y);\nx = String(y);\nx = s.indexOf('.') !== -1;\n\n// Bad\nx = !!y;\nx = +y;\nx = '' + y;\nx = ~s.indexOf('.');\n```\n\n##### `requireCamelCaseOrUpperCaseIdentifiers`\n\nUse camelCase or\nUPPERCASE_WITH_UNDERSCORES for variable names\n\n```js\n// Good\nvar camelCase = 0;\nvar UPPER_CASE = 4;\n\n// Bad\nvar lower_case = 1;\nvar Mixed_case = 2;\nvar mixed_Case = 3;\n```\n\n##### `disallowKeywords`\n\nDisallow certain keywords from anywhere in the code base.\n\n```js\n// Bad\nwith (foo) {\n}\n```\n\n##### `disallowMultipleLineBreaks`\n\nDon't use multiple blank lines in a row\n\n```js\n// Bad\nvar x = 1;\nx++;\n```\n\n##### `validateLineBreaks`\n\nChecks line break character consistency:\n\n```js\n// Good\nfoo();<LF>\n\n// Bad\nfoo();<CRLF>\nfoo();<CR>\n```\n##### `validateQuoteMarks`\n\nCheck quote mark usage is single quotes.\n\n```js\n// Good\nvar foo = 'bar';\n\n// Bad\nvar foo = \"bar\";\n```\n\n##### `validateIndentation`\n\nCheck indentation is at 4 spaces, no tabs.\n\n```js\n// Good\nfunction foo (bar) {\n    console.log(bar);\n}\n\n// Bad\nfunction foo (bar) {\n  console.log(bar);\n}\n\n```\n\n##### `disallowMixedSpacesAndTabs`\n\nCheck that spaces and tabs are not mixed.\n\n##### `disallowTrailingWhitespace`\n\nCheck that no line ends in a whitespace char.\n\n```js\n// Good\nvar foo = \"blah blah\";<LF>\n\n// Bad\nvar foo = \"blah blah\"; <LF>\n```\n\n##### `disallowTrailingComma`\n\nDon't use a comma at the end of an array or object\n\n```js\n// Good\nvar foo = [1, 2, 3];\nvar bar = {a: \"a\", b: \"b\"}\n\n// Bad\nvar foo = [1, 2, 3,];\nvar bar = {a: \"a\", b: \"b\",}\n```\n\n##### `disallowKeywordsOnNewLine`\n\nDon't place `else` statements on their own line\n\n```js\n// Good\nif (x < 0) {\n    x++;\n} else {\n    x--;\n}\n\n// Bad\nif (x < 0) {\n    x++;\n}\nelse {\n    x--;\n}\n```\n\n##### `maximumLineLength`\n\nChecks that no single line extends beyond 80 chars.\n\n##### `requireCapitalizedConstructors`\n\nConstructor variable names should be Capitalised.\n\n```js\n// Good\nvar foo = new Bar();\n\n// Bad\nvar foo = new bar();\n```\n\n##### `safeContextKeyword`\n\nWhen saving `this` context call the variable `$this`.\n\n```js\n// Good\nvar $this = this;\n\n// Bad\nvar that = this;\nvar self = this;\n```\n\n##### `disallowYodaConditions`\n\nThe variable should be on the left in boolean comparisons.\n\n```js\n// Good\nif (a === 1) {\n    // ...\n}\n\n// Bad\nif (1 === a) {\n    // ...\n}\n```\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/License.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Rockabox Ltd.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/README.md",
    "content": "[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n[![Build Status](https://travis-ci.org/rockabox/ng-lodash.svg?branch=master)](https://travis-ci.org/rockabox/ng-lodash)\n[![devDependency Status](https://david-dm.org/rockabox/ng-lodash/dev-status.svg)](https://david-dm.org/rockabox/ng-lodash#info=devDependencies)\n\nng-lodash\n=========\n\nThis is a wrapper for the utility library [Lo-Dash](http://lodash.com/) for\nAngular JS. One aim for this project is to ensure Lo-Dash doesn't have to be\nleft on the window, and we use Lo-Dash with Angular, in the normal depenedency\n injection manner.\n\n## Installing\nInstall via bower\n\n```bower install ng-lodash```\n\nRequire it into your application (after Angular)\n\n```<script src=\"ng-lodash.min.js\"></script>```\n\nAdd the module as a dependency to your app\n\n```js\nvar app = angular.module('yourAwesomeApp', ['ngLodash']);\n```\n\nAnd inject it into your controller like so!\n\n```js\nvar YourCtrl = app.controller('yourController', function($scope, lodash) {\n  lodash.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });\n});\n```\n\n## Developing\n\nTo help us develop this module, we are using Grunt some tasks that may be\nhelpful for you to know about are:\n\n### Testing\n\nThis command will run JSHint and JSCS testing JS Files (note files within build)\nare not tested, it will also run your local build of the module with all of the\nKarma tests:\n\n```grunt test``` it can also be run by using ```npm test```\n\n### Build\n\nThis command will build the module, run it through ngMin and then create a\nminified version of the module, ready for distribution:\n\n```grunt build```\n\n### Dist\n\nThis command will build the module initially and then run the test suite.\nTesting with JSHint, JSCS and Karma:\n\n```grunt dist```\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/bower.json",
    "content": "{\n  \"name\": \"ng-lodash\",\n  \"version\": \"0.2.0\",\n  \"description\": \"An Angular module wrapper for lodash\",\n  \"author\": [\"Rockabox <tech@rockabox.com> (http://www.rockabox.com)\"],\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"nglodash\",\n    \"angular\",\n    \"lodash\"\n  ],\n  \"ignore\": [\n    \"test\",\n    \"*.\",\n    \"karma.conf.js\",\n    \"Gruntfile.js\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/rockabox/ng-lodash.git\"\n  },\n  \"main\": [\n    \"build/ng-lodash.js\"\n  ],\n  \"dependencies\": {\n    \"angular\": \">=1.2\"\n  },\n  \"devDependencies\": {\n    \"angular-mocks\": \">=1.2\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/build/ng-lodash.js",
    "content": "/**\n * @license\n * lodash 3.1.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern exports=\"amd,commonjs,node\" iife=\"angular.module('ngLodash', []).constant('lodash', null).config(function ($provide) { %output% $provide.constant('lodash', _);});\" --output build/ng-lodash.js`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.7.0 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nangular.module('ngLodash', []).constant('lodash', null).config([\n  '$provide',\n  function ($provide) {\n    /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n    var undefined;\n    /** Used as the semantic version number. */\n    var VERSION = '3.1.0';\n    /** Used to compose bitmasks for wrapper metadata. */\n    var BIND_FLAG = 1, BIND_KEY_FLAG = 2, CURRY_BOUND_FLAG = 4, CURRY_FLAG = 8, CURRY_RIGHT_FLAG = 16, PARTIAL_FLAG = 32, PARTIAL_RIGHT_FLAG = 64, REARG_FLAG = 128, ARY_FLAG = 256;\n    /** Used as default options for `_.trunc`. */\n    var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = '...';\n    /** Used to detect when a function becomes hot. */\n    var HOT_COUNT = 150, HOT_SPAN = 16;\n    /** Used to indicate the type of lazy iteratees. */\n    var LAZY_FILTER_FLAG = 0, LAZY_MAP_FLAG = 1, LAZY_WHILE_FLAG = 2;\n    /** Used as the `TypeError` message for \"Functions\" methods. */\n    var FUNC_ERROR_TEXT = 'Expected a function';\n    /** Used as the internal argument placeholder. */\n    var PLACEHOLDER = '__lodash_placeholder__';\n    /** `Object#toString` result references. */\n    var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]';\n    var arrayBufferTag = '[object ArrayBuffer]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]';\n    /** Used to match empty string literals in compiled template source. */\n    var reEmptyStringLeading = /\\b__p \\+= '';/g, reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g, reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n    /** Used to match HTML entities and HTML characters. */\n    var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g, reUnescapedHtml = /[&<>\"'`]/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n    /** Used to match template delimiters. */\n    var reEscape = /<%-([\\s\\S]+?)%>/g, reEvaluate = /<%([\\s\\S]+?)%>/g, reInterpolate = /<%=([\\s\\S]+?)%>/g;\n    /**\n   * Used to match ES template delimiters.\n   * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components)\n   * for more details.\n   */\n    var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n    /** Used to match `RegExp` flags from their coerced string values. */\n    var reFlags = /\\w*$/;\n    /** Used to detect named functions. */\n    var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n    /** Used to detect hexadecimal string values. */\n    var reHexPrefix = /^0[xX]/;\n    /** Used to detect host constructors (Safari > 5). */\n    var reHostCtor = /^\\[object .+?Constructor\\]$/;\n    /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n    var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n    /** Used to ensure capturing order of template delimiters. */\n    var reNoMatch = /($^)/;\n    /**\n   * Used to match `RegExp` special characters.\n   * See this [article on `RegExp` characters](http://www.regular-expressions.info/characters.html#special)\n   * for more details.\n   */\n    var reRegExpChars = /[.*+?^${}()|[\\]\\/\\\\]/g, reHasRegExpChars = RegExp(reRegExpChars.source);\n    /** Used to detect functions containing a `this` reference. */\n    var reThis = /\\bthis\\b/;\n    /** Used to match unescaped characters in compiled string literals. */\n    var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n    /** Used to match words to create compound words. */\n    var reWords = function () {\n        var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]', lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n        return RegExp(upper + '{2,}(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n      }();\n    /** Used to detect and test for whitespace. */\n    var whitespace = ' \\t\\x0B\\f\\xa0\\ufeff' + '\\n\\r\\u2028\\u2029' + '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000';\n    /** Used to assign default `context` object properties. */\n    var contextProps = [\n        'Array',\n        'ArrayBuffer',\n        'Date',\n        'Error',\n        'Float32Array',\n        'Float64Array',\n        'Function',\n        'Int8Array',\n        'Int16Array',\n        'Int32Array',\n        'Math',\n        'Number',\n        'Object',\n        'RegExp',\n        'Set',\n        'String',\n        '_',\n        'clearTimeout',\n        'document',\n        'isFinite',\n        'parseInt',\n        'setTimeout',\n        'TypeError',\n        'Uint8Array',\n        'Uint8ClampedArray',\n        'Uint16Array',\n        'Uint32Array',\n        'WeakMap',\n        'window',\n        'WinRTError'\n      ];\n    /** Used to make template sourceURLs easier to identify. */\n    var templateCounter = -1;\n    /** Used to identify `toStringTag` values of typed arrays. */\n    var typedArrayTags = {};\n    typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n    typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n    /** Used to identify `toStringTag` values supported by `_.clone`. */\n    var cloneableTags = {};\n    cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[stringTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n    cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[mapTag] = cloneableTags[setTag] = cloneableTags[weakMapTag] = false;\n    /** Used as an internal `_.debounce` options object by `_.throttle`. */\n    var debounceOptions = {\n        'leading': false,\n        'maxWait': 0,\n        'trailing': false\n      };\n    /** Used to map latin-1 supplementary letters to basic latin letters. */\n    var deburredLetters = {\n        '\\xc0': 'A',\n        '\\xc1': 'A',\n        '\\xc2': 'A',\n        '\\xc3': 'A',\n        '\\xc4': 'A',\n        '\\xc5': 'A',\n        '\\xe0': 'a',\n        '\\xe1': 'a',\n        '\\xe2': 'a',\n        '\\xe3': 'a',\n        '\\xe4': 'a',\n        '\\xe5': 'a',\n        '\\xc7': 'C',\n        '\\xe7': 'c',\n        '\\xd0': 'D',\n        '\\xf0': 'd',\n        '\\xc8': 'E',\n        '\\xc9': 'E',\n        '\\xca': 'E',\n        '\\xcb': 'E',\n        '\\xe8': 'e',\n        '\\xe9': 'e',\n        '\\xea': 'e',\n        '\\xeb': 'e',\n        '\\xcc': 'I',\n        '\\xcd': 'I',\n        '\\xce': 'I',\n        '\\xcf': 'I',\n        '\\xec': 'i',\n        '\\xed': 'i',\n        '\\xee': 'i',\n        '\\xef': 'i',\n        '\\xd1': 'N',\n        '\\xf1': 'n',\n        '\\xd2': 'O',\n        '\\xd3': 'O',\n        '\\xd4': 'O',\n        '\\xd5': 'O',\n        '\\xd6': 'O',\n        '\\xd8': 'O',\n        '\\xf2': 'o',\n        '\\xf3': 'o',\n        '\\xf4': 'o',\n        '\\xf5': 'o',\n        '\\xf6': 'o',\n        '\\xf8': 'o',\n        '\\xd9': 'U',\n        '\\xda': 'U',\n        '\\xdb': 'U',\n        '\\xdc': 'U',\n        '\\xf9': 'u',\n        '\\xfa': 'u',\n        '\\xfb': 'u',\n        '\\xfc': 'u',\n        '\\xdd': 'Y',\n        '\\xfd': 'y',\n        '\\xff': 'y',\n        '\\xc6': 'Ae',\n        '\\xe6': 'ae',\n        '\\xde': 'Th',\n        '\\xfe': 'th',\n        '\\xdf': 'ss'\n      };\n    /** Used to map characters to HTML entities. */\n    var htmlEscapes = {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        '\\'': '&#39;',\n        '`': '&#96;'\n      };\n    /** Used to map HTML entities to characters. */\n    var htmlUnescapes = {\n        '&amp;': '&',\n        '&lt;': '<',\n        '&gt;': '>',\n        '&quot;': '\"',\n        '&#39;': '\\'',\n        '&#96;': '`'\n      };\n    /** Used to determine if values are of the language type `Object`. */\n    var objectTypes = {\n        'function': true,\n        'object': true\n      };\n    /** Used to escape characters for inclusion in compiled string literals. */\n    var stringEscapes = {\n        '\\\\': '\\\\',\n        '\\'': '\\'',\n        '\\n': 'n',\n        '\\r': 'r',\n        '\\u2028': 'u2028',\n        '\\u2029': 'u2029'\n      };\n    /**\n   * Used as a reference to the global object.\n   *\n   * The `this` value is used if it is the global object to avoid Greasemonkey's\n   * restricted `window` object, otherwise the `window` object is used.\n   */\n    var root = objectTypes[typeof window] && window !== (this && this.window) ? window : this;\n    /** Detect free variable `exports`. */\n    var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n    /** Detect free variable `module`. */\n    var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n    /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n    var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n      root = freeGlobal;\n    }\n    /** Detect the popular CommonJS extension `module.exports`. */\n    var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n    /*--------------------------------------------------------------------------*/\n    /**\n   * The base implementation of `compareAscending` which compares values and\n   * sorts them in ascending order without guaranteeing a stable sort.\n   *\n   * @private\n   * @param {*} value The value to compare to `other`.\n   * @param {*} other The value to compare to `value`.\n   * @returns {number} Returns the sort order indicator for `value`.\n   */\n    function baseCompareAscending(value, other) {\n      if (value !== other) {\n        var valIsReflexive = value === value, othIsReflexive = other === other;\n        if (value > other || !valIsReflexive || typeof value == 'undefined' && othIsReflexive) {\n          return 1;\n        }\n        if (value < other || !othIsReflexive || typeof other == 'undefined' && valIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n    /**\n   * The base implementation of `_.indexOf` without support for binary searches.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n    function baseIndexOf(array, value, fromIndex) {\n      if (value !== value) {\n        return indexOfNaN(array, fromIndex);\n      }\n      var index = (fromIndex || 0) - 1, length = array.length;\n      while (++index < length) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n    /**\n   * The base implementation of `_.sortBy` and `_.sortByAll` which uses `comparer`\n   * to define the sort order of `array` and replaces criteria objects with their\n   * corresponding values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n    function baseSortBy(array, comparer) {\n      var length = array.length;\n      array.sort(comparer);\n      while (length--) {\n        array[length] = array[length].value;\n      }\n      return array;\n    }\n    /**\n   * Converts `value` to a string if it is not one. An empty string is returned\n   * for `null` or `undefined` values.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n    function baseToString(value) {\n      if (typeof value == 'string') {\n        return value;\n      }\n      return value == null ? '' : value + '';\n    }\n    /**\n   * Used by `_.max` and `_.min` as the default callback for string values.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the code unit of the first character of the string.\n   */\n    function charAtCallback(string) {\n      return string.charCodeAt(0);\n    }\n    /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the first character not found in `chars`.\n   */\n    function charsLeftIndex(string, chars) {\n      var index = -1, length = string.length;\n      while (++index < length && chars.indexOf(string.charAt(index)) > -1) {\n      }\n      return index;\n    }\n    /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the last character not found in `chars`.\n   */\n    function charsRightIndex(string, chars) {\n      var index = string.length;\n      while (index-- && chars.indexOf(string.charAt(index)) > -1) {\n      }\n      return index;\n    }\n    /**\n   * Used by `_.sortBy` to compare transformed elements of a collection and stable\n   * sort them in ascending order.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n    function compareAscending(object, other) {\n      return baseCompareAscending(object.criteria, other.criteria) || object.index - other.index;\n    }\n    /**\n   * Used by `_.sortByAll` to compare multiple properties of each element\n   * in a collection and stable sort them in ascending order.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n    function compareMultipleAscending(object, other) {\n      var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length;\n      while (++index < length) {\n        var result = baseCompareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          return result;\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://code.google.com/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n    /**\n   * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n    function deburrLetter(letter) {\n      return deburredLetters[letter];\n    }\n    /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n    function escapeHtmlChar(chr) {\n      return htmlEscapes[chr];\n    }\n    /**\n   * Used by `_.template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n    function escapeStringChar(chr) {\n      return '\\\\' + stringEscapes[chr];\n    }\n    /**\n   * Gets the index at which the first occurrence of `NaN` is found in `array`.\n   * If `fromRight` is provided elements of `array` are iterated from right to left.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {number} [fromIndex] The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n   */\n    function indexOfNaN(array, fromIndex, fromRight) {\n      var length = array.length, index = fromRight ? fromIndex || length : (fromIndex || 0) - 1;\n      while (fromRight ? index-- : ++index < length) {\n        var other = array[index];\n        if (other !== other) {\n          return index;\n        }\n      }\n      return -1;\n    }\n    /**\n   * Checks if `value` is object-like.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   */\n    function isObjectLike(value) {\n      return value && typeof value == 'object' || false;\n    }\n    /**\n   * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n   * character code is whitespace.\n   *\n   * @private\n   * @param {number} charCode The character code to inspect.\n   * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n   */\n    function isSpace(charCode) {\n      return charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160 || charCode == 5760 || charCode == 6158 || charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279);\n    }\n    /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n    function replaceHolders(array, placeholder) {\n      var index = -1, length = array.length, resIndex = -1, result = [];\n      while (++index < length) {\n        if (array[index] === placeholder) {\n          array[index] = PLACEHOLDER;\n          result[++resIndex] = index;\n        }\n      }\n      return result;\n    }\n    /**\n   * An implementation of `_.uniq` optimized for sorted arrays without support\n   * for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} [iteratee] The function invoked per iteration.\n   * @returns {Array} Returns the new duplicate-value-free array.\n   */\n    function sortedUniq(array, iteratee) {\n      var seen, index = -1, length = array.length, resIndex = -1, result = [];\n      while (++index < length) {\n        var value = array[index], computed = iteratee ? iteratee(value, index, array) : value;\n        if (!index || seen !== computed) {\n          seen = computed;\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n    /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the first non-whitespace character.\n   */\n    function trimmedLeftIndex(string) {\n      var index = -1, length = string.length;\n      while (++index < length && isSpace(string.charCodeAt(index))) {\n      }\n      return index;\n    }\n    /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n    function trimmedRightIndex(string) {\n      var index = string.length;\n      while (index-- && isSpace(string.charCodeAt(index))) {\n      }\n      return index;\n    }\n    /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n    function unescapeHtmlChar(chr) {\n      return htmlUnescapes[chr];\n    }\n    /*--------------------------------------------------------------------------*/\n    /**\n   * Create a new pristine `lodash` function using the given `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utility\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'add': function(a, b) { return a + b; } });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'sub': function(a, b) { return a - b; } });\n   *\n   * _.isFunction(_.add);\n   * // => true\n   * _.isFunction(_.sub);\n   * // => false\n   *\n   * lodash.isFunction(lodash.add);\n   * // => false\n   * lodash.isFunction(lodash.sub);\n   * // => true\n   *\n   * // using `context` to mock `Date#getTime` use in `_.now`\n   * var mock = _.runInContext({\n   *   'Date': function() {\n   *     return { 'getTime': getTimeMock };\n   *   }\n   * });\n   *\n   * // or creating a suped-up `defer` in Node.js\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n    function runInContext(context) {\n      // Avoid issues with some ES3 environments that attempt to use values, named\n      // after built-in constructors like `Object`, for the creation of literals.\n      // ES5 clears this up by stating that literals must use built-in constructors.\n      // See https://es5.github.io/#x11.1.5 for more details.\n      context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n      /** Native constructor references. */\n      var Array = context.Array, Date = context.Date, Error = context.Error, Function = context.Function, Math = context.Math, Number = context.Number, Object = context.Object, RegExp = context.RegExp, String = context.String, TypeError = context.TypeError;\n      /** Used for native method references. */\n      var arrayProto = Array.prototype, objectProto = Object.prototype;\n      /** Used to detect DOM support. */\n      var document = (document = context.window) && document.document;\n      /** Used to resolve the decompiled source of functions. */\n      var fnToString = Function.prototype.toString;\n      /** Used to the length of n-tuples for `_.unzip`. */\n      var getLength = baseProperty('length');\n      /** Used to check objects for own properties. */\n      var hasOwnProperty = objectProto.hasOwnProperty;\n      /** Used to generate unique IDs. */\n      var idCounter = 0;\n      /**\n     * Used to resolve the `toStringTag` of values.\n     * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n     * for more details.\n     */\n      var objToString = objectProto.toString;\n      /** Used to restore the original `_` reference in `_.noConflict`. */\n      var oldDash = context._;\n      /** Used to detect if a method is native. */\n      var reNative = RegExp('^' + escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n      /** Native method references. */\n      var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer, bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice, ceil = Math.ceil, clearTimeout = context.clearTimeout, floor = Math.floor, getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, push = arrayProto.push, propertyIsEnumerable = objectProto.propertyIsEnumerable, Set = isNative(Set = context.Set) && Set, setTimeout = context.setTimeout, splice = arrayProto.splice, Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array, unshift = arrayProto.unshift, WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;\n      /** Used to clone array buffers. */\n      var Float64Array = function () {\n          // Safari 5 errors when using an array buffer to initialize a typed array\n          // where the array buffer's `byteLength` is not a multiple of the typed\n          // array's `BYTES_PER_ELEMENT`.\n          try {\n            var func = isNative(func = context.Float64Array) && func, result = new func(new ArrayBuffer(10), 0, 1) && func;\n          } catch (e) {\n          }\n          return result;\n        }();\n      /* Native method references for those with the same name as other `lodash` methods. */\n      var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray, nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate, nativeIsFinite = context.isFinite, nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys, nativeMax = Math.max, nativeMin = Math.min, nativeNow = isNative(nativeNow = Date.now) && nativeNow, nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite, nativeParseInt = context.parseInt, nativeRandom = Math.random;\n      /** Used as references for `-Infinity` and `Infinity`. */\n      var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY, POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n      /** Used as references for the maximum length and index of an array. */\n      var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n      /** Used as the size, in bytes, of each `Float64Array` element. */\n      var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;\n      /**\n     * Used as the maximum length of an array-like value.\n     * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n     * for more details.\n     */\n      var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n      /** Used to store function metadata. */\n      var metaMap = WeakMap && new WeakMap();\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates a `lodash` object which wraps `value` to enable intuitive chaining.\n     * Methods that operate on and return arrays, collections, and functions can\n     * be chained together. Methods that return a boolean or single value will\n     * automatically end the chain returning the unwrapped value. Explicit chaining\n     * may be enabled using `_.chain`. The execution of chained methods is lazy,\n     * that is, execution is deferred until `_#value` is implicitly or explicitly\n     * called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n     * fusion is an optimization that merges iteratees to avoid creating intermediate\n     * arrays and reduce the number of iteratee executions.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * The wrapper functions that support shortcut fusion are:\n     * `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, `first`,\n     * `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`, `slice`,\n     * `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `where`\n     *\n     * The chainable wrapper functions are:\n     * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n     * `callback`, `chain`, `chunk`, `compact`, `concat`, `constant`, `countBy`,\n     * `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`, `difference`,\n     * `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, `flatten`,\n     * `flattenDeep`, `flow`, `flowRight`, `forEach`, `forEachRight`, `forIn`,\n     * `forInRight`, `forOwn`, `forOwnRight`, `functions`, `groupBy`, `indexBy`,\n     * `initial`, `intersection`, `invert`, `invoke`, `keys`, `keysIn`, `map`,\n     * `mapValues`, `matches`, `memoize`, `merge`, `mixin`, `negate`, `noop`,\n     * `omit`, `once`, `pairs`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pluck`, `property`, `propertyOf`, `pull`, `pullAt`, `push`, `range`,\n     * `rearg`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `sortByAll`, `splice`, `take`, `takeRight`, `takeRightWhile`,\n     * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,\n     * `transform`, `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`,\n     * `where`, `without`, `wrap`, `xor`, `zip`, and `zipObject`\n     *\n     * The wrapper functions that are **not** chainable by default are:\n     * `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,\n     * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,\n     * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,\n     * `identity`, `includes`, `indexOf`, `isArguments`, `isArray`, `isBoolean`,\n     * `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`,\n     * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,\n     * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`,\n     * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`,\n     * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`,\n     * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`,\n     * `startCase`, `startsWith`, `template`, `trim`, `trimLeft`, `trimRight`,\n     * `trunc`, `unescape`, `uniqueId`, `value`, and `words`\n     *\n     * The wrapper function `sample` will return a wrapped value when `n` is provided,\n     * otherwise an unwrapped value is returned.\n     *\n     * @name _\n     * @constructor\n     * @category Chain\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, n) { return sum + n; });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(n) { return n * n; });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n      function lodash(value) {\n        if (isObjectLike(value) && !isArray(value)) {\n          if (value instanceof LodashWrapper) {\n            return value;\n          }\n          if (hasOwnProperty.call(value, '__wrapped__')) {\n            return new LodashWrapper(value.__wrapped__, value.__chain__, arrayCopy(value.__actions__));\n          }\n        }\n        return new LodashWrapper(value);\n      }\n      /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n     * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n     */\n      function LodashWrapper(value, chainAll, actions) {\n        this.__actions__ = actions || [];\n        this.__chain__ = !!chainAll;\n        this.__wrapped__ = value;\n      }\n      /**\n     * An object environment feature flags.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n      var support = lodash.support = {};\n      (function (x) {\n        /**\n       * Detect if functions can be decompiled by `Function#toString`\n       * (all but Firefox OS certified apps, older Opera mobile browsers, and\n       * the PlayStation 3; forced `false` for Windows 8 apps).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n        support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n        /**\n       * Detect if `Function#name` is supported (all but IE).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n        support.funcNames = typeof Function.name == 'string';\n        /**\n       * Detect if the DOM is supported.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n        try {\n          support.dom = document.createDocumentFragment().nodeType === 11;\n        } catch (e) {\n          support.dom = false;\n        }\n        /**\n       * Detect if `arguments` object indexes are non-enumerable.\n       *\n       * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object\n       * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat\n       * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`\n       * checks for indexes that exceed their function's formal parameters with\n       * associated values of `0`.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n        try {\n          support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);\n        } catch (e) {\n          support.nonEnumArgs = true;\n        }\n      }(0, 0));\n      /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB). Change the following template settings to use\n     * alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n      lodash.templateSettings = {\n        'escape': reEscape,\n        'evaluate': reEvaluate,\n        'interpolate': reInterpolate,\n        'variable': '',\n        'imports': { '_': lodash }\n      };\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     */\n      function LazyWrapper(value) {\n        this.actions = null;\n        this.dir = 1;\n        this.dropCount = 0;\n        this.filtered = false;\n        this.iteratees = null;\n        this.takeCount = POSITIVE_INFINITY;\n        this.views = null;\n        this.wrapped = value;\n      }\n      /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n      function lazyClone() {\n        var actions = this.actions, iteratees = this.iteratees, views = this.views, result = new LazyWrapper(this.wrapped);\n        result.actions = actions ? arrayCopy(actions) : null;\n        result.dir = this.dir;\n        result.dropCount = this.dropCount;\n        result.filtered = this.filtered;\n        result.iteratees = iteratees ? arrayCopy(iteratees) : null;\n        result.takeCount = this.takeCount;\n        result.views = views ? arrayCopy(views) : null;\n        return result;\n      }\n      /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n      function lazyReverse() {\n        if (this.filtered) {\n          var result = new LazyWrapper(this);\n          result.dir = -1;\n          result.filtered = true;\n        } else {\n          result = this.clone();\n          result.dir *= -1;\n        }\n        return result;\n      }\n      /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n      function lazyValue() {\n        var array = this.wrapped.value();\n        if (!isArray(array)) {\n          return baseWrapperValue(array, this.actions);\n        }\n        var dir = this.dir, isRight = dir < 0, view = getView(0, array.length, this.views), start = view.start, end = view.end, length = end - start, dropCount = this.dropCount, takeCount = nativeMin(length, this.takeCount - dropCount), index = isRight ? end : start - 1, iteratees = this.iteratees, iterLength = iteratees ? iteratees.length : 0, resIndex = 0, result = [];\n        outer:\n          while (length-- && resIndex < takeCount) {\n            index += dir;\n            var iterIndex = -1, value = array[index];\n            while (++iterIndex < iterLength) {\n              var data = iteratees[iterIndex], iteratee = data.iteratee, computed = iteratee(value, index, array), type = data.type;\n              if (type == LAZY_MAP_FLAG) {\n                value = computed;\n              } else if (!computed) {\n                if (type == LAZY_FILTER_FLAG) {\n                  continue outer;\n                } else {\n                  break outer;\n                }\n              }\n            }\n            if (dropCount) {\n              dropCount--;\n            } else {\n              result[resIndex++] = value;\n            }\n          }\n        return result;\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates a cache object to store key/value pairs.\n     *\n     * @private\n     * @static\n     * @name Cache\n     * @memberOf _.memoize\n     */\n      function MapCache() {\n        this.__data__ = {};\n      }\n      /**\n     * Removes `key` and its value from the cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n     */\n      function mapDelete(key) {\n        return this.has(key) && delete this.__data__[key];\n      }\n      /**\n     * Gets the cached value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the cached value.\n     */\n      function mapGet(key) {\n        return key == '__proto__' ? undefined : this.__data__[key];\n      }\n      /**\n     * Checks if a cached value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n      function mapHas(key) {\n        return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n      }\n      /**\n     * Adds `value` to `key` of the cache.\n     *\n     * @private\n     * @name set\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to cache.\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache object.\n     */\n      function mapSet(key, value) {\n        if (key != '__proto__') {\n          this.__data__[key] = value;\n        }\n        return this;\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     *\n     * Creates a cache object to store unique values.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     */\n      function SetCache(values) {\n        var length = values ? values.length : 0;\n        this.data = {\n          'hash': nativeCreate(null),\n          'set': new Set()\n        };\n        while (length--) {\n          this.push(values[length]);\n        }\n      }\n      /**\n     * Checks if `value` is in `cache` mimicking the return signature of\n     * `_.indexOf` by returning `0` if the value is found, else `-1`.\n     *\n     * @private\n     * @param {Object} cache The cache to search.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `0` if `value` is found, else `-1`.\n     */\n      function cacheIndexOf(cache, value) {\n        var data = cache.data, result = typeof value == 'string' || isObject(value) ? data.set.has(value) : data.hash[value];\n        return result ? 0 : -1;\n      }\n      /**\n     * Adds `value` to the cache.\n     *\n     * @private\n     * @name push\n     * @memberOf SetCache\n     * @param {*} value The value to cache.\n     */\n      function cachePush(value) {\n        var data = this.data;\n        if (typeof value == 'string' || isObject(value)) {\n          data.set.add(value);\n        } else {\n          data.hash[value] = true;\n        }\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n      function arrayCopy(source, array) {\n        var index = -1, length = source.length;\n        array || (array = Array(length));\n        while (++index < length) {\n          array[index] = source[index];\n        }\n        return array;\n      }\n      /**\n     * A specialized version of `_.forEach` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n      function arrayEach(array, iteratee) {\n        var index = -1, length = array.length;\n        while (++index < length) {\n          if (iteratee(array[index], index, array) === false) {\n            break;\n          }\n        }\n        return array;\n      }\n      /**\n     * A specialized version of `_.forEachRight` for arrays without support for\n     * callback shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n      function arrayEachRight(array, iteratee) {\n        var length = array.length;\n        while (length--) {\n          if (iteratee(array[length], length, array) === false) {\n            break;\n          }\n        }\n        return array;\n      }\n      /**\n     * A specialized version of `_.every` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     */\n      function arrayEvery(array, predicate) {\n        var index = -1, length = array.length;\n        while (++index < length) {\n          if (!predicate(array[index], index, array)) {\n            return false;\n          }\n        }\n        return true;\n      }\n      /**\n     * A specialized version of `_.filter` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n      function arrayFilter(array, predicate) {\n        var index = -1, length = array.length, resIndex = -1, result = [];\n        while (++index < length) {\n          var value = array[index];\n          if (predicate(value, index, array)) {\n            result[++resIndex] = value;\n          }\n        }\n        return result;\n      }\n      /**\n     * A specialized version of `_.map` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n      function arrayMap(array, iteratee) {\n        var index = -1, length = array.length, result = Array(length);\n        while (++index < length) {\n          result[index] = iteratee(array[index], index, array);\n        }\n        return result;\n      }\n      /**\n     * A specialized version of `_.max` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     */\n      function arrayMax(array) {\n        var index = -1, length = array.length, result = NEGATIVE_INFINITY;\n        while (++index < length) {\n          var value = array[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n        return result;\n      }\n      /**\n     * A specialized version of `_.min` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     */\n      function arrayMin(array) {\n        var index = -1, length = array.length, result = POSITIVE_INFINITY;\n        while (++index < length) {\n          var value = array[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n        return result;\n      }\n      /**\n     * A specialized version of `_.reduce` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the first element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n      function arrayReduce(array, iteratee, accumulator, initFromArray) {\n        var index = -1, length = array.length;\n        if (initFromArray && length) {\n          accumulator = array[++index];\n        }\n        while (++index < length) {\n          accumulator = iteratee(accumulator, array[index], index, array);\n        }\n        return accumulator;\n      }\n      /**\n     * A specialized version of `_.reduceRight` for arrays without support for\n     * callback shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the last element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n      function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n        var length = array.length;\n        if (initFromArray && length) {\n          accumulator = array[--length];\n        }\n        while (length--) {\n          accumulator = iteratee(accumulator, array[length], length, array);\n        }\n        return accumulator;\n      }\n      /**\n     * A specialized version of `_.some` for arrays without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n      function arraySome(array, predicate) {\n        var index = -1, length = array.length;\n        while (++index < length) {\n          if (predicate(array[index], index, array)) {\n            return true;\n          }\n        }\n        return false;\n      }\n      /**\n     * Used by `_.defaults` to customize its `_.assign` use.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n      function assignDefaults(objectValue, sourceValue) {\n        return typeof objectValue == 'undefined' ? sourceValue : objectValue;\n      }\n      /**\n     * Used by `_.template` to customize its `_.assign` use.\n     *\n     * **Note:** This method is like `assignDefaults` except that it ignores\n     * inherited property values when checking if a property is `undefined`.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @param {string} key The key associated with the object and source values.\n     * @param {Object} object The destination object.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n      function assignOwnDefaults(objectValue, sourceValue, key, object) {\n        return typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key) ? sourceValue : objectValue;\n      }\n      /**\n     * The base implementation of `_.assign` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @returns {Object} Returns the destination object.\n     */\n      function baseAssign(object, source, customizer) {\n        var props = keys(source);\n        if (!customizer) {\n          return baseCopy(source, object, props);\n        }\n        var index = -1, length = props.length;\n        while (++index < length) {\n          var key = props[index], value = object[key], result = customizer(value, source[key], key, object, source);\n          if ((result === result ? result !== value : value === value) || typeof value == 'undefined' && !(key in object)) {\n            object[key] = result;\n          }\n        }\n        return object;\n      }\n      /**\n     * The base implementation of `_.at` without support for strings and individual\n     * key arguments.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {number[]|string[]} [props] The property names or indexes of elements to pick.\n     * @returns {Array} Returns the new array of picked elements.\n     */\n      function baseAt(collection, props) {\n        var index = -1, length = collection.length, isArr = isLength(length), propsLength = props.length, result = Array(propsLength);\n        while (++index < propsLength) {\n          var key = props[index];\n          if (isArr) {\n            key = parseFloat(key);\n            result[index] = isIndex(key, length) ? collection[key] : undefined;\n          } else {\n            result[index] = collection[key];\n          }\n        }\n        return result;\n      }\n      /**\n     * Copies the properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Array} props The property names to copy.\n     * @returns {Object} Returns `object`.\n     */\n      function baseCopy(source, object, props) {\n        if (!props) {\n          props = object;\n          object = {};\n        }\n        var index = -1, length = props.length;\n        while (++index < length) {\n          var key = props[index];\n          object[key] = source[key];\n        }\n        return object;\n      }\n      /**\n     * The base implementation of `_.bindAll` without support for individual\n     * method name arguments.\n     *\n     * @private\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {string[]} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     */\n      function baseBindAll(object, methodNames) {\n        var index = -1, length = methodNames.length;\n        while (++index < length) {\n          var key = methodNames[index];\n          object[key] = createWrapper(object[key], BIND_FLAG, object);\n        }\n        return object;\n      }\n      /**\n     * The base implementation of `_.callback` which supports specifying the\n     * number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n      function baseCallback(func, thisArg, argCount) {\n        var type = typeof func;\n        if (type == 'function') {\n          return typeof thisArg != 'undefined' && isBindable(func) ? bindCallback(func, thisArg, argCount) : func;\n        }\n        if (func == null) {\n          return identity;\n        }\n        // Handle \"_.property\" and \"_.matches\" style callback shorthands.\n        return type == 'object' ? baseMatches(func) : baseProperty(func + '');\n      }\n      /**\n     * The base implementation of `_.clone` without support for argument juggling\n     * and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The object `value` belongs to.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n      function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n        var result;\n        if (customizer) {\n          result = object ? customizer(value, key, object) : customizer(value);\n        }\n        if (typeof result != 'undefined') {\n          return result;\n        }\n        if (!isObject(value)) {\n          return value;\n        }\n        var isArr = isArray(value);\n        if (isArr) {\n          result = initCloneArray(value);\n          if (!isDeep) {\n            return arrayCopy(value, result);\n          }\n        } else {\n          var tag = objToString.call(value), isFunc = tag == funcTag;\n          if (tag == objectTag || tag == argsTag || isFunc && !object) {\n            result = initCloneObject(isFunc ? {} : value);\n            if (!isDeep) {\n              return baseCopy(value, result, keys(value));\n            }\n          } else {\n            return cloneableTags[tag] ? initCloneByTag(value, tag, isDeep) : object ? value : {};\n          }\n        }\n        // Check for circular references and return corresponding clone.\n        stackA || (stackA = []);\n        stackB || (stackB = []);\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        // Add the source value to the stack of traversed objects and associate it with its clone.\n        stackA.push(value);\n        stackB.push(result);\n        // Recursively populate clone (susceptible to call stack limits).\n        (isArr ? arrayEach : baseForOwn)(value, function (subValue, key) {\n          result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n      var baseCreate = function () {\n          function Object() {\n          }\n          return function (prototype) {\n            if (isObject(prototype)) {\n              Object.prototype = prototype;\n              var result = new Object();\n              Object.prototype = null;\n            }\n            return result || context.Object();\n          };\n        }();\n      /**\n     * The base implementation of `_.delay` and `_.defer` which accepts an index\n     * of where to slice the arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Object} args The `arguments` object to slice and provide to `func`.\n     * @returns {number} Returns the timer id.\n     */\n      function baseDelay(func, wait, args, fromIndex) {\n        if (!isFunction(func)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return setTimeout(function () {\n          func.apply(undefined, baseSlice(args, fromIndex));\n        }, wait);\n      }\n      /**\n     * The base implementation of `_.difference` which accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n      function baseDifference(array, values) {\n        var length = array ? array.length : 0, result = [];\n        if (!length) {\n          return result;\n        }\n        var index = -1, indexOf = getIndexOf(), isCommon = indexOf == baseIndexOf, cache = isCommon && values.length >= 200 && createCache(values), valuesLength = values.length;\n        if (cache) {\n          indexOf = cacheIndexOf;\n          isCommon = false;\n          values = cache;\n        }\n        outer:\n          while (++index < length) {\n            var value = array[index];\n            if (isCommon && value === value) {\n              var valuesIndex = valuesLength;\n              while (valuesIndex--) {\n                if (values[valuesIndex] === value) {\n                  continue outer;\n                }\n              }\n              result.push(value);\n            } else if (indexOf(values, value) < 0) {\n              result.push(value);\n            }\n          }\n        return result;\n      }\n      /**\n     * The base implementation of `_.forEach` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n      function baseEach(collection, iteratee) {\n        var length = collection ? collection.length : 0;\n        if (!isLength(length)) {\n          return baseForOwn(collection, iteratee);\n        }\n        var index = -1, iterable = toObject(collection);\n        while (++index < length) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      }\n      /**\n     * The base implementation of `_.forEachRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n      function baseEachRight(collection, iteratee) {\n        var length = collection ? collection.length : 0;\n        if (!isLength(length)) {\n          return baseForOwnRight(collection, iteratee);\n        }\n        var iterable = toObject(collection);\n        while (length--) {\n          if (iteratee(iterable[length], length, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      }\n      /**\n     * The base implementation of `_.every` without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n      function baseEvery(collection, predicate) {\n        var result = true;\n        baseEach(collection, function (value, index, collection) {\n          result = !!predicate(value, index, collection);\n          return result;\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.filter` without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n      function baseFilter(collection, predicate) {\n        var result = [];\n        baseEach(collection, function (value, index, collection) {\n          if (predicate(value, index, collection)) {\n            result.push(value);\n          }\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n     * without support for callback shorthands and `this` binding, which iterates\n     * over `collection` using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @param {boolean} [retKey] Specify returning the key of the found element\n     *  instead of the element itself.\n     * @returns {*} Returns the found element or its key, else `undefined`.\n     */\n      function baseFind(collection, predicate, eachFunc, retKey) {\n        var result;\n        eachFunc(collection, function (value, key, collection) {\n          if (predicate(value, key, collection)) {\n            result = retKey ? key : value;\n            return false;\n          }\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.flatten` with added support for restricting\n     * flattening and specifying the start index.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param {boolean} [isStrict] Restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns the new flattened array.\n     */\n      function baseFlatten(array, isDeep, isStrict, fromIndex) {\n        var index = (fromIndex || 0) - 1, length = array.length, resIndex = -1, result = [];\n        while (++index < length) {\n          var value = array[index];\n          if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {\n            if (isDeep) {\n              // Recursively flatten arrays (susceptible to call stack limits).\n              value = baseFlatten(value, isDeep, isStrict);\n            }\n            var valIndex = -1, valLength = value.length;\n            result.length += valLength;\n            while (++valIndex < valLength) {\n              result[++resIndex] = value[valIndex];\n            }\n          } else if (!isStrict) {\n            result[++resIndex] = value;\n          }\n        }\n        return result;\n      }\n      /**\n     * The base implementation of `baseForIn` and `baseForOwn` which iterates\n     * over `object` properties returned by `keysFunc` invoking `iteratee` for\n     * each property. Iterator functions may exit iteration early by explicitly\n     * returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n      function baseFor(object, iteratee, keysFunc) {\n        var index = -1, iterable = toObject(object), props = keysFunc(object), length = props.length;\n        while (++index < length) {\n          var key = props[index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      }\n      /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n      function baseForRight(object, iteratee, keysFunc) {\n        var iterable = toObject(object), props = keysFunc(object), length = props.length;\n        while (length--) {\n          var key = props[length];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      }\n      /**\n     * The base implementation of `_.forIn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n      function baseForIn(object, iteratee) {\n        return baseFor(object, iteratee, keysIn);\n      }\n      /**\n     * The base implementation of `_.forOwn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n      function baseForOwn(object, iteratee) {\n        return baseFor(object, iteratee, keys);\n      }\n      /**\n     * The base implementation of `_.forOwnRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n      function baseForOwnRight(object, iteratee) {\n        return baseForRight(object, iteratee, keys);\n      }\n      /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from those provided.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the new array of filtered property names.\n     */\n      function baseFunctions(object, props) {\n        var index = -1, length = props.length, resIndex = -1, result = [];\n        while (++index < length) {\n          var key = props[index];\n          if (isFunction(object[key])) {\n            result[++resIndex] = key;\n          }\n        }\n        return result;\n      }\n      /**\n     * The base implementation of `_.invoke` which requires additional arguments\n     * to be provided as an array of arguments rather than individually.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {Array} [args] The arguments to invoke the method with.\n     * @returns {Array} Returns the array of results.\n     */\n      function baseInvoke(collection, methodName, args) {\n        var index = -1, isFunc = typeof methodName == 'function', length = collection ? collection.length : 0, result = isLength(length) ? Array(length) : [];\n        baseEach(collection, function (value) {\n          var func = isFunc ? methodName : value != null && value[methodName];\n          result[++index] = func ? func.apply(value, args) : undefined;\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.isEqual` without support for `this` binding\n     * `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isWhere] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n      function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) {\n        // Exit early for identical values.\n        if (value === other) {\n          // Treat `+0` vs. `-0` as not equal.\n          return value !== 0 || 1 / value == 1 / other;\n        }\n        var valType = typeof value, othType = typeof other;\n        // Exit early for unlike primitive values.\n        if (valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object' || value == null || other == null) {\n          // Return `false` unless both values are `NaN`.\n          return value !== value && other !== other;\n        }\n        return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB);\n      }\n      /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @param {boolean} [isWhere] Specify performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n      function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) {\n        var objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, othTag = arrayTag;\n        if (!objIsArr) {\n          objTag = objToString.call(object);\n          if (objTag == argsTag) {\n            objTag = objectTag;\n          } else if (objTag != objectTag) {\n            objIsArr = isTypedArray(object);\n          }\n        }\n        if (!othIsArr) {\n          othTag = objToString.call(other);\n          if (othTag == argsTag) {\n            othTag = objectTag;\n          } else if (othTag != objectTag) {\n            othIsArr = isTypedArray(other);\n          }\n        }\n        var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;\n        if (isSameTag && !(objIsArr || objIsObj)) {\n          return equalByTag(object, other, objTag);\n        }\n        var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n        if (valWrapped || othWrapped) {\n          return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB);\n        }\n        if (!isSameTag) {\n          return false;\n        }\n        // Assume cyclic values are equal.\n        // For more information on detecting circular references see https://es5.github.io/#JO.\n        stackA || (stackA = []);\n        stackB || (stackB = []);\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == object) {\n            return stackB[length] == other;\n          }\n        }\n        // Add `object` and `other` to the stack of traversed objects.\n        stackA.push(object);\n        stackB.push(other);\n        var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB);\n        stackA.pop();\n        stackB.pop();\n        return result;\n      }\n      /**\n     * The base implementation of `_.isMatch` without support for callback\n     * shorthands or `this` binding.\n     *\n     * @private\n     * @param {Object} source The object to inspect.\n     * @param {Array} props The source property names to match.\n     * @param {Array} values The source values to match.\n     * @param {Array} strictCompareFlags Strict comparison flags for source values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n      function baseIsMatch(object, props, values, strictCompareFlags, customizer) {\n        var length = props.length;\n        if (object == null) {\n          return !length;\n        }\n        var index = -1, noCustomizer = !customizer;\n        while (++index < length) {\n          if (noCustomizer && strictCompareFlags[index] ? values[index] !== object[props[index]] : !hasOwnProperty.call(object, props[index])) {\n            return false;\n          }\n        }\n        index = -1;\n        while (++index < length) {\n          var key = props[index];\n          if (noCustomizer && strictCompareFlags[index]) {\n            var result = hasOwnProperty.call(object, key);\n          } else {\n            var objValue = object[key], srcValue = values[index];\n            result = customizer ? customizer(objValue, srcValue, key) : undefined;\n            if (typeof result == 'undefined') {\n              result = baseIsEqual(srcValue, objValue, customizer, true);\n            }\n          }\n          if (!result) {\n            return false;\n          }\n        }\n        return true;\n      }\n      /**\n     * The base implementation of `_.map` without support for callback shorthands\n     * or `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n      function baseMap(collection, iteratee) {\n        var result = [];\n        baseEach(collection, function (value, key, collection) {\n          result.push(iteratee(value, key, collection));\n        });\n        return result;\n      }\n      /**\n     * The base implementation of `_.matches` which supports specifying whether\n     * `source` should be cloned.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     */\n      function baseMatches(source) {\n        var props = keys(source), length = props.length;\n        if (length == 1) {\n          var key = props[0], value = source[key];\n          if (isStrictComparable(value)) {\n            return function (object) {\n              return object != null && value === object[key] && hasOwnProperty.call(object, key);\n            };\n          }\n        }\n        var values = Array(length), strictCompareFlags = Array(length);\n        while (length--) {\n          value = source[props[length]];\n          values[length] = value;\n          strictCompareFlags[length] = isStrictComparable(value);\n        }\n        return function (object) {\n          return baseIsMatch(object, props, values, strictCompareFlags);\n        };\n      }\n      /**\n     * The base implementation of `_.merge` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {Object} Returns the destination object.\n     */\n      function baseMerge(object, source, customizer, stackA, stackB) {\n        var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));\n        (isSrcArr ? arrayEach : baseForOwn)(source, function (srcValue, key, source) {\n          if (isObjectLike(srcValue)) {\n            stackA || (stackA = []);\n            stackB || (stackB = []);\n            return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n          }\n          var value = object[key], result = customizer ? customizer(value, srcValue, key, object, source) : undefined, isCommon = typeof result == 'undefined';\n          if (isCommon) {\n            result = srcValue;\n          }\n          if ((isSrcArr || typeof result != 'undefined') && (isCommon || (result === result ? result !== value : value === value))) {\n            object[key] = result;\n          }\n        });\n        return object;\n      }\n      /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n      function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n        var length = stackA.length, srcValue = source[key];\n        while (length--) {\n          if (stackA[length] == srcValue) {\n            object[key] = stackB[length];\n            return;\n          }\n        }\n        var value = object[key], result = customizer ? customizer(value, srcValue, key, object, source) : undefined, isCommon = typeof result == 'undefined';\n        if (isCommon) {\n          result = srcValue;\n          if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {\n            result = isArray(value) ? value : value ? arrayCopy(value) : [];\n          } else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n            result = isArguments(value) ? toPlainObject(value) : isPlainObject(value) ? value : {};\n          } else {\n            isCommon = false;\n          }\n        }\n        // Add the source value to the stack of traversed objects and associate\n        // it with its merged value.\n        stackA.push(srcValue);\n        stackB.push(result);\n        if (isCommon) {\n          // Recursively merge objects and arrays (susceptible to call stack limits).\n          object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n        } else if (result === result ? result !== value : value === value) {\n          object[key] = result;\n        }\n      }\n      /**\n     * The base implementation of `_.property` which does not coerce `key` to a string.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     */\n      function baseProperty(key) {\n        return function (object) {\n          return object == null ? undefined : object[key];\n        };\n      }\n      /**\n     * The base implementation of `_.pullAt` without support for individual\n     * index arguments.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     */\n      function basePullAt(array, indexes) {\n        var length = indexes.length, result = baseAt(array, indexes);\n        indexes.sort(baseCompareAscending);\n        while (length--) {\n          var index = parseFloat(indexes[length]);\n          if (index != previous && isIndex(index)) {\n            var previous = index;\n            splice.call(array, index, 1);\n          }\n        }\n        return result;\n      }\n      /**\n     * The base implementation of `_.random` without support for argument juggling\n     * and returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns the random number.\n     */\n      function baseRandom(min, max) {\n        return min + floor(nativeRandom() * (max - min + 1));\n      }\n      /**\n     * The base implementation of `_.reduce` and `_.reduceRight` without support\n     * for callback shorthands or `this` binding, which iterates over `collection`\n     * using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} accumulator The initial value.\n     * @param {boolean} initFromCollection Specify using the first or last element\n     *  of `collection` as the initial value.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @returns {*} Returns the accumulated value.\n     */\n      function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n        eachFunc(collection, function (value, index, collection) {\n          accumulator = initFromCollection ? (initFromCollection = false, value) : iteratee(accumulator, value, index, collection);\n        });\n        return accumulator;\n      }\n      /**\n     * The base implementation of `setData` without support for hot loop detection.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n      var baseSetData = !metaMap ? identity : function (func, data) {\n          metaMap.set(func, data);\n          return func;\n        };\n      /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n      function baseSlice(array, start, end) {\n        var index = -1, length = array.length;\n        start = start == null ? 0 : +start || 0;\n        if (start < 0) {\n          start = -start > length ? 0 : length + start;\n        }\n        end = typeof end == 'undefined' || end > length ? length : +end || 0;\n        if (end < 0) {\n          end += length;\n        }\n        length = start > end ? 0 : end - start >>> 0;\n        start >>>= 0;\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = array[index + start];\n        }\n        return result;\n      }\n      /**\n     * The base implementation of `_.some` without support for callback shorthands\n     * or `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n      function baseSome(collection, predicate) {\n        var result;\n        baseEach(collection, function (value, index, collection) {\n          result = predicate(value, index, collection);\n          return !result;\n        });\n        return !!result;\n      }\n      /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The function invoked per iteration.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     */\n      function baseUniq(array, iteratee) {\n        var index = -1, indexOf = getIndexOf(), length = array.length, isCommon = indexOf == baseIndexOf, isLarge = isCommon && length >= 200, seen = isLarge && createCache(), result = [];\n        if (seen) {\n          indexOf = cacheIndexOf;\n          isCommon = false;\n        } else {\n          isLarge = false;\n          seen = iteratee ? [] : result;\n        }\n        outer:\n          while (++index < length) {\n            var value = array[index], computed = iteratee ? iteratee(value, index, array) : value;\n            if (isCommon && value === value) {\n              var seenIndex = seen.length;\n              while (seenIndex--) {\n                if (seen[seenIndex] === computed) {\n                  continue outer;\n                }\n              }\n              if (iteratee) {\n                seen.push(computed);\n              }\n              result.push(value);\n            } else if (indexOf(seen, computed) < 0) {\n              if (iteratee || isLarge) {\n                seen.push(computed);\n              }\n              result.push(value);\n            }\n          }\n        return result;\n      }\n      /**\n     * The base implementation of `_.values` and `_.valuesIn` which creates an\n     * array of `object` property values corresponding to the property names\n     * returned by `keysFunc`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} props The property names to get values for.\n     * @returns {Object} Returns the array of property values.\n     */\n      function baseValues(object, props) {\n        var index = -1, length = props.length, result = Array(length);\n        while (++index < length) {\n          result[index] = object[props[index]];\n        }\n        return result;\n      }\n      /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to peform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved unwrapped value.\n     */\n      function baseWrapperValue(value, actions) {\n        var result = value;\n        if (result instanceof LazyWrapper) {\n          result = result.value();\n        }\n        var index = -1, length = actions.length;\n        while (++index < length) {\n          var args = [result], action = actions[index];\n          push.apply(args, action.args);\n          result = action.func.apply(action.thisArg, args);\n        }\n        return result;\n      }\n      /**\n     * Performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest, instead\n     *  of the lowest, index at which a value should be inserted into `array`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n      function binaryIndex(array, value, retHighest) {\n        var low = 0, high = array ? array.length : low;\n        if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n          while (low < high) {\n            var mid = low + high >>> 1, computed = array[mid];\n            if (retHighest ? computed <= value : computed < value) {\n              low = mid + 1;\n            } else {\n              high = mid;\n            }\n          }\n          return high;\n        }\n        return binaryIndexBy(array, value, identity, retHighest);\n      }\n      /**\n     * This function is like `binaryIndex` except that it invokes `iteratee` for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [retHighest] Specify returning the highest, instead\n     *  of the lowest, index at which a value should be inserted into `array`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n      function binaryIndexBy(array, value, iteratee, retHighest) {\n        value = iteratee(value);\n        var low = 0, high = array ? array.length : 0, valIsNaN = value !== value, valIsUndef = typeof value == 'undefined';\n        while (low < high) {\n          var mid = floor((low + high) / 2), computed = iteratee(array[mid]), isReflexive = computed === computed;\n          if (valIsNaN) {\n            var setLow = isReflexive || retHighest;\n          } else if (valIsUndef) {\n            setLow = isReflexive && (retHighest || typeof computed != 'undefined');\n          } else {\n            setLow = retHighest ? computed <= value : computed < value;\n          }\n          if (setLow) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return nativeMin(high, MAX_ARRAY_INDEX);\n      }\n      /**\n     * A specialized version of `baseCallback` which only supports `this` binding\n     * and specifying the number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n      function bindCallback(func, thisArg, argCount) {\n        if (typeof func != 'function') {\n          return identity;\n        }\n        if (typeof thisArg == 'undefined') {\n          return func;\n        }\n        switch (argCount) {\n        case 1:\n          return function (value) {\n            return func.call(thisArg, value);\n          };\n        case 3:\n          return function (value, index, collection) {\n            return func.call(thisArg, value, index, collection);\n          };\n        case 4:\n          return function (accumulator, value, index, collection) {\n            return func.call(thisArg, accumulator, value, index, collection);\n          };\n        case 5:\n          return function (value, other, key, object, source) {\n            return func.call(thisArg, value, other, key, object, source);\n          };\n        }\n        return function () {\n          return func.apply(thisArg, arguments);\n        };\n      }\n      /**\n     * Creates a clone of the given array buffer.\n     *\n     * @private\n     * @param {ArrayBuffer} buffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n      function bufferClone(buffer) {\n        return bufferSlice.call(buffer, 0);\n      }\n      if (!bufferSlice) {\n        // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.\n        bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function (buffer) {\n          var byteLength = buffer.byteLength, floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0, offset = floatLength * FLOAT64_BYTES_PER_ELEMENT, result = new ArrayBuffer(byteLength);\n          if (floatLength) {\n            var view = new Float64Array(result, 0, floatLength);\n            view.set(new Float64Array(buffer, 0, floatLength));\n          }\n          if (byteLength != offset) {\n            view = new Uint8Array(result, offset);\n            view.set(new Uint8Array(buffer, offset));\n          }\n          return result;\n        };\n      }\n      /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n      function composeArgs(args, partials, holders) {\n        var holdersLength = holders.length, argsIndex = -1, argsLength = nativeMax(args.length - holdersLength, 0), leftIndex = -1, leftLength = partials.length, result = Array(argsLength + leftLength);\n        while (++leftIndex < leftLength) {\n          result[leftIndex] = partials[leftIndex];\n        }\n        while (++argsIndex < holdersLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n        while (argsLength--) {\n          result[leftIndex++] = args[argsIndex++];\n        }\n        return result;\n      }\n      /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n      function composeArgsRight(args, partials, holders) {\n        var holdersIndex = -1, holdersLength = holders.length, argsIndex = -1, argsLength = nativeMax(args.length - holdersLength, 0), rightIndex = -1, rightLength = partials.length, result = Array(argsLength + rightLength);\n        while (++argsIndex < argsLength) {\n          result[argsIndex] = args[argsIndex];\n        }\n        var pad = argsIndex;\n        while (++rightIndex < rightLength) {\n          result[pad + rightIndex] = partials[rightIndex];\n        }\n        while (++holdersIndex < holdersLength) {\n          result[pad + holders[holdersIndex]] = args[argsIndex++];\n        }\n        return result;\n      }\n      /**\n     * Creates a function that aggregates a collection, creating an accumulator\n     * object composed from the results of running each element in the collection\n     * through an iteratee. The `setter` sets the keys and values of the accumulator\n     * object. If `initializer` is provided initializes the accumulator object.\n     *\n     * @private\n     * @param {Function} setter The function to set keys and values of the accumulator object.\n     * @param {Function} [initializer] The function to initialize the accumulator object.\n     * @returns {Function} Returns the new aggregator function.\n     */\n      function createAggregator(setter, initializer) {\n        return function (collection, iteratee, thisArg) {\n          var result = initializer ? initializer() : {};\n          iteratee = getCallback(iteratee, thisArg, 3);\n          if (isArray(collection)) {\n            var index = -1, length = collection.length;\n            while (++index < length) {\n              var value = collection[index];\n              setter(result, value, iteratee(value, index, collection), collection);\n            }\n          } else {\n            baseEach(collection, function (value, key, collection) {\n              setter(result, value, iteratee(value, key, collection), collection);\n            });\n          }\n          return result;\n        };\n      }\n      /**\n     * Creates a function that assigns properties of source object(s) to a given\n     * destination object.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n      function createAssigner(assigner) {\n        return function () {\n          var length = arguments.length, object = arguments[0];\n          if (length < 2 || object == null) {\n            return object;\n          }\n          if (length > 3 && isIterateeCall(arguments[1], arguments[2], arguments[3])) {\n            length = 2;\n          }\n          // Juggle arguments.\n          if (length > 3 && typeof arguments[length - 2] == 'function') {\n            var customizer = bindCallback(arguments[--length - 1], arguments[length--], 5);\n          } else if (length > 2 && typeof arguments[length - 1] == 'function') {\n            customizer = arguments[--length];\n          }\n          var index = 0;\n          while (++index < length) {\n            var source = arguments[index];\n            if (source) {\n              assigner(object, source, customizer);\n            }\n          }\n          return object;\n        };\n      }\n      /**\n     * Creates a function that wraps `func` and invokes it with the `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new bound function.\n     */\n      function createBindWrapper(func, thisArg) {\n        var Ctor = createCtorWrapper(func);\n        function wrapper() {\n          return (this instanceof wrapper ? Ctor : func).apply(thisArg, arguments);\n        }\n        return wrapper;\n      }\n      /**\n     * Creates a `Set` cache object to optimize linear searches of large arrays.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n     */\n      var createCache = !(nativeCreate && Set) ? constant(null) : function (values) {\n          return new SetCache(values);\n        };\n      /**\n     * Creates a function that produces compound words out of the words in a\n     * given string.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n      function createCompounder(callback) {\n        return function (string) {\n          var index = -1, array = words(deburr(string)), length = array.length, result = '';\n          while (++index < length) {\n            result = callback(result, array[index], index);\n          }\n          return result;\n        };\n      }\n      /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n      function createCtorWrapper(Ctor) {\n        return function () {\n          var thisBinding = baseCreate(Ctor.prototype), result = Ctor.apply(thisBinding, arguments);\n          // Mimic the constructor's `return` behavior.\n          // See https://es5.github.io/#x13.2.2 for more details.\n          return isObject(result) ? result : thisBinding;\n        };\n      }\n      /**\n     * Creates a function that gets the extremum value of a collection.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to get the extremum value from an array.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,\n     *  extremum value.\n     * @returns {Function} Returns the new extremum function.\n     */\n      function createExtremum(arrayFunc, isMin) {\n        return function (collection, iteratee, thisArg) {\n          if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n            iteratee = null;\n          }\n          var func = getCallback(), noIteratee = iteratee == null;\n          if (!(func === baseCallback && noIteratee)) {\n            noIteratee = false;\n            iteratee = func(iteratee, thisArg, 3);\n          }\n          if (noIteratee) {\n            var isArr = isArray(collection);\n            if (!isArr && isString(collection)) {\n              iteratee = charAtCallback;\n            } else {\n              return arrayFunc(isArr ? collection : toIterable(collection));\n            }\n          }\n          return extremumBy(collection, iteratee, isMin);\n        };\n      }\n      /**\n     * Creates a function that wraps `func` and invokes it with optional `this`\n     * binding of, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n      function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n        var isAry = bitmask & ARY_FLAG, isBind = bitmask & BIND_FLAG, isBindKey = bitmask & BIND_KEY_FLAG, isCurry = bitmask & CURRY_FLAG, isCurryBound = bitmask & CURRY_BOUND_FLAG, isCurryRight = bitmask & CURRY_RIGHT_FLAG;\n        var Ctor = !isBindKey && createCtorWrapper(func), key = func;\n        function wrapper() {\n          // Avoid `arguments` object use disqualifying optimizations by\n          // converting it to an array before providing it to other functions.\n          var length = arguments.length, index = length, args = Array(length);\n          while (index--) {\n            args[index] = arguments[index];\n          }\n          if (partials) {\n            args = composeArgs(args, partials, holders);\n          }\n          if (partialsRight) {\n            args = composeArgsRight(args, partialsRight, holdersRight);\n          }\n          if (isCurry || isCurryRight) {\n            var placeholder = wrapper.placeholder, argsHolders = replaceHolders(args, placeholder);\n            length -= argsHolders.length;\n            if (length < arity) {\n              var newArgPos = argPos ? arrayCopy(argPos) : null, newArity = nativeMax(arity - length, 0), newsHolders = isCurry ? argsHolders : null, newHoldersRight = isCurry ? null : argsHolders, newPartials = isCurry ? args : null, newPartialsRight = isCurry ? null : args;\n              bitmask |= isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG;\n              bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n              if (!isCurryBound) {\n                bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n              }\n              var result = createHybridWrapper(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity);\n              result.placeholder = placeholder;\n              return result;\n            }\n          }\n          var thisBinding = isBind ? thisArg : this;\n          if (isBindKey) {\n            func = thisBinding[key];\n          }\n          if (argPos) {\n            args = reorder(args, argPos);\n          }\n          if (isAry && ary < args.length) {\n            args.length = ary;\n          }\n          return (this instanceof wrapper ? Ctor || createCtorWrapper(func) : func).apply(thisBinding, args);\n        }\n        return wrapper;\n      }\n      /**\n     * Creates the pad required for `string` based on the given padding length.\n     * The `chars` string may be truncated if the number of padding characters\n     * exceeds the padding length.\n     *\n     * @private\n     * @param {string} string The string to create padding for.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the pad for `string`.\n     */\n      function createPad(string, length, chars) {\n        var strLength = string.length;\n        length = +length;\n        if (strLength >= length || !nativeIsFinite(length)) {\n          return '';\n        }\n        var padLength = length - strLength;\n        chars = chars == null ? ' ' : chars + '';\n        return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);\n      }\n      /**\n     * Creates a function that wraps `func` and invokes it with the optional `this`\n     * binding of `thisArg` and the `partials` prepended to those provided to\n     * the wrapper.\n     *\n     * @private\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to the new function.\n     * @returns {Function} Returns the new bound function.\n     */\n      function createPartialWrapper(func, bitmask, thisArg, partials) {\n        var isBind = bitmask & BIND_FLAG, Ctor = createCtorWrapper(func);\n        function wrapper() {\n          // Avoid `arguments` object use disqualifying optimizations by\n          // converting it to an array before providing it `func`.\n          var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array(argsLength + leftLength);\n          while (++leftIndex < leftLength) {\n            args[leftIndex] = partials[leftIndex];\n          }\n          while (argsLength--) {\n            args[leftIndex++] = arguments[++argsIndex];\n          }\n          return (this instanceof wrapper ? Ctor : func).apply(isBind ? thisArg : this, args);\n        }\n        return wrapper;\n      }\n      /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags.\n     *  The bitmask may be composed of the following flags:\n     *     1 - `_.bind`\n     *     2 - `_.bindKey`\n     *     4 - `_.curry` or `_.curryRight` of a bound function\n     *     8 - `_.curry`\n     *    16 - `_.curryRight`\n     *    32 - `_.partial`\n     *    64 - `_.partialRight`\n     *   128 - `_.rearg`\n     *   256 - `_.ary`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n      function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n        var isBindKey = bitmask & BIND_KEY_FLAG;\n        if (!isBindKey && !isFunction(func)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        var length = partials ? partials.length : 0;\n        if (!length) {\n          bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n          partials = holders = null;\n        }\n        length -= holders ? holders.length : 0;\n        if (bitmask & PARTIAL_RIGHT_FLAG) {\n          var partialsRight = partials, holdersRight = holders;\n          partials = holders = null;\n        }\n        var data = !isBindKey && getData(func), newData = [\n            func,\n            bitmask,\n            thisArg,\n            partials,\n            holders,\n            partialsRight,\n            holdersRight,\n            argPos,\n            ary,\n            arity\n          ];\n        if (data && data !== true) {\n          mergeData(newData, data);\n          bitmask = newData[1];\n          arity = newData[9];\n        }\n        newData[9] = arity == null ? isBindKey ? 0 : func.length : nativeMax(arity - length, 0) || 0;\n        if (bitmask == BIND_FLAG) {\n          var result = createBindWrapper(newData[0], newData[2]);\n        } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n          result = createPartialWrapper.apply(null, newData);\n        } else {\n          result = createHybridWrapper.apply(null, newData);\n        }\n        var setter = data ? baseSetData : setData;\n        return setter(result, newData);\n      }\n      /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing arrays.\n     * @param {boolean} [isWhere] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n      function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) {\n        var index = -1, arrLength = array.length, othLength = other.length, result = true;\n        if (arrLength != othLength && !(isWhere && othLength > arrLength)) {\n          return false;\n        }\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (result && ++index < arrLength) {\n          var arrValue = array[index], othValue = other[index];\n          result = undefined;\n          if (customizer) {\n            result = isWhere ? customizer(othValue, arrValue, index) : customizer(arrValue, othValue, index);\n          }\n          if (typeof result == 'undefined') {\n            // Recursively compare arrays (susceptible to call stack limits).\n            if (isWhere) {\n              var othIndex = othLength;\n              while (othIndex--) {\n                othValue = other[othIndex];\n                result = arrValue && arrValue === othValue || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);\n                if (result) {\n                  break;\n                }\n              }\n            } else {\n              result = arrValue && arrValue === othValue || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);\n            }\n          }\n        }\n        return !!result;\n      }\n      /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} value The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n      function equalByTag(object, other, tag) {\n        switch (tag) {\n        case boolTag:\n        case dateTag:\n          // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n          return +object == +other;\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n        case numberTag:\n          // Treat `NaN` vs. `NaN` as equal.\n          return object != +object ? other != +other : object == 0 ? 1 / object == 1 / other : object == +other;\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings primitives and string\n          // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n          return object == other + '';\n        }\n        return false;\n      }\n      /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isWhere] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n      function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) {\n        var objProps = keys(object), objLength = objProps.length, othProps = keys(other), othLength = othProps.length;\n        if (objLength != othLength && !isWhere) {\n          return false;\n        }\n        var hasCtor, index = -1;\n        while (++index < objLength) {\n          var key = objProps[index], result = hasOwnProperty.call(other, key);\n          if (result) {\n            var objValue = object[key], othValue = other[key];\n            result = undefined;\n            if (customizer) {\n              result = isWhere ? customizer(othValue, objValue, key) : customizer(objValue, othValue, key);\n            }\n            if (typeof result == 'undefined') {\n              // Recursively compare objects (susceptible to call stack limits).\n              result = objValue && objValue === othValue || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB);\n            }\n          }\n          if (!result) {\n            return false;\n          }\n          hasCtor || (hasCtor = key == 'constructor');\n        }\n        if (!hasCtor) {\n          var objCtor = object.constructor, othCtor = other.constructor;\n          // Non `Object` object instances with different constructors are not equal.\n          if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n            return false;\n          }\n        }\n        return true;\n      }\n      /**\n     * Gets the extremum value of `collection` invoking `iteratee` for each value\n     * in `collection` to generate the criterion by which the value is ranked.\n     * The `iteratee` is invoked with three arguments; (value, index, collection).\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the\n     *  maximum, extremum value.\n     * @returns {*} Returns the extremum value.\n     */\n      function extremumBy(collection, iteratee, isMin) {\n        var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY, computed = exValue, result = computed;\n        baseEach(collection, function (value, index, collection) {\n          var current = iteratee(value, index, collection);\n          if ((isMin ? current < computed : current > computed) || current === exValue && current === result) {\n            computed = current;\n            result = value;\n          }\n        });\n        return result;\n      }\n      /**\n     * Gets the appropriate \"callback\" function. If the `_.callback` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseCallback` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function} Returns the chosen function or its result.\n     */\n      function getCallback(func, thisArg, argCount) {\n        var result = lodash.callback || callback;\n        result = result === callback ? baseCallback : result;\n        return argCount ? result(func, thisArg, argCount) : result;\n      }\n      /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n      var getData = !metaMap ? noop : function (func) {\n          return metaMap.get(func);\n        };\n      /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseIndexOf` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function|number} Returns the chosen function or its result.\n     */\n      function getIndexOf(collection, target, fromIndex) {\n        var result = lodash.indexOf || indexOf;\n        result = result === indexOf ? baseIndexOf : result;\n        return collection ? result(collection, target, fromIndex) : result;\n      }\n      /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} [transforms] The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n      function getView(start, end, transforms) {\n        var index = -1, length = transforms ? transforms.length : 0;\n        while (++index < length) {\n          var data = transforms[index], size = data.size;\n          switch (data.type) {\n          case 'drop':\n            start += size;\n            break;\n          case 'dropRight':\n            end -= size;\n            break;\n          case 'take':\n            end = nativeMin(end, start + size);\n            break;\n          case 'takeRight':\n            start = nativeMax(start, end - size);\n            break;\n          }\n        }\n        return {\n          'start': start,\n          'end': end\n        };\n      }\n      /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n      function initCloneArray(array) {\n        var length = array.length, result = new array.constructor(length);\n        // Add array properties assigned by `RegExp#exec`.\n        if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n          result.index = array.index;\n          result.input = array.input;\n        }\n        return result;\n      }\n      /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n      function initCloneObject(object) {\n        var Ctor = object.constructor;\n        if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n          Ctor = Object;\n        }\n        return new Ctor();\n      }\n      /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n      function initCloneByTag(object, tag, isDeep) {\n        var Ctor = object.constructor;\n        switch (tag) {\n        case arrayBufferTag:\n          return bufferClone(object);\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n        case float32Tag:\n        case float64Tag:\n        case int8Tag:\n        case int16Tag:\n        case int32Tag:\n        case uint8Tag:\n        case uint8ClampedTag:\n        case uint16Tag:\n        case uint32Tag:\n          var buffer = object.buffer;\n          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n        case regexpTag:\n          var result = new Ctor(object.source, reFlags.exec(object));\n          result.lastIndex = object.lastIndex;\n        }\n        return result;\n      }\n      /**\n     * Checks if `func` is eligible for `this` binding.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is eligible, else `false`.\n     */\n      function isBindable(func) {\n        var support = lodash.support, result = !(support.funcNames ? func.name : support.funcDecomp);\n        if (!result) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            result = !reFuncName.test(source);\n          }\n          if (!result) {\n            // Check if `func` references the `this` keyword and store the result.\n            result = reThis.test(source) || isNative(func);\n            baseSetData(func, result);\n          }\n        }\n        return result;\n      }\n      /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n      function isIndex(value, length) {\n        value = +value;\n        length = length == null ? MAX_SAFE_INTEGER : length;\n        return value > -1 && value % 1 == 0 && value < length;\n      }\n      /**\n     * Checks if the provided arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n     */\n      function isIterateeCall(value, index, object) {\n        if (!isObject(object)) {\n          return false;\n        }\n        var type = typeof index;\n        if (type == 'number') {\n          var length = object.length, prereq = isLength(length) && isIndex(index, length);\n        } else {\n          prereq = type == 'string' && index in object;\n        }\n        return prereq && object[index] === value;\n      }\n      /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This function is based on ES `ToLength`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n     * for more details.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     */\n      function isLength(value) {\n        return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n      }\n      /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n      function isStrictComparable(value) {\n        return value === value && (value === 0 ? 1 / value > 0 : !isObject(value));\n      }\n      /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers required to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n     * augment function arguments, making the order in which they are executed important,\n     * preventing the merging of metadata. However, we make an exception for a safe\n     * common case where curried functions have `_.ary` and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n      function mergeData(data, source) {\n        var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask;\n        var arityFlags = ARY_FLAG | REARG_FLAG, bindFlags = BIND_FLAG | BIND_KEY_FLAG, comboFlags = arityFlags | bindFlags | CURRY_BOUND_FLAG | CURRY_RIGHT_FLAG;\n        var isAry = bitmask & ARY_FLAG && !(srcBitmask & ARY_FLAG), isRearg = bitmask & REARG_FLAG && !(srcBitmask & REARG_FLAG), argPos = (isRearg ? data : source)[7], ary = (isAry ? data : source)[8];\n        var isCommon = !(bitmask >= REARG_FLAG && srcBitmask > bindFlags) && !(bitmask > bindFlags && srcBitmask >= REARG_FLAG);\n        var isCombo = newBitmask >= arityFlags && newBitmask <= comboFlags && (bitmask < REARG_FLAG || (isRearg || isAry) && argPos.length <= ary);\n        // Exit early if metadata can't be merged.\n        if (!(isCommon || isCombo)) {\n          return data;\n        }\n        // Use source `thisArg` if available.\n        if (srcBitmask & BIND_FLAG) {\n          data[2] = source[2];\n          // Set when currying a bound function.\n          newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;\n        }\n        // Compose partial arguments.\n        var value = source[3];\n        if (value) {\n          var partials = data[3];\n          data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n          data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n        }\n        // Compose partial right arguments.\n        value = source[5];\n        if (value) {\n          partials = data[5];\n          data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n          data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n        }\n        // Use source `argPos` if available.\n        value = source[7];\n        if (value) {\n          data[7] = arrayCopy(value);\n        }\n        // Use source `ary` if it's smaller.\n        if (srcBitmask & ARY_FLAG) {\n          data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n        }\n        // Use source `arity` if one is not provided.\n        if (data[9] == null) {\n          data[9] = source[9];\n        }\n        // Use source `func` and merge bitmasks.\n        data[0] = source[0];\n        data[1] = newBitmask;\n        return data;\n      }\n      /**\n     * A specialized version of `_.pick` that picks `object` properties specified\n     * by the `props` array.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} props The property names to pick.\n     * @returns {Object} Returns the new object.\n     */\n      function pickByArray(object, props) {\n        object = toObject(object);\n        var index = -1, length = props.length, result = {};\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n        return result;\n      }\n      /**\n     * A specialized version of `_.pick` that picks `object` properties `predicate`\n     * returns truthy for.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Object} Returns the new object.\n     */\n      function pickByCallback(object, predicate) {\n        var result = {};\n        baseForIn(object, function (value, key, object) {\n          if (predicate(value, key, object)) {\n            result[key] = value;\n          }\n        });\n        return result;\n      }\n      /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n      function reorder(array, indexes) {\n        var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = arrayCopy(array);\n        while (length--) {\n          var index = indexes[length];\n          array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n        }\n        return array;\n      }\n      /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity function\n     * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n      var setData = function () {\n          var count = 0, lastCalled = 0;\n          return function (key, value) {\n            var stamp = now(), remaining = HOT_SPAN - (stamp - lastCalled);\n            lastCalled = stamp;\n            if (remaining > 0) {\n              if (++count >= HOT_COUNT) {\n                return key;\n              }\n            } else {\n              count = 0;\n            }\n            return baseSetData(key, value);\n          };\n        }();\n      /**\n     * A fallback implementation of `_.isPlainObject` which checks if `value`\n     * is an object created by the `Object` constructor or has a `[[Prototype]]`\n     * of `null`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n      function shimIsPlainObject(value) {\n        var Ctor, support = lodash.support;\n        // Exit early for non `Object` objects.\n        if (!(isObjectLike(value) && objToString.call(value) == objectTag) || !hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor))) {\n          return false;\n        }\n        // IE < 9 iterates inherited properties before own properties. If the first\n        // iterated property is an object's own property then there are no inherited\n        // enumerable properties.\n        var result;\n        // In most environments an object's own properties are iterated before\n        // its inherited properties. If the last iterated property is an object's\n        // own property then there are no inherited enumerable properties.\n        baseForIn(value, function (subValue, key) {\n          result = key;\n        });\n        return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n      }\n      /**\n     * A fallback implementation of `Object.keys` which creates an array of the\n     * own enumerable property names of `object`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     */\n      function shimKeys(object) {\n        var props = keysIn(object), propsLength = props.length, length = propsLength && object.length, support = lodash.support;\n        var allowIndexes = length && isLength(length) && (isArray(object) || support.nonEnumArgs && isArguments(object));\n        var index = -1, result = [];\n        while (++index < propsLength) {\n          var key = props[index];\n          if (allowIndexes && isIndex(key, length) || hasOwnProperty.call(object, key)) {\n            result.push(key);\n          }\n        }\n        return result;\n      }\n      /**\n     * Converts `value` to an array-like object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Array|Object} Returns the array-like object.\n     */\n      function toIterable(value) {\n        if (value == null) {\n          return [];\n        }\n        if (!isLength(value.length)) {\n          return values(value);\n        }\n        return isObject(value) ? value : Object(value);\n      }\n      /**\n     * Converts `value` to an object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Object} Returns the object.\n     */\n      function toObject(value) {\n        return isObject(value) ? value : Object(value);\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `collection` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {numer} [size=1] The length of each chunk.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new array containing chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n      function chunk(array, size, guard) {\n        if (guard ? isIterateeCall(array, size, guard) : size == null) {\n          size = 1;\n        } else {\n          size = nativeMax(+size || 1, 1);\n        }\n        var index = 0, length = array ? array.length : 0, resIndex = -1, result = Array(ceil(length / size));\n        while (index < length) {\n          result[++resIndex] = baseSlice(array, index, index += size);\n        }\n        return result;\n      }\n      /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n      function compact(array) {\n        var index = -1, length = array ? array.length : 0, resIndex = -1, result = [];\n        while (++index < length) {\n          var value = array[index];\n          if (value) {\n            result[++resIndex] = value;\n          }\n        }\n        return result;\n      }\n      /**\n     * Creates an array excluding all values of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3], [5, 2, 10]);\n     * // => [1, 3]\n     */\n      function difference() {\n        var index = -1, length = arguments.length;\n        while (++index < length) {\n          var value = arguments[index];\n          if (isArray(value) || isArguments(value)) {\n            break;\n          }\n        }\n        return baseDifference(value, baseFlatten(arguments, false, true, ++index));\n      }\n      /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n      function drop(array, n, guard) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        if (guard ? isIterateeCall(array, n, guard) : n == null) {\n          n = 1;\n        }\n        return baseSlice(array, n < 0 ? 0 : n);\n      }\n      /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n      function dropRight(array, n, guard) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        if (guard ? isIterateeCall(array, n, guard) : n == null) {\n          n = 1;\n        }\n        n = length - (+n || 0);\n        return baseSlice(array, 0, n < 0 ? 0 : n);\n      }\n      /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per element.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRightWhile([1, 2, 3], function(n) { return n > 1; });\n     * // => [1]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'status': 'busy', 'active': false },\n     *   { 'user': 'fred',    'status': 'busy', 'active': true },\n     *   { 'user': 'pebbles', 'status': 'away', 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n     * // => ['barney']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.dropRightWhile(users, { 'status': 'away' }), 'user');\n     * // => ['barney', 'fred']\n     */\n      function dropRightWhile(array, predicate, thisArg) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        while (length-- && predicate(array[length], length, array)) {\n        }\n        return baseSlice(array, 0, length + 1);\n      }\n      /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per element.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropWhile([1, 2, 3], function(n) { return n < 3; });\n     * // => [3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'status': 'busy', 'active': true },\n     *   { 'user': 'fred',    'status': 'busy', 'active': false },\n     *   { 'user': 'pebbles', 'status': 'away', 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.dropWhile(users, 'active'), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.dropWhile(users, { 'status': 'busy' }), 'user');\n     * // => ['pebbles']\n     */\n      function dropWhile(array, predicate, thisArg) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        var index = -1;\n        predicate = getCallback(predicate, thisArg, 3);\n        while (++index < length && predicate(array[index], index, array)) {\n        }\n        return baseSlice(array, index);\n      }\n      /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for, instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.findIndex(users, function(chr) { return chr.age < 40; });\n     * // => 0\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.findIndex(users, { 'age': 1 });\n     * // => 2\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.findIndex(users, 'active');\n     * // => 1\n     */\n      function findIndex(array, predicate, thisArg) {\n        var index = -1, length = array ? array.length : 0;\n        predicate = getCallback(predicate, thisArg, 3);\n        while (++index < length) {\n          if (predicate(array[index], index, array)) {\n            return index;\n          }\n        }\n        return -1;\n      }\n      /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(chr) { return chr.age < 40; });\n     * // => 2\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.findLastIndex(users, { 'age': 40 });\n     * // => 1\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n      function findLastIndex(array, predicate, thisArg) {\n        var length = array ? array.length : 0;\n        predicate = getCallback(predicate, thisArg, 3);\n        while (length--) {\n          if (predicate(array[length], length, array)) {\n            return length;\n          }\n        }\n        return -1;\n      }\n      /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([]);\n     * // => undefined\n     */\n      function first(array) {\n        return array ? array[0] : undefined;\n      }\n      /**\n     * Flattens a nested array. If `isDeep` is `true` the array is recursively\n     * flattened, otherwise it is only flattened a single level.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * // using `isDeep`\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, 4];\n     */\n      function flatten(array, isDeep, guard) {\n        var length = array ? array.length : 0;\n        if (guard && isIterateeCall(array, isDeep, guard)) {\n          isDeep = false;\n        }\n        return length ? baseFlatten(array, isDeep) : [];\n      }\n      /**\n     * Recursively flattens a nested array.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to recursively flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     */\n      function flattenDeep(array) {\n        var length = array ? array.length : 0;\n        return length ? baseFlatten(array, true) : [];\n      }\n      /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,\n     * it is used as the offset from the end of `array`. If `array` is sorted\n     * providing `true` for `fromIndex` performs a faster binary search.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * // using `fromIndex`\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * // performing a binary search\n     * _.indexOf([4, 4, 5, 5, 6, 6], 5, true);\n     * // => 2\n     */\n      function indexOf(array, value, fromIndex) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return -1;\n        }\n        if (typeof fromIndex == 'number') {\n          fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex || 0;\n        } else if (fromIndex) {\n          var index = binaryIndex(array, value), other = array[index];\n          return (value === value ? value === other : other !== other) ? index : -1;\n        }\n        return baseIndexOf(array, value, fromIndex);\n      }\n      /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n      function initial(array) {\n        return dropRight(array, 1);\n      }\n      /**\n     * Creates an array of unique values in all provided arrays using `SameValueZero`\n     * for equality comparisons.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n      function intersection() {\n        var args = [], argsIndex = -1, argsLength = arguments.length, caches = [], indexOf = getIndexOf(), isCommon = indexOf == baseIndexOf;\n        while (++argsIndex < argsLength) {\n          var value = arguments[argsIndex];\n          if (isArray(value) || isArguments(value)) {\n            args.push(value);\n            caches.push(isCommon && value.length >= 120 && createCache(argsIndex && value));\n          }\n        }\n        argsLength = args.length;\n        var array = args[0], index = -1, length = array ? array.length : 0, result = [], seen = caches[0];\n        outer:\n          while (++index < length) {\n            value = array[index];\n            if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value)) < 0) {\n              argsIndex = argsLength;\n              while (--argsIndex) {\n                var cache = caches[argsIndex];\n                if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n                  continue outer;\n                }\n              }\n              if (seen) {\n                seen.push(value);\n              }\n              result.push(value);\n            }\n          }\n        return result;\n      }\n      /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n      function last(array) {\n        var length = array ? array.length : 0;\n        return length ? array[length - 1] : undefined;\n      }\n      /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n     *  or `true` to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * // using `fromIndex`\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     *\n     * // performing a binary search\n     * _.lastIndexOf([4, 4, 5, 5, 6, 6], 5, true);\n     * // => 3\n     */\n      function lastIndexOf(array, value, fromIndex) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return -1;\n        }\n        var index = length;\n        if (typeof fromIndex == 'number') {\n          index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n        } else if (fromIndex) {\n          index = binaryIndex(array, value, true) - 1;\n          var other = array[index];\n          return (value === value ? value === other : other !== other) ? index : -1;\n        }\n        if (value !== value) {\n          return indexOfNaN(array, index, true);\n        }\n        while (index--) {\n          if (array[index] === value) {\n            return index;\n          }\n        }\n        return -1;\n      }\n      /**\n     * Removes all provided values from `array` using `SameValueZero` for equality\n     * comparisons.\n     *\n     * **Notes:**\n     *  - Unlike `_.without`, this method mutates `array`.\n     *  - `SameValueZero` comparisons are like strict equality comparisons, e.g. `===`,\n     *    except that `NaN` matches `NaN`. See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     *    for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n      function pull() {\n        var array = arguments[0];\n        if (!(array && array.length)) {\n          return array;\n        }\n        var index = 0, indexOf = getIndexOf(), length = arguments.length;\n        while (++index < length) {\n          var fromIndex = 0, value = arguments[index];\n          while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n            splice.call(array, fromIndex, 1);\n          }\n        }\n        return array;\n      }\n      /**\n     * Removes elements from `array` corresponding to the given indexes and returns\n     * an array of the removed elements. Indexes may be specified as an array of\n     * indexes or as individual arguments.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [5, 10, 15, 20];\n     * var evens = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => [5, 15]\n     *\n     * console.log(evens);\n     * // => [10, 20]\n     */\n      function pullAt(array) {\n        return basePullAt(array || [], baseFlatten(arguments, false, false, 1));\n      }\n      /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is bound to\n     * `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) { return n % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n      function remove(array, predicate, thisArg) {\n        var index = -1, length = array ? array.length : 0, result = [];\n        predicate = getCallback(predicate, thisArg, 3);\n        while (++index < length) {\n          var value = array[index];\n          if (predicate(value, index, array)) {\n            result.push(value);\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n        return result;\n      }\n      /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias tail\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     */\n      function rest(array) {\n        return drop(array, 1);\n      }\n      /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This function is used instead of `Array#slice` to support node\n     * lists in IE < 9 and to ensure dense arrays are returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n      function slice(array, start, end) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n          start = 0;\n          end = length;\n        }\n        return baseSlice(array, start, end);\n      }\n      /**\n     * Uses a binary search to determine the lowest index at which `value` should\n     * be inserted into `array` in order to maintain its sort order. If an iteratee\n     * function is provided it is invoked for `value` and each element of `array`\n     * to compute their sort ranking. The iteratee is bound to `thisArg` and\n     * invoked with one argument; (value).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     *\n     * _.sortedIndex([4, 4, 5, 5, 6, 6], 5);\n     * // => 2\n     *\n     * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n     *\n     * // using an iteratee function\n     * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n     *   return this.data[word];\n     * }, dict);\n     * // => 1\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 1\n     */\n      function sortedIndex(array, value, iteratee, thisArg) {\n        var func = getCallback(iteratee);\n        return func === baseCallback && iteratee == null ? binaryIndex(array, value) : binaryIndexBy(array, value, func(iteratee, thisArg, 1));\n      }\n      /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 4, 5, 5, 6, 6], 5);\n     * // => 4\n     */\n      function sortedLastIndex(array, value, iteratee, thisArg) {\n        var func = getCallback(iteratee);\n        return func === baseCallback && iteratee == null ? binaryIndex(array, value, true) : binaryIndexBy(array, value, func(iteratee, thisArg, 1), true);\n      }\n      /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n      function take(array, n, guard) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        if (guard ? isIterateeCall(array, n, guard) : n == null) {\n          n = 1;\n        }\n        return baseSlice(array, 0, n < 0 ? 0 : n);\n      }\n      /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n      function takeRight(array, n, guard) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        if (guard ? isIterateeCall(array, n, guard) : n == null) {\n          n = 1;\n        }\n        n = length - (+n || 0);\n        return baseSlice(array, n < 0 ? 0 : n);\n      }\n      /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per element.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRightWhile([1, 2, 3], function(n) { return n > 1; });\n     * // => [2, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'status': 'busy', 'active': false },\n     *   { 'user': 'fred',    'status': 'busy', 'active': true },\n     *   { 'user': 'pebbles', 'status': 'away', 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.takeRightWhile(users, { 'status': 'away' }), 'user');\n     * // => ['pebbles']\n     */\n      function takeRightWhile(array, predicate, thisArg) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        while (length-- && predicate(array[length], length, array)) {\n        }\n        return baseSlice(array, length + 1);\n      }\n      /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is bound to\n     * `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per element.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeWhile([1, 2, 3], function(n) { return n < 3; });\n     * // => [1, 2]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'status': 'busy', 'active': true },\n     *   { 'user': 'fred',    'status': 'busy', 'active': false },\n     *   { 'user': 'pebbles', 'status': 'away', 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.takeWhile(users, 'active'), 'user');\n     * // => ['barney']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.takeWhile(users, { 'status': 'busy' }), 'user');\n     * // => ['barney', 'fred']\n     */\n      function takeWhile(array, predicate, thisArg) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        var index = -1;\n        predicate = getCallback(predicate, thisArg, 3);\n        while (++index < length && predicate(array[index], index, array)) {\n        }\n        return baseSlice(array, 0, index);\n      }\n      /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n      function union() {\n        return baseUniq(baseFlatten(arguments, false, true));\n      }\n      /**\n     * Creates a duplicate-value-free version of an array using `SameValueZero`\n     * for equality comparisons. Providing `true` for `isSorted` performs a faster\n     * search algorithm for sorted arrays. If an iteratee function is provided it\n     * is invoked for each value in the array to generate the criterion by which\n     * uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {boolean} [isSorted] Specify the array is sorted.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     *  If a property name or object is provided it is used to create a \"_.property\"\n     *  or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1]);\n     * // => [1, 2]\n     *\n     * // using `isSorted`\n     * _.uniq([1, 1, 2], true);\n     * // => [1, 2]\n     *\n     * // using an iteratee function\n     * _.uniq([1, 2.5, 1.5, 2], function(n) { return this.floor(n); }, Math);\n     * // => [1, 2.5]\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n      function uniq(array, isSorted, iteratee, thisArg) {\n        var length = array ? array.length : 0;\n        if (!length) {\n          return [];\n        }\n        // Juggle arguments.\n        if (typeof isSorted != 'boolean' && isSorted != null) {\n          thisArg = iteratee;\n          iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;\n          isSorted = false;\n        }\n        var func = getCallback();\n        if (!(func === baseCallback && iteratee == null)) {\n          iteratee = func(iteratee, thisArg, 3);\n        }\n        return isSorted && getIndexOf() == baseIndexOf ? sortedUniq(array, iteratee) : baseUniq(array, iteratee);\n      }\n      /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-`_.zip`\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['fred', 'barney'], [30, 40], [true, false]]\n     */\n      function unzip(array) {\n        var index = -1, length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0, result = Array(length);\n        while (++index < length) {\n          result[index] = arrayMap(array, baseProperty(index));\n        }\n        return result;\n      }\n      /**\n     * Creates an array excluding all provided values using `SameValueZero` for\n     * equality comparisons.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to filter.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n      function without(array) {\n        return baseDifference(array, baseSlice(arguments, 1));\n      }\n      /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See [Wikipedia](https://en.wikipedia.org/wiki/Symmetric_difference) for\n     * more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n      function xor() {\n        var index = -1, length = arguments.length;\n        while (++index < length) {\n          var array = arguments[index];\n          if (isArray(array) || isArguments(array)) {\n            var result = result ? baseDifference(result, array).concat(baseDifference(array, result)) : array;\n          }\n        }\n        return result ? baseUniq(result) : [];\n      }\n      /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second elements\n     * of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n      function zip() {\n        var length = arguments.length, array = Array(length);\n        while (length--) {\n          array[length] = arguments[length];\n        }\n        return unzip(array);\n      }\n      /**\n     * Creates an object composed from arrays of property names and values. Provide\n     * either a single two dimensional array, e.g. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of property names and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Array\n     * @param {Array} props The property names.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n      function zipObject(props, values) {\n        var index = -1, length = props ? props.length : 0, result = {};\n        if (length && !values && !isArray(props[0])) {\n          values = [];\n        }\n        while (++index < length) {\n          var key = props[index];\n          if (values) {\n            result[key] = values[index];\n          } else if (key) {\n            result[key[0]] = key[1];\n          }\n        }\n        return result;\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates a `lodash` object that wraps `value` with explicit method\n     * chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` object.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(users)\n     *   .sortBy('age')\n     *   .map(function(chr) { return chr.user + ' is ' + chr.age; })\n     *   .first()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n      function chain(value) {\n        var result = lodash(value);\n        result.__chain__ = true;\n        return result;\n      }\n      /**\n     * This method invokes `interceptor` and returns `value`. The interceptor is\n     * bound to `thisArg` and invoked with one argument; (value). The purpose of\n     * this method is to \"tap into\" a method chain in order to perform operations\n     * on intermediate results within the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n      function tap(value, interceptor, thisArg) {\n        interceptor.call(thisArg, value);\n        return value;\n      }\n      /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .last()\n     *  .thru(function(value) { return [value]; })\n     *  .value();\n     * // => [3]\n     */\n      function thru(value, interceptor, thisArg) {\n        return interceptor.call(thisArg, value);\n      }\n      /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chain\n     * @returns {*} Returns the `lodash` object.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(users).first();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(users).chain()\n     *   .first()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n      function wrapperChain() {\n        return chain(this);\n      }\n      /**\n     * Reverses the wrapped array so the first element becomes the last, the\n     * second element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new reversed `lodash` object.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n      function wrapperReverse() {\n        var value = this.__wrapped__;\n        if (value instanceof LazyWrapper) {\n          if (this.__actions__.length) {\n            value = new LazyWrapper(this);\n          }\n          return new LodashWrapper(value.reverse());\n        }\n        return this.thru(function (value) {\n          return value.reverse();\n        });\n      }\n      /**\n     * Produces the result of coercing the unwrapped value to a string.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chain\n     * @returns {string} Returns the coerced string value.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n      function wrapperToString() {\n        return this.value() + '';\n      }\n      /**\n     * Executes the chained sequence to extract the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @alias toJSON, valueOf\n     * @category Chain\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n      function wrapperValue() {\n        return baseWrapperValue(this.__wrapped__, this.__actions__);\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates an array of elements corresponding to the given keys, or indexes,\n     * of `collection`. Keys may be specified as individual arguments or as arrays\n     * of keys.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [props] The property names\n     *  or indexes of elements to pick, specified individually or in arrays.\n     * @returns {Array} Returns the new array of picked elements.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n      function at(collection) {\n        var length = collection ? collection.length : 0;\n        if (isLength(length)) {\n          collection = toIterable(collection);\n        }\n        return baseAt(collection, baseFlatten(arguments, false, false, 1));\n      }\n      /**\n     * Checks if `value` is in `collection` using `SameValueZero` for equality\n     * comparisons. If `fromIndex` is negative, it is used as the offset from\n     * the end of `collection`.\n     *\n     * **Note:** `SameValueZero` comparisons are like strict equality comparisons,\n     * e.g. `===`, except that `NaN` matches `NaN`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @alias contains, include\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {*} target The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.includes('pebbles', 'eb');\n     * // => true\n     */\n      function includes(collection, target, fromIndex) {\n        var length = collection ? collection.length : 0;\n        if (!isLength(length)) {\n          collection = values(collection);\n          length = collection.length;\n        }\n        if (!length) {\n          return false;\n        }\n        if (typeof fromIndex == 'number') {\n          fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex || 0;\n        } else {\n          fromIndex = 0;\n        }\n        return typeof collection == 'string' || !isArray(collection) && isString(collection) ? fromIndex < length && collection.indexOf(target, fromIndex) > -1 : getIndexOf(collection, target, fromIndex) > -1;\n      }\n      /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the number of times the key was returned by `iteratee`.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) { return Math.floor(n); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) { return this.floor(n); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n      var countBy = createAggregator(function (result, value, key) {\n          hasOwnProperty.call(result, key) ? ++result[key] : result[key] = 1;\n        });\n      /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * The predicate is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.every(users, 'age');\n     * // => true\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.every(users, { 'age': 36 });\n     * // => false\n     */\n      function every(collection, predicate, thisArg) {\n        var func = isArray(collection) ? arrayEvery : baseEvery;\n        if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n          predicate = getCallback(predicate, thisArg, 3);\n        }\n        return func(collection, predicate);\n      }\n      /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4], function(n) { return n % 2 == 0; });\n     * // => [2, 4]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.filter(users, 'active'), 'user');\n     * // => ['fred']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.filter(users, { 'age': 36 }), 'user');\n     * // => ['barney']\n     */\n      function filter(collection, predicate, thisArg) {\n        var func = isArray(collection) ? arrayFilter : baseFilter;\n        predicate = getCallback(predicate, thisArg, 3);\n        return func(collection, predicate);\n      }\n      /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.result(_.find(users, function(chr) { return chr.age < 40; }), 'user');\n     * // => 'barney'\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.result(_.find(users, { 'age': 1 }), 'user');\n     * // => 'pebbles'\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.result(_.find(users, 'active'), 'user');\n     * // => 'fred'\n     */\n      function find(collection, predicate, thisArg) {\n        if (isArray(collection)) {\n          var index = findIndex(collection, predicate, thisArg);\n          return index > -1 ? collection[index] : undefined;\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(collection, predicate, baseEach);\n      }\n      /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) { return n % 2 == 1; });\n     * // => 3\n     */\n      function findLast(collection, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(collection, predicate, baseEachRight);\n      }\n      /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning the first element that has equivalent property\n     * values.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'status': 'busy' },\n     *   { 'user': 'fred',   'age': 40, 'status': 'busy' }\n     * ];\n     *\n     * _.result(_.findWhere(users, { 'status': 'busy' }), 'user');\n     * // => 'barney'\n     *\n     * _.result(_.findWhere(users, { 'age': 40 }), 'user');\n     * // => 'fred'\n     */\n      function findWhere(collection, source) {\n        return find(collection, baseMatches(source));\n      }\n      /**\n     * Iterates over elements of `collection` invoking `iteratee` for each element.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Iterator functions may exit iteration early\n     * by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(n) { console.log(n); }).value();\n     * // => logs each value from left to right and returns the array\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(n, key) { console.log(n, key); });\n     * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n     */\n      function forEach(collection, iteratee, thisArg) {\n        return typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection) ? arrayEach(collection, iteratee) : baseEach(collection, bindCallback(iteratee, thisArg, 3));\n      }\n      /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(n) { console.log(n); }).join(',');\n     * // => logs each value from right to left and returns the array\n     */\n      function forEachRight(collection, iteratee, thisArg) {\n        return typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection) ? arrayEachRight(collection, iteratee) : baseEachRight(collection, bindCallback(iteratee, thisArg, 3));\n      }\n      /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) { return Math.floor(n); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) { return this.floor(n); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n      var groupBy = createAggregator(function (result, value, key) {\n          if (hasOwnProperty.call(result, key)) {\n            result[key].push(value);\n          } else {\n            result[key] = [value];\n          }\n        });\n      /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the last element responsible for generating the key. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keyData = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keyData, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) { return String.fromCharCode(object.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) { return this.fromCharCode(object.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n      var indexBy = createAggregator(function (result, value, key) {\n          result[key] = value;\n        });\n      /**\n     * Invokes the method named by `methodName` on each element in `collection`,\n     * returning an array of the results of each invoked method. Any additional\n     * arguments are provided to each invoked method. If `methodName` is a function\n     * it is invoked for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n      function invoke(collection, methodName) {\n        return baseInvoke(collection, methodName, baseSlice(arguments, 2));\n      }\n      /**\n     * Creates an array of values by running each element in `collection` through\n     * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * _.map([1, 2, 3], function(n) { return n * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(n) { return n * 3; });\n     * // => [3, 6, 9] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n      function map(collection, iteratee, thisArg) {\n        var func = isArray(collection) ? arrayMap : baseMap;\n        iteratee = getCallback(iteratee, thisArg, 3);\n        return func(collection, iteratee);\n      }\n      /**\n     * Gets the maximum value of `collection`. If `collection` is empty or falsey\n     * `-Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     *  If a property name or object is provided it is used to create a \"_.property\"\n     *  or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => -Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(users, function(chr) { return chr.age; });\n     * // => { 'user': 'fred', 'age': 40 };\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.max(users, 'age');\n     * // => { 'user': 'fred', 'age': 40 };\n     */\n      var max = createExtremum(arrayMax);\n      /**\n     * Gets the minimum value of `collection`. If `collection` is empty or falsey\n     * `Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     *  If a property name or object is provided it is used to create a \"_.property\"\n     *  or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(users, function(chr) { return chr.age; });\n     * // => { 'user': 'barney', 'age': 36 };\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.min(users, 'age');\n     * // => { 'user': 'barney', 'age': 36 };\n     */\n      var min = createExtremum(arrayMin, true);\n      /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, while the second of which\n     * contains elements `predicate` returns falsey for. The predicate is bound\n     * to `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * _.partition([1, 2, 3], function(n) { return n % 2; });\n     * // => [[1, 3], [2]]\n     *\n     * _.partition([1.2, 2.3, 3.4], function(n) { return this.floor(n) % 2; }, Math);\n     * // => [[1, 3], [2]]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.map(_.partition(users, { 'age': 1 }), function(array) { return _.pluck(array, 'user'); });\n     * // => [['pebbles'], ['barney', 'fred']]\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.map(_.partition(users, 'active'), function(array) { return _.pluck(array, 'user'); });\n     * // => [['fred'], ['barney', 'pebbles']]\n     */\n      var partition = createAggregator(function (result, value, key) {\n          result[key ? 0 : 1].push(value);\n        }, function () {\n          return [\n            [],\n            []\n          ];\n        });\n      /**\n     * Gets the value of `key` from all elements in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} key The key of the property to pluck.\n     * @returns {Array} Returns the property values.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(users, 'user');\n     * // => ['barney', 'fred']\n     *\n     * var userIndex = _.indexBy(users, 'user');\n     * _.pluck(userIndex, 'age');\n     * // => [36, 40] (iteration order is not guaranteed)\n     */\n      function pluck(collection, key) {\n        return map(collection, baseProperty(key + ''));\n      }\n      /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` through `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not provided the first element of `collection` is used as the initial\n     * value. The `iteratee` is bound to `thisArg`and invoked with four arguments;\n     * (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, n) { return sum + n; });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 } (iteration order is not guaranteed)\n     */\n      function reduce(collection, iteratee, accumulator, thisArg) {\n        var func = isArray(collection) ? arrayReduce : baseReduce;\n        return func(collection, getCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEach);\n      }\n      /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     * _.reduceRight(array, function(flattened, other) { return flattened.concat(other); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n      function reduceRight(collection, iteratee, accumulator, thisArg) {\n        var func = isArray(collection) ? arrayReduceRight : baseReduce;\n        return func(collection, getCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEachRight);\n      }\n      /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4], function(n) { return n % 2 == 0; });\n     * // => [1, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.reject(users, 'active'), 'user');\n     * // => ['barney']\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.pluck(_.reject(users, { 'age': 36 }), 'user');\n     * // => ['fred']\n     */\n      function reject(collection, predicate, thisArg) {\n        var func = isArray(collection) ? arrayFilter : baseFilter;\n        predicate = getCallback(predicate, thisArg, 3);\n        return func(collection, function (value, index, collection) {\n          return !predicate(value, index, collection);\n        });\n      }\n      /**\n     * Gets a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {*} Returns the random sample(s).\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n      function sample(collection, n, guard) {\n        if (guard ? isIterateeCall(collection, n, guard) : n == null) {\n          collection = toIterable(collection);\n          var length = collection.length;\n          return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;\n        }\n        var result = shuffle(collection);\n        result.length = nativeMin(n < 0 ? 0 : +n || 0, result.length);\n        return result;\n      }\n      /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See [Wikipedia](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n      function shuffle(collection) {\n        collection = toIterable(collection);\n        var index = -1, length = collection.length, result = Array(length);\n        while (++index < length) {\n          var rand = baseRandom(0, index);\n          if (index != rand) {\n            result[index] = result[rand];\n          }\n          result[rand] = collection[index];\n        }\n        return result;\n      }\n      /**\n     * Gets the size of `collection` by returning `collection.length` for\n     * array-like values or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the size of `collection`.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n      function size(collection) {\n        var length = collection ? collection.length : 0;\n        return isLength(length) ? length : keys(collection).length;\n      }\n      /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * The function returns as soon as it finds a passing value and does not iterate\n     * over the entire collection. The predicate is bound to `thisArg` and invoked\n     * with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.some(users, 'active');\n     * // => true\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.some(users, { 'age': 1 });\n     * // => false\n     */\n      function some(collection, predicate, thisArg) {\n        var func = isArray(collection) ? arraySome : baseSome;\n        if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n          predicate = getCallback(predicate, thisArg, 3);\n        }\n        return func(collection, predicate);\n      }\n      /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through `iteratee`. This method performs\n     * a stable sort, that is, it preserves the original sort order of equal elements.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [iteratee=_.identity] The function\n     *  invoked per iteration. If a property name or an object is provided it is\n     *  used to create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(n) { return Math.sin(n); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(n) { return this.sin(n); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'pebbles' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.pluck(_.sortBy(users, 'user'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n      function sortBy(collection, iteratee, thisArg) {\n        var index = -1, length = collection ? collection.length : 0, result = isLength(length) ? Array(length) : [];\n        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n          iteratee = null;\n        }\n        iteratee = getCallback(iteratee, thisArg, 3);\n        baseEach(collection, function (value, key, collection) {\n          result[++index] = {\n            'criteria': iteratee(value, key, collection),\n            'index': index,\n            'value': value\n          };\n        });\n        return baseSortBy(result, compareAscending);\n      }\n      /**\n     * This method is like `_.sortBy` except that it sorts by property names\n     * instead of an iteratee function.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(string|string[])} props The property names to sort by,\n     *  specified as individual property names or arrays of property names.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 26 },\n     *   { 'user': 'fred',   'age': 30 }\n     * ];\n     *\n     * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n     * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n      function sortByAll(collection) {\n        var args = arguments;\n        if (args.length > 3 && isIterateeCall(args[1], args[2], args[3])) {\n          args = [\n            collection,\n            args[1]\n          ];\n        }\n        var index = -1, length = collection ? collection.length : 0, props = baseFlatten(args, false, false, 1), result = isLength(length) ? Array(length) : [];\n        baseEach(collection, function (value, key, collection) {\n          var length = props.length, criteria = Array(length);\n          while (length--) {\n            criteria[length] = value == null ? undefined : value[props[length]];\n          }\n          result[++index] = {\n            'criteria': criteria,\n            'index': index,\n            'value': value\n          };\n        });\n        return baseSortBy(result, compareMultipleAscending);\n      }\n      /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'status': 'busy', 'pets': ['hoppy'] },\n     *   { 'user': 'fred',   'age': 40, 'status': 'busy', 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.pluck(_.where(users, { 'age': 36 }), 'user');\n     * // => ['barney']\n     *\n     * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n     * // => ['fred']\n     *\n     * _.pluck(_.where(users, { 'status': 'busy' }), 'user');\n     * // => ['barney', 'fred']\n     */\n      function where(collection, source) {\n        return filter(collection, baseMatches(source));\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Date\n     * @example\n     *\n     * _.defer(function(stamp) { console.log(_.now() - stamp); }, _.now());\n     * // => logs the number of milliseconds it took for the deferred function to be invoked\n     */\n      var now = nativeNow || function () {\n          return new Date().getTime();\n        };\n      /*------------------------------------------------------------------------*/\n      /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it is called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'done saving!' after the two async saves have completed\n     */\n      function after(n, func) {\n        if (!isFunction(func)) {\n          if (isFunction(n)) {\n            var temp = n;\n            n = func;\n            func = temp;\n          } else {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n        }\n        n = nativeIsFinite(n = +n) ? n : 0;\n        return function () {\n          if (--n < 1) {\n            return func.apply(this, arguments);\n          }\n        };\n      }\n      /**\n     * Creates a function that accepts up to `n` arguments ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n      function ary(func, n, guard) {\n        if (guard && isIterateeCall(func, n, guard)) {\n          n = null;\n        }\n        n = func && n == null ? func.length : nativeMax(+n || 0, 0);\n        return createWrapper(func, ARY_FLAG, null, null, null, null, n);\n      }\n      /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it is called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery('#add').on('click', _.before(5, addContactToList));\n     * // => allows adding up to 4 contacts to the list\n     */\n      function before(n, func) {\n        var result;\n        if (!isFunction(func)) {\n          if (isFunction(n)) {\n            var temp = n;\n            n = func;\n            func = temp;\n          } else {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n        }\n        return function () {\n          if (--n > 0) {\n            result = func.apply(this, arguments);\n          } else {\n            func = null;\n          }\n          return result;\n        };\n      }\n      /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and prepends any additional `_.bind` arguments to those provided to the\n     * bound function.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind` this method does not set the `length`\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [args] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var greet = function(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * };\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // using placeholders\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n      function bind(func, thisArg) {\n        var bitmask = BIND_FLAG;\n        if (arguments.length > 2) {\n          var partials = baseSlice(arguments, 2), holders = replaceHolders(partials, bind.placeholder);\n          bitmask |= PARTIAL_FLAG;\n        }\n        return createWrapper(func, bitmask, thisArg, partials, holders);\n      }\n      /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all enumerable function\n     * properties, own and inherited, of `object` are bound.\n     *\n     * **Note:** This method does not set the `length` property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} [methodNames] The object method names to bind,\n     *  specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs' when the element is clicked\n     */\n      function bindAll(object) {\n        return baseBindAll(object, arguments.length > 1 ? baseFlatten(arguments, false, false, 1) : functions(object));\n      }\n      /**\n     * Creates a function that invokes the method at `object[key]` and prepends\n     * any additional `_.bindKey` arguments to those provided to the bound function.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist.\n     * See [Peter Michaux's article](http://michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [args] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // using placeholders\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n      function bindKey(object, key) {\n        var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n        if (arguments.length > 2) {\n          var partials = baseSlice(arguments, 2), holders = replaceHolders(partials, bindKey.placeholder);\n          bitmask |= PARTIAL_FLAG;\n        }\n        return createWrapper(key, bitmask, object, partials, holders);\n      }\n      /**\n     * Creates a function that accepts one or more arguments of `func` that when\n     * called either invokes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` may be specified\n     * if `func.length` is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n      function curry(func, arity, guard) {\n        if (guard && isIterateeCall(func, arity, guard)) {\n          arity = null;\n        }\n        var result = createWrapper(func, CURRY_FLAG, null, null, null, null, null, arity);\n        result.placeholder = curry.placeholder;\n        return result;\n      }\n      /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n      function curryRight(func, arity, guard) {\n        if (guard && isIterateeCall(func, arity, guard)) {\n          arity = null;\n        }\n        var result = createWrapper(func, CURRY_RIGHT_FLAG, null, null, null, null, null, arity);\n        result.placeholder = curryRight.placeholder;\n        return result;\n      }\n      /**\n     * Creates a function that delays invoking `func` until after `wait` milliseconds\n     * have elapsed since the last time it was invoked. The created function comes\n     * with a `cancel` method to cancel delayed invocations. Provide an options\n     * object to indicate that `func` should be invoked on the leading and/or\n     * trailing edge of the `wait` timeout. Subsequent calls to the debounced\n     * function return the result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n     *  delayed before it is invoked.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // ensure `batchLog` is invoked once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }));\n     *\n     * // cancel a debounced call\n     * var todoChanges = _.debounce(batchLog, 1000);\n     * Object.observe(models.todo, todoChanges);\n     *\n     * Object.observe(models, function(changes) {\n     *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n     *     todoChanges.cancel();\n     *   }\n     * }, ['delete']);\n     *\n     * // ...at some point `models.todo` is changed\n     * models.todo.completed = true;\n     *\n     * // ...before 1 second has passed `models.todo` is deleted\n     * // which cancels the debounced `todoChanges` call\n     * delete models.todo;\n     */\n      function debounce(func, wait, options) {\n        var args, maxTimeoutId, result, stamp, thisArg, timeoutId, trailingCall, lastCalled = 0, maxWait = false, trailing = true;\n        if (!isFunction(func)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        wait = wait < 0 ? 0 : wait;\n        if (options === true) {\n          var leading = true;\n          trailing = false;\n        } else if (isObject(options)) {\n          leading = options.leading;\n          maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n          trailing = 'trailing' in options ? options.trailing : trailing;\n        }\n        function cancel() {\n          if (timeoutId) {\n            clearTimeout(timeoutId);\n          }\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n        }\n        function delayed() {\n          var remaining = wait - (now() - stamp);\n          if (remaining <= 0 || remaining > wait) {\n            if (maxTimeoutId) {\n              clearTimeout(maxTimeoutId);\n            }\n            var isCalled = trailingCall;\n            maxTimeoutId = timeoutId = trailingCall = undefined;\n            if (isCalled) {\n              lastCalled = now();\n              result = func.apply(thisArg, args);\n              if (!timeoutId && !maxTimeoutId) {\n                args = thisArg = null;\n              }\n            }\n          } else {\n            timeoutId = setTimeout(delayed, remaining);\n          }\n        }\n        function maxDelayed() {\n          if (timeoutId) {\n            clearTimeout(timeoutId);\n          }\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (trailing || maxWait !== wait) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        }\n        function debounced() {\n          args = arguments;\n          stamp = now();\n          thisArg = this;\n          trailingCall = trailing && (timeoutId || !leading);\n          if (maxWait === false) {\n            var leadingCall = leading && !timeoutId;\n          } else {\n            if (!maxTimeoutId && !leading) {\n              lastCalled = stamp;\n            }\n            var remaining = maxWait - (stamp - lastCalled), isCalled = remaining <= 0 || remaining > maxWait;\n            if (isCalled) {\n              if (maxTimeoutId) {\n                maxTimeoutId = clearTimeout(maxTimeoutId);\n              }\n              lastCalled = stamp;\n              result = func.apply(thisArg, args);\n            } else if (!maxTimeoutId) {\n              maxTimeoutId = setTimeout(maxDelayed, remaining);\n            }\n          }\n          if (isCalled && timeoutId) {\n            timeoutId = clearTimeout(timeoutId);\n          } else if (!timeoutId && wait !== maxWait) {\n            timeoutId = setTimeout(delayed, wait);\n          }\n          if (leadingCall) {\n            isCalled = true;\n            result = func.apply(thisArg, args);\n          }\n          if (isCalled && !timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n          return result;\n        }\n        debounced.cancel = cancel;\n        return debounced;\n      }\n      /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n      function defer(func) {\n        return baseDelay(func, 1, arguments, 1);\n      }\n      /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n      function delay(func, wait) {\n        return baseDelay(func, wait, arguments, 2);\n      }\n      /**\n     * Creates a function that returns the result of invoking the provided\n     * functions with the `this` binding of the created function, where each\n     * successive invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function add(x, y) {\n     *   return x + y;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow(add, square);\n     * addSquare(1, 2);\n     * // => 9\n     */\n      function flow() {\n        var funcs = arguments, length = funcs.length;\n        if (!length) {\n          return function () {\n          };\n        }\n        if (!arrayEvery(funcs, isFunction)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return function () {\n          var index = 0, result = funcs[index].apply(this, arguments);\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      }\n      /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the provided functions from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias backflow, compose\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function add(x, y) {\n     *   return x + y;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight(square, add);\n     * addSquare(1, 2);\n     * // => 9\n     */\n      function flowRight() {\n        var funcs = arguments, fromIndex = funcs.length - 1;\n        if (fromIndex < 0) {\n          return function () {\n          };\n        }\n        if (!arrayEvery(funcs, isFunction)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return function () {\n          var index = fromIndex, result = funcs[index].apply(this, arguments);\n          while (index--) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      }\n      /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is coerced to a string and used as the\n     * cache key. The `func` is invoked with the `this` binding of the memoized\n     * function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the ES `Map` method interface\n     * of `get`, `has`, and `set`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var upperCase = _.memoize(function(string) {\n     *   return string.toUpperCase();\n     * });\n     *\n     * upperCase('fred');\n     * // => 'FRED'\n     *\n     * // modifying the result cache\n     * upperCase.cache.set('fred', 'BARNEY');\n     * upperCase('fred');\n     * // => 'BARNEY'\n     *\n     * // replacing `_.memoize.Cache`\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'barney' };\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'fred' }\n     *\n     * _.memoize.Cache = WeakMap;\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'barney' }\n     */\n      function memoize(func, resolver) {\n        if (!isFunction(func) || resolver && !isFunction(resolver)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        var memoized = function () {\n          var cache = memoized.cache, key = resolver ? resolver.apply(this, arguments) : arguments[0];\n          if (cache.has(key)) {\n            return cache.get(key);\n          }\n          var result = func.apply(this, arguments);\n          cache.set(key, result);\n          return result;\n        };\n        memoized.cache = new memoize.Cache();\n        return memoized;\n      }\n      /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n      function negate(predicate) {\n        if (!isFunction(predicate)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return function () {\n          return !predicate.apply(this, arguments);\n        };\n      }\n      /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first call. The `func` is invoked\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` invokes `createApplication` once\n     */\n      function once(func) {\n        return before(func, 2);\n      }\n      /**\n     * Creates a function that invokes `func` with `partial` arguments prepended\n     * to those provided to the new function. This method is like `_.bind` except\n     * it does **not** alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [args] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // using placeholders\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n      function partial(func) {\n        var partials = baseSlice(arguments, 1), holders = replaceHolders(partials, partial.placeholder);\n        return createWrapper(func, PARTIAL_FLAG, null, partials, holders);\n      }\n      /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to those provided to the new function.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [args] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // using placeholders\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n      function partialRight(func) {\n        var partials = baseSlice(arguments, 1), holders = replaceHolders(partials, partialRight.placeholder);\n        return createWrapper(func, PARTIAL_RIGHT_FLAG, null, partials, holders);\n      }\n      /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified indexes where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, 2, 0, 1);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     *\n     * var map = _.rearg(_.map, [1, 0]);\n     * map(function(n) { return n * 3; }, [1, 2, 3]);\n     * // => [3, 6, 9]\n     */\n      function rearg(func) {\n        var indexes = baseFlatten(arguments, false, false, 1);\n        return createWrapper(func, REARG_FLAG, null, null, null, indexes);\n      }\n      /**\n     * Creates a function that only invokes `func` at most once per every `wait`\n     * milliseconds. The created function comes with a `cancel` method to cancel\n     * delayed invocations. Provide an options object to indicate that `func`\n     * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n     * Subsequent calls to the throttled function return the result of the last\n     * `func` call.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle invocations to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * var throttled =  _.throttle(renewToken, 300000, { 'trailing': false })\n     * jQuery('.interactive').on('click', throttled);\n     *\n     * // cancel a trailing throttled call\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n      function throttle(func, wait, options) {\n        var leading = true, trailing = true;\n        if (!isFunction(func)) {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        if (options === false) {\n          leading = false;\n        } else if (isObject(options)) {\n          leading = 'leading' in options ? !!options.leading : leading;\n          trailing = 'trailing' in options ? !!options.trailing : trailing;\n        }\n        debounceOptions.leading = leading;\n        debounceOptions.maxWait = +wait;\n        debounceOptions.trailing = trailing;\n        return debounce(func, wait, debounceOptions);\n      }\n      /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Any additional arguments provided to the function are\n     * appended to those provided to the wrapper function. The wrapper is invoked\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n      function wrap(value, wrapper) {\n        wrapper = wrapper == null ? identity : wrapper;\n        return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []);\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n     * otherwise they are assigned by reference. If `customizer` is provided it is\n     * invoked to produce the cloned values. If `customizer` returns `undefined`\n     * cloning is handled by the method instead. The `customizer` is bound to\n     * `thisArg` and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the structured clone algorithm.\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var shallow = _.clone(users);\n     * shallow[0] === users[0];\n     * // => true\n     *\n     * var deep = _.clone(users, true);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var body = _.clone(document.body, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(false) : undefined;\n     * });\n     *\n     * body === document.body\n     * // => false\n     * body.nodeName\n     * // => BODY\n     * body.childNodes.length;\n     * // => 0\n     */\n      function clone(value, isDeep, customizer, thisArg) {\n        // Juggle arguments.\n        if (typeof isDeep != 'boolean' && isDeep != null) {\n          thisArg = customizer;\n          customizer = isIterateeCall(value, isDeep, thisArg) ? null : isDeep;\n          isDeep = false;\n        }\n        customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n        return baseClone(value, isDeep, customizer);\n      }\n      /**\n     * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n     * to produce the cloned values. If `customizer` returns `undefined` cloning\n     * is handled by the method instead. The `customizer` is bound to `thisArg`\n     * and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the structured clone algorithm.\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var deep = _.cloneDeep(users);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.cloneDeep(document.body, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * body === document.body\n     * // => false\n     * body.nodeName\n     * // => BODY\n     * body.childNodes.length;\n     * // => 20\n     */\n      function cloneDeep(value, customizer, thisArg) {\n        customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n        return baseClone(value, true, customizer);\n      }\n      /**\n     * Checks if `value` is classified as an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })();\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n      function isArguments(value) {\n        var length = isObjectLike(value) ? value.length : undefined;\n        return isLength(length) && objToString.call(value) == argsTag || false;\n      }\n      /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     */\n      var isArray = nativeIsArray || function (value) {\n          return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag || false;\n        };\n      /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n      function isBoolean(value) {\n        return value === true || value === false || isObjectLike(value) && objToString.call(value) == boolTag || false;\n      }\n      /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n      function isDate(value) {\n        return isObjectLike(value) && objToString.call(value) == dateTag || false;\n      }\n      /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n      function isElement(value) {\n        return value && value.nodeType === 1 && isObjectLike(value) && objToString.call(value).indexOf('Element') > -1 || false;\n      }\n      // Fallback for environments without DOM support.\n      if (!support.dom) {\n        isElement = function (value) {\n          return value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value) || false;\n        };\n      }\n      /**\n     * Checks if a value is empty. A value is considered empty unless it is an\n     * `arguments` object, array, string, or jQuery-like collection with a length\n     * greater than `0` or an object with own enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n      function isEmpty(value) {\n        if (value == null) {\n          return true;\n        }\n        var length = value.length;\n        if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || isObjectLike(value) && isFunction(value.splice))) {\n          return !length;\n        }\n        return !keys(value).length;\n      }\n      /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent. If `customizer` is provided it is invoked to compare values.\n     * If `customizer` returns `undefined` comparisons are handled by the method\n     * instead. The `customizer` is bound to `thisArg` and invoked with three\n     * arguments; (value, other [, index|key]).\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Functions and DOM nodes\n     * are **not** supported. Provide a customizer function to extend support\n     * for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'fred' };\n     *\n     * object == other;\n     * // => false\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * // using a customizer callback\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqual(array, other, function(value, other) {\n     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n     * });\n     * // => true\n     */\n      function isEqual(value, other, customizer, thisArg) {\n        customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n        if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {\n          return value === other;\n        }\n        var result = customizer ? customizer(value, other) : undefined;\n        return typeof result == 'undefined' ? baseIsEqual(value, other, customizer) : !!result;\n      }\n      /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n      function isError(value) {\n        return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag || false;\n      }\n      /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on ES `Number.isFinite`. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(10);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => false\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite(Object(10));\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n      var isFinite = nativeNumIsFinite || function (value) {\n          return typeof value == 'number' && nativeIsFinite(value);\n        };\n      /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n      function isFunction(value) {\n        // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n        // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n        return typeof value == 'function' || false;\n      }\n      // Fallback for environments that return incorrect `typeof` operator results.\n      if (isFunction(/x/) || Uint8Array && !isFunction(Uint8Array)) {\n        isFunction = function (value) {\n          // The use of `Object#toString` avoids issues with the `typeof` operator\n          // in older versions of Chrome and Safari which return 'function' for regexes\n          // and Safari 8 equivalents which return 'object' for typed array constructors.\n          return objToString.call(value) == funcTag;\n        };\n      }\n      /**\n     * Checks if `value` is the language type of `Object`.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * **Note:** See the [ES5 spec](https://es5.github.io/#x8) for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n      function isObject(value) {\n        // Avoid a V8 JIT bug in Chrome 19-20.\n        // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n        var type = typeof value;\n        return type == 'function' || value && type == 'object' || false;\n      }\n      /**\n     * Performs a deep comparison between `object` and `source` to determine if\n     * `object` contains equivalent property values. If `customizer` is provided\n     * it is invoked to compare values. If `customizer` returns `undefined`\n     * comparisons are handled by the method instead. The `customizer` is bound\n     * to `thisArg` and invoked with three arguments; (value, other, index|key).\n     *\n     * **Note:** This method supports comparing properties of arrays, booleans,\n     * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n     * and DOM nodes are **not** supported. Provide a customizer function to extend\n     * support for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Object} source The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.isMatch(object, { 'age': 40 });\n     * // => true\n     *\n     * _.isMatch(object, { 'age': 36 });\n     * // => false\n     *\n     * // using a customizer callback\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatch(object, source, function(value, other) {\n     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n     * });\n     * // => true\n     */\n      function isMatch(object, source, customizer, thisArg) {\n        var props = keys(source), length = props.length;\n        customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n        if (!customizer && length == 1) {\n          var key = props[0], value = source[key];\n          if (isStrictComparable(value)) {\n            return object != null && value === object[key] && hasOwnProperty.call(object, key);\n          }\n        }\n        var values = Array(length), strictCompareFlags = Array(length);\n        while (length--) {\n          value = values[length] = source[props[length]];\n          strictCompareFlags[length] = isStrictComparable(value);\n        }\n        return baseIsMatch(object, props, values, strictCompareFlags, customizer);\n      }\n      /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is not the same as native `isNaN` which returns `true`\n     * for `undefined` and other non-numeric values. See the [ES5 spec](https://es5.github.io/#x15.1.2.4)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n      function isNaN(value) {\n        // An `NaN` primitive is the only value that is not equal to itself.\n        // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n        return isNumber(value) && value != +value;\n      }\n      /**\n     * Checks if `value` is a native function.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n      function isNative(value) {\n        if (value == null) {\n          return false;\n        }\n        if (objToString.call(value) == funcTag) {\n          return reNative.test(fnToString.call(value));\n        }\n        return isObjectLike(value) && reHostCtor.test(value) || false;\n      }\n      /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n      function isNull(value) {\n        return value === null;\n      }\n      /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n     * as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4);\n     * // => true\n     *\n     * _.isNumber(NaN);\n     * // => true\n     *\n     * _.isNumber('8.4');\n     * // => false\n     */\n      function isNumber(value) {\n        return typeof value == 'number' || isObjectLike(value) && objToString.call(value) == numberTag || false;\n      }\n      /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * **Note:** This method assumes objects created by the `Object` constructor\n     * have no inherited enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n      var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function (value) {\n          if (!(value && objToString.call(value) == objectTag)) {\n            return false;\n          }\n          var valueOf = value.valueOf, objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n          return objProto ? value == objProto || getPrototypeOf(value) == objProto : shimIsPlainObject(value);\n        };\n      /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n      function isRegExp(value) {\n        return isObjectLike(value) && objToString.call(value) == regexpTag || false;\n      }\n      /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n      function isString(value) {\n        return typeof value == 'string' || isObjectLike(value) && objToString.call(value) == stringTag || false;\n      }\n      /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n      function isTypedArray(value) {\n        return isObjectLike(value) && isLength(value.length) && typedArrayTags[objToString.call(value)] || false;\n      }\n      /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n      function isUndefined(value) {\n        return typeof value == 'undefined';\n      }\n      /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3);\n     * // => [2, 3]\n     */\n      function toArray(value) {\n        var length = value ? value.length : 0;\n        if (!isLength(length)) {\n          return values(value);\n        }\n        if (!length) {\n          return [];\n        }\n        return arrayCopy(value);\n      }\n      /**\n     * Converts `value` to a plain object flattening inherited enumerable\n     * properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n      function toPlainObject(value) {\n        return baseCopy(value, keysIn(value));\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources overwrite property assignments of previous sources.\n     * If `customizer` is provided it is invoked to produce the assigned values.\n     * The `customizer` is bound to `thisArg` and invoked with five arguments;\n     * (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using a customizer callback\n     * var defaults = _.partialRight(_.assign, function(value, other) {\n     *   return typeof value == 'undefined' ? other : value;\n     * });\n     *\n     * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n      var assign = createAssigner(baseAssign);\n      /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n      function create(prototype, properties, guard) {\n        var result = baseCreate(prototype);\n        if (guard && isIterateeCall(prototype, properties, guard)) {\n          properties = null;\n        }\n        return properties ? baseCopy(properties, result, keys(properties)) : result;\n      }\n      /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property are ignored.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n      function defaults(object) {\n        if (object == null) {\n          return object;\n        }\n        var args = arrayCopy(arguments);\n        args.push(assignDefaults);\n        return assign.apply(undefined, args);\n      }\n      /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element `predicate` returns truthy for, instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(chr) { return chr.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.findKey(users, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n      function findKey(object, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(object, predicate, baseForOwn, true);\n      }\n      /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * If a property name is provided for `predicate` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `predicate` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(chr) { return chr.age < 40; });\n     * // => returns `pebbles` assuming `_.findKey` returns `barney`\n     *\n     * // using the \"_.matches\" callback shorthand\n     * _.findLastKey(users, { 'age': 36 });\n     * // => 'barney'\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n      function findLastKey(object, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(object, predicate, baseForOwnRight, true);\n      }\n      /**\n     * Iterates over own and inherited enumerable properties of an object invoking\n     * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments; (value, key, object). Iterator functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n     */\n      function forIn(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return baseFor(object, iteratee, keysIn);\n      }\n      /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n     */\n      function forInRight(object, iteratee, thisArg) {\n        iteratee = bindCallback(iteratee, thisArg, 3);\n        return baseForRight(object, iteratee, keysIn);\n      }\n      /**\n     * Iterates over own enumerable properties of an object invoking `iteratee`\n     * for each property. The `iteratee` is bound to `thisArg` and invoked with\n     * three arguments; (value, key, object). Iterator functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(n, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (iteration order is not guaranteed)\n     */\n      function forOwn(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return baseForOwn(object, iteratee);\n      }\n      /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(n, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n      function forOwnRight(object, iteratee, thisArg) {\n        iteratee = bindCallback(iteratee, thisArg, 3);\n        return baseForRight(object, iteratee, keys);\n      }\n      /**\n     * Creates an array of function property names from all enumerable properties,\n     * own and inherited, of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of property names.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', ...]\n     */\n      function functions(object) {\n        return baseFunctions(object, keysIn(object));\n      }\n      /**\n     * Checks if `key` exists as a direct property of `object` instead of an\n     * inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n      function has(object, key) {\n        return object ? hasOwnProperty.call(object, key) : false;\n      }\n      /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite property\n     * assignments of previous values unless `multiValue` is `true`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {boolean} [multiValue] Allow multiple values per key.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     *\n     * // without `multiValue`\n     * _.invert({ 'first': 'fred', 'second': 'barney', 'third': 'fred' });\n     * // => { 'fred': 'third', 'barney': 'second' }\n     *\n     * // with `multiValue`\n     * _.invert({ 'first': 'fred', 'second': 'barney', 'third': 'fred' }, true);\n     * // => { 'fred': ['first', 'third'], 'barney': ['second'] }\n     */\n      function invert(object, multiValue, guard) {\n        if (guard && isIterateeCall(object, multiValue, guard)) {\n          multiValue = null;\n        }\n        var index = -1, props = keys(object), length = props.length, result = {};\n        while (++index < length) {\n          var key = props[index], value = object[key];\n          if (multiValue) {\n            if (hasOwnProperty.call(result, value)) {\n              result[value].push(key);\n            } else {\n              result[value] = [key];\n            }\n          } else {\n            result[value] = key;\n          }\n        }\n        return result;\n      }\n      /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n      var keys = !nativeKeys ? shimKeys : function (object) {\n          if (object) {\n            var Ctor = object.constructor, length = object.length;\n          }\n          if (typeof Ctor == 'function' && Ctor.prototype === object || typeof object != 'function' && (length && isLength(length))) {\n            return shimKeys(object);\n          }\n          return isObject(object) ? nativeKeys(object) : [];\n        };\n      /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n      function keysIn(object) {\n        if (object == null) {\n          return [];\n        }\n        if (!isObject(object)) {\n          object = Object(object);\n        }\n        var length = object.length;\n        length = length && isLength(length) && (isArray(object) || support.nonEnumArgs && isArguments(object)) && length || 0;\n        var Ctor = object.constructor, index = -1, isProto = typeof Ctor == 'function' && Ctor.prototype == object, result = Array(length), skipIndexes = length > 0;\n        while (++index < length) {\n          result[index] = index + '';\n        }\n        for (var key in object) {\n          if (!(skipIndexes && isIndex(key, length)) && !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n            result.push(key);\n          }\n        }\n        return result;\n      }\n      /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through `iteratee`. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `iteratee` the created \"_.property\"\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for `iteratee` the created \"_.matches\" style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration. If a property name or object is provided it is used to\n     *  create a \"_.property\" or \"_.matches\" style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the new mapped object.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(n) { return n * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using the \"_.property\" callback shorthand\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n      function mapValues(object, iteratee, thisArg) {\n        var result = {};\n        iteratee = getCallback(iteratee, thisArg, 3);\n        baseForOwn(object, function (value, key, object) {\n          result[key] = iteratee(value, key, object);\n        });\n        return result;\n      }\n      /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * overwrite property assignments of previous sources. If `customizer` is\n     * provided it is invoked to produce the merged values of the destination and\n     * source properties. If `customizer` returns `undefined` merging is handled\n     * by the method instead. The `customizer` is bound to `thisArg` and invoked\n     * with five arguments; (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var users = {\n     *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n     * };\n     *\n     * var ages = {\n     *   'data': [{ 'age': 36 }, { 'age': 40 }]\n     * };\n     *\n     * _.merge(users, ages);\n     * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n     *\n     * // using a customizer callback\n     * var object = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var other = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(object, other, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n     */\n      var merge = createAssigner(baseMerge);\n      /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable properties of `object` that are not omitted.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If `predicate` is provided it is invoked for each property\n     * of `object` omitting the properties `predicate` returns truthy for. The\n     * predicate is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to omit, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.omit(object, 'age');\n     * // => { 'user': 'fred' }\n     *\n     * _.omit(object, _.isNumber);\n     * // => { 'user': 'fred' }\n     */\n      function omit(object, predicate, thisArg) {\n        if (object == null) {\n          return {};\n        }\n        if (typeof predicate != 'function') {\n          var props = arrayMap(baseFlatten(arguments, false, false, 1), String);\n          return pickByArray(object, baseDifference(keysIn(object), props));\n        }\n        predicate = bindCallback(predicate, thisArg, 3);\n        return pickByCallback(object, function (value, key, object) {\n          return !predicate(value, key, object);\n        });\n      }\n      /**\n     * Creates a two dimensional array of the key-value pairs for `object`,\n     * e.g. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n     */\n      function pairs(object) {\n        var index = -1, props = keys(object), length = props.length, result = Array(length);\n        while (++index < length) {\n          var key = props[index];\n          result[index] = [\n            key,\n            object[key]\n          ];\n        }\n        return result;\n      }\n      /**\n     * Creates an object composed of the picked `object` properties. Property\n     * names may be specified as individual arguments or as arrays of property\n     * names. If `predicate` is provided it is invoked for each property of `object`\n     * picking the properties `predicate` returns truthy for. The predicate is\n     * bound to `thisArg` and invoked with three arguments; (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.pick(object, 'user');\n     * // => { 'user': 'fred' }\n     *\n     * _.pick(object, _.isString);\n     * // => { 'user': 'fred' }\n     */\n      function pick(object, predicate, thisArg) {\n        if (object == null) {\n          return {};\n        }\n        return typeof predicate == 'function' ? pickByCallback(object, bindCallback(predicate, thisArg, 3)) : pickByArray(object, baseFlatten(arguments, false, false, 1));\n      }\n      /**\n     * Resolves the value of property `key` on `object`. If the value of `key` is\n     * a function it is invoked with the `this` binding of `object` and its result\n     * is returned, else the property value is returned. If the property value is\n     * `undefined` the `defaultValue` is used in its place.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to resolve.\n     * @param {*} [defaultValue] The value returned if the property value\n     *  resolves to `undefined`.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': _.constant(40) };\n     *\n     * _.result(object, 'user');\n     * // => 'fred'\n     *\n     * _.result(object, 'age');\n     * // => 40\n     *\n     * _.result(object, 'status', 'busy');\n     * // => 'busy'\n     *\n     * _.result(object, 'status', _.constant('busy'));\n     * // => 'busy'\n     */\n      function result(object, key, defaultValue) {\n        var value = object == null ? undefined : object[key];\n        if (typeof value == 'undefined') {\n          value = defaultValue;\n        }\n        return isFunction(value) ? value.call(object) : value;\n      }\n      /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own enumerable\n     * properties through `iteratee`, with each invocation potentially mutating\n     * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n     * with four arguments; (accumulator, value, key, object). Iterator functions\n     * may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6], function(result, n) {\n     *   n *= n;\n     *   if (n % 2) {\n     *     return result.push(n) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n      function transform(object, iteratee, accumulator, thisArg) {\n        var isArr = isArray(object) || isTypedArray(object);\n        iteratee = getCallback(iteratee, thisArg, 4);\n        if (accumulator == null) {\n          if (isArr || isObject(object)) {\n            var Ctor = object.constructor;\n            if (isArr) {\n              accumulator = isArray(object) ? new Ctor() : [];\n            } else {\n              accumulator = baseCreate(typeof Ctor == 'function' && Ctor.prototype);\n            }\n          } else {\n            accumulator = {};\n          }\n        }\n        (isArr ? arrayEach : baseForOwn)(object, function (value, index, object) {\n          return iteratee(accumulator, value, index, object);\n        });\n        return accumulator;\n      }\n      /**\n     * Creates an array of the own enumerable property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n      function values(object) {\n        return baseValues(object, keys(object));\n      }\n      /**\n     * Creates an array of the own and inherited enumerable property values\n     * of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n      function valuesIn(object) {\n        return baseValues(object, keysIn(object));\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number is returned.\n     * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n     * number is returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n      function random(min, max, floating) {\n        if (floating && isIterateeCall(min, max, floating)) {\n          max = floating = null;\n        }\n        var noMin = min == null, noMax = max == null;\n        if (floating == null) {\n          if (noMax && typeof min == 'boolean') {\n            floating = min;\n            min = 1;\n          } else if (typeof max == 'boolean') {\n            floating = max;\n            noMax = true;\n          }\n        }\n        if (noMin && noMax) {\n          max = 1;\n          noMax = false;\n        }\n        min = +min || 0;\n        if (noMax) {\n          max = min;\n          min = 0;\n        } else {\n          max = +max || 0;\n        }\n        if (floating || min % 1 || max % 1) {\n          var rand = nativeRandom();\n          return nativeMin(min + rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1))), max);\n        }\n        return baseRandom(min, max);\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Converts `string` to camel case.\n     * See [Wikipedia](https://en.wikipedia.org/wiki/CamelCase) for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__foo_bar__');\n     * // => 'fooBar'\n     */\n      var camelCase = createCompounder(function (result, word, index) {\n          word = word.toLowerCase();\n          return result + (index ? word.charAt(0).toUpperCase() + word.slice(1) : word);\n        });\n      /**\n     * Capitalizes the first character of `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('fred');\n     * // => 'Fred'\n     */\n      function capitalize(string) {\n        string = baseToString(string);\n        return string && string.charAt(0).toUpperCase() + string.slice(1);\n      }\n      /**\n     * Deburrs `string` by converting latin-1 supplementary letters to basic latin letters.\n     * See [Wikipedia](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n      function deburr(string) {\n        string = baseToString(string);\n        return string && string.replace(reLatin1, deburrLetter);\n      }\n      /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search from.\n     * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n      function endsWith(string, target, position) {\n        string = baseToString(string);\n        target = target + '';\n        var length = string.length;\n        position = (typeof position == 'undefined' ? length : nativeMin(position < 0 ? 0 : +position || 0, length)) - target.length;\n        return position >= 0 && string.indexOf(target, position) == position;\n      }\n      /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and '`', in `string` to\n     * their corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional characters\n     * use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't require escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value.\n     * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * Backticks are escaped because in Internet Explorer < 9, they can break out\n     * of attribute values or HTML comments. See [#102](https://html5sec.org/#102),\n     * [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of\n     * the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.\n     *\n     * When working with HTML you should always quote attribute values to reduce\n     * XSS vectors. See [Ryan Grove's article](http://wonko.com/post/html-escaping)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n      function escape(string) {\n        // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n        string = baseToString(string);\n        return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;\n      }\n      /**\n     * Escapes the `RegExp` special characters \"\\\", \"^\", \"$\", \".\", \"|\", \"?\", \"*\",\n     * \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n      function escapeRegExp(string) {\n        string = baseToString(string);\n        return string && reHasRegExpChars.test(string) ? string.replace(reRegExpChars, '\\\\$&') : string;\n      }\n      /**\n     * Converts `string` to kebab case (a.k.a. spinal case).\n     * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles) for\n     * more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__foo_bar__');\n     * // => 'foo-bar'\n     */\n      var kebabCase = createCompounder(function (result, word, index) {\n          return result + (index ? '-' : '') + word.toLowerCase();\n        });\n      /**\n     * Pads `string` on the left and right sides if it is shorter then the given\n     * padding length. The `chars` string may be truncated if the number of padding\n     * characters can't be evenly divided by the padding length.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n      function pad(string, length, chars) {\n        string = baseToString(string);\n        length = +length;\n        var strLength = string.length;\n        if (strLength >= length || !nativeIsFinite(length)) {\n          return string;\n        }\n        var mid = (length - strLength) / 2, leftLength = floor(mid), rightLength = ceil(mid);\n        chars = createPad('', rightLength, chars);\n        return chars.slice(0, leftLength) + string + chars;\n      }\n      /**\n     * Pads `string` on the left side if it is shorter then the given padding\n     * length. The `chars` string may be truncated if the number of padding\n     * characters exceeds the padding length.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padLeft('abc', 6);\n     * // => '   abc'\n     *\n     * _.padLeft('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padLeft('abc', 3);\n     * // => 'abc'\n     */\n      function padLeft(string, length, chars) {\n        string = baseToString(string);\n        return string && createPad(string, length, chars) + string;\n      }\n      /**\n     * Pads `string` on the right side if it is shorter then the given padding\n     * length. The `chars` string may be truncated if the number of padding\n     * characters exceeds the padding length.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padRight('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padRight('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padRight('abc', 3);\n     * // => 'abc'\n     */\n      function padRight(string, length, chars) {\n        string = baseToString(string);\n        return string && string + createPad(string, length, chars);\n      }\n      /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n     * in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the ES5 implementation of `parseInt`.\n     * See the [ES5 spec](https://es5.github.io/#E) for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n      function parseInt(string, radix, guard) {\n        if (guard && isIterateeCall(string, radix, guard)) {\n          radix = 0;\n        }\n        return nativeParseInt(string, radix);\n      }\n      // Fallback for environments with pre-ES5 implementations.\n      if (nativeParseInt(whitespace + '08') != 8) {\n        parseInt = function (string, radix, guard) {\n          // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n          // Chrome fails to trim leading <BOM> whitespace characters.\n          // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n          if (guard ? isIterateeCall(string, radix, guard) : radix == null) {\n            radix = 0;\n          } else if (radix) {\n            radix = +radix;\n          }\n          string = trim(string);\n          return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10));\n        };\n      }\n      /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=0] The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n      function repeat(string, n) {\n        var result = '';\n        string = baseToString(string);\n        n = +n;\n        if (n < 1 || !string || !nativeIsFinite(n)) {\n          return result;\n        }\n        // Leverage the exponentiation by squaring algorithm for a faster repeat.\n        // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n        do {\n          if (n % 2) {\n            result += string;\n          }\n          n = floor(n / 2);\n          string += string;\n        } while (n);\n        return result;\n      }\n      /**\n     * Converts `string` to snake case.\n     * See [Wikipedia](https://en.wikipedia.org/wiki/Snake_case) for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--foo-bar');\n     * // => 'foo_bar'\n     */\n      var snakeCase = createCompounder(function (result, word, index) {\n          return result + (index ? '_' : '') + word.toLowerCase();\n        });\n      /**\n     * Converts `string` to start case.\n     * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__foo_bar__');\n     * // => 'Foo Bar'\n     */\n      var startCase = createCompounder(function (result, word, index) {\n          return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n        });\n      /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n      function startsWith(string, target, position) {\n        string = baseToString(string);\n        position = position == null ? 0 : nativeMin(position < 0 ? 0 : +position || 0, string.length);\n        return string.lastIndexOf(target, position) == position;\n      }\n      /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is provided it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes sourceURLs for easier debugging.\n     * See the [HTML5 Rocks article on sourcemaps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for more details.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [options.variable] The data object variable name.\n     * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // using the HTML \"escape\" delimiter to escape data property values\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to execute JavaScript and generate HTML\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using the ES delimiter as an alternative to the default \"interpolate\" delimiter\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // using custom template delimiters\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using backslashes to treat delimiters as plain text\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // using the `imports` option to import `jQuery` as `jq`\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '';\n     *   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n      function template(string, options, otherOptions) {\n        // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)\n        // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n        var settings = lodash.templateSettings;\n        if (otherOptions && isIterateeCall(string, options, otherOptions)) {\n          options = otherOptions = null;\n        }\n        string = baseToString(string);\n        options = baseAssign(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);\n        var imports = baseAssign(baseAssign({}, options.imports), settings.imports, assignOwnDefaults), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys);\n        var isEscaping, isEvaluating, index = 0, interpolate = options.interpolate || reNoMatch, source = '__p += \\'';\n        // Compile the regexp to match each delimiter.\n        var reDelimiters = RegExp((options.escape || reNoMatch).source + '|' + interpolate.source + '|' + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + (options.evaluate || reNoMatch).source + '|$', 'g');\n        // Use a sourceURL for easier debugging.\n        var sourceURL = '//# sourceURL=' + ('sourceURL' in options ? options.sourceURL : 'lodash.templateSources[' + ++templateCounter + ']') + '\\n';\n        string.replace(reDelimiters, function (match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n          interpolateValue || (interpolateValue = esTemplateValue);\n          // Escape characters that can't be included in string literals.\n          source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n          // Replace delimiters with snippets.\n          if (escapeValue) {\n            isEscaping = true;\n            source += '\\' +\\n__e(' + escapeValue + ') +\\n\\'';\n          }\n          if (evaluateValue) {\n            isEvaluating = true;\n            source += '\\';\\n' + evaluateValue + ';\\n__p += \\'';\n          }\n          if (interpolateValue) {\n            source += '\\' +\\n((__t = (' + interpolateValue + ')) == null ? \\'\\' : __t) +\\n\\'';\n          }\n          index = offset + match.length;\n          // The JS engine embedded in Adobe products requires returning the `match`\n          // string in order to produce the correct `offset` value.\n          return match;\n        });\n        source += '\\';\\n';\n        // If `variable` is not specified wrap a with-statement around the generated\n        // code to add the data object to the top of the scope chain.\n        var variable = options.variable;\n        if (!variable) {\n          source = 'with (obj) {\\n' + source + '\\n}\\n';\n        }\n        // Cleanup code by stripping empty strings.\n        source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source).replace(reEmptyStringMiddle, '$1').replace(reEmptyStringTrailing, '$1;');\n        // Frame code as the function body.\n        source = 'function(' + (variable || 'obj') + ') {\\n' + (variable ? '' : 'obj || (obj = {});\\n') + 'var __t, __p = \\'\\'' + (isEscaping ? ', __e = _.escape' : '') + (isEvaluating ? ', __j = Array.prototype.join;\\n' + 'function print() { __p += __j.call(arguments, \\'\\') }\\n' : ';\\n') + source + 'return __p\\n}';\n        var result = attempt(function () {\n            return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);\n          });\n        // Provide the compiled function's source by its `toString` method or\n        // the `source` property as a convenience for inlining compiled templates.\n        result.source = source;\n        if (isError(result)) {\n          throw result;\n        }\n        return result;\n      }\n      /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar]\n     */\n      function trim(string, chars, guard) {\n        var value = string;\n        string = baseToString(string);\n        if (!string) {\n          return string;\n        }\n        if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n          return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);\n        }\n        chars = chars + '';\n        return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);\n      }\n      /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimLeft('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimLeft('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n      function trimLeft(string, chars, guard) {\n        var value = string;\n        string = baseToString(string);\n        if (!string) {\n          return string;\n        }\n        if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n          return string.slice(trimmedLeftIndex(string));\n        }\n        return string.slice(charsLeftIndex(string, chars + ''));\n      }\n      /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimRight('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimRight('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n      function trimRight(string, chars, guard) {\n        var value = string;\n        string = baseToString(string);\n        if (!string) {\n          return string;\n        }\n        if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n          return string.slice(0, trimmedRightIndex(string) + 1);\n        }\n        return string.slice(0, charsRightIndex(string, chars + '') + 1);\n      }\n      /**\n     * Truncates `string` if it is longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object|number} [options] The options object or maximum string length.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.trunc('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', 24);\n     * // => 'hi-diddly-ho there, n...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', { 'length': 24, 'separator': ' ' });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', { 'length': 24, 'separator': /,? +/ });\n     * //=> 'hi-diddly-ho there...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', { 'omission': ' [...]' });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n      function trunc(string, options, guard) {\n        if (guard && isIterateeCall(string, options, guard)) {\n          options = null;\n        }\n        var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;\n        if (options != null) {\n          if (isObject(options)) {\n            var separator = 'separator' in options ? options.separator : separator;\n            length = 'length' in options ? +options.length || 0 : length;\n            omission = 'omission' in options ? baseToString(options.omission) : omission;\n          } else {\n            length = +options || 0;\n          }\n        }\n        string = baseToString(string);\n        if (length >= string.length) {\n          return string;\n        }\n        var end = length - omission.length;\n        if (end < 1) {\n          return omission;\n        }\n        var result = string.slice(0, end);\n        if (separator == null) {\n          return result + omission;\n        }\n        if (isRegExp(separator)) {\n          if (string.slice(end).search(separator)) {\n            var match, newEnd, substring = string.slice(0, end);\n            if (!separator.global) {\n              separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');\n            }\n            separator.lastIndex = 0;\n            while (match = separator.exec(substring)) {\n              newEnd = match.index;\n            }\n            result = result.slice(0, newEnd == null ? end : newEnd);\n          }\n        } else if (string.indexOf(separator, end) != end) {\n          var index = result.lastIndexOf(separator);\n          if (index > -1) {\n            result = result.slice(0, index);\n          }\n        }\n        return result + omission;\n      }\n      /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their\n     * corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional HTML\n     * entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n      function unescape(string) {\n        string = baseToString(string);\n        return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;\n      }\n      /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n      function words(string, pattern, guard) {\n        if (guard && isIterateeCall(string, pattern, guard)) {\n          pattern = null;\n        }\n        string = baseToString(string);\n        return string.match(pattern || reWords) || [];\n      }\n      /*------------------------------------------------------------------------*/\n      /**\n     * Attempts to invoke `func`, returning either the result or the caught\n     * error object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} func The function to attempt.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // avoid throwing errors for invalid selectors\n     * var elements = _.attempt(function() {\n     *   return document.querySelectorAll(selector);\n     * });\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n      function attempt(func) {\n        try {\n          return func();\n        } catch (e) {\n          return isError(e) ? e : Error(e);\n        }\n      }\n      /**\n     * Creates a function bound to an optional `thisArg`. If `func` is a property\n     * name the created callback returns the property value for a given element.\n     * If `func` is an object the created callback returns `true` for elements\n     * that contain the equivalent object properties, otherwise it returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias iteratee\n     * @category Utility\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);\n     *   if (!match) {\n     *     return callback(func, thisArg);\n     *   }\n     *   return function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(users, 'age__gt36');\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     */\n      function callback(func, thisArg, guard) {\n        if (guard && isIterateeCall(func, thisArg, guard)) {\n          thisArg = null;\n        }\n        return isObjectLike(func) ? matches(func) : baseCallback(func, thisArg);\n      }\n      /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n      function constant(value) {\n        return function () {\n          return value;\n        };\n      }\n      /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n      function identity(value) {\n        return value;\n      }\n      /**\n     * Creates a function which performs a deep comparison between a given object\n     * and `source`, returning `true` if the given object has equivalent property\n     * values, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * var matchesAge = _.matches({ 'age': 36 });\n     *\n     * _.filter(users, matchesAge);\n     * // => [{ 'user': 'barney', 'age': 36 }]\n     *\n     * _.find(users, matchesAge);\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n      function matches(source) {\n        return baseMatches(baseClone(source, true));\n      }\n      /**\n     * Adds all own enumerable function properties of a source object to the\n     * destination object. If `object` is a function then methods are added to\n     * its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function|Object} [object=this] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added\n     *  are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n      function mixin(object, source, options) {\n        if (options == null) {\n          var isObj = isObject(source), props = isObj && keys(source), methodNames = props && props.length && baseFunctions(source, props);\n          if (!(methodNames ? methodNames.length : isObj)) {\n            methodNames = false;\n            options = source;\n            source = object;\n            object = this;\n          }\n        }\n        if (!methodNames) {\n          methodNames = baseFunctions(source, keys(source));\n        }\n        var chain = true, index = -1, isFunc = isFunction(object), length = methodNames.length;\n        if (options === false) {\n          chain = false;\n        } else if (isObject(options) && 'chain' in options) {\n          chain = options.chain;\n        }\n        while (++index < length) {\n          var methodName = methodNames[index], func = source[methodName];\n          object[methodName] = func;\n          if (isFunc) {\n            object.prototype[methodName] = function (func) {\n              return function () {\n                var chainAll = this.__chain__;\n                if (chain || chainAll) {\n                  var result = object(this.__wrapped__);\n                  (result.__actions__ = arrayCopy(this.__actions__)).push({\n                    'func': func,\n                    'args': arguments,\n                    'thisArg': object\n                  });\n                  result.__chain__ = chainAll;\n                  return result;\n                }\n                var args = [this.value()];\n                push.apply(args, arguments);\n                return func.apply(object, args);\n              };\n            }(func);\n          }\n        }\n        return object;\n      }\n      /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n      function noConflict() {\n        context._ = oldDash;\n        return this;\n      }\n      /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n      function noop() {\n      }\n      /**\n     * Creates a function which returns the property value of `key` on a given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * var getName = _.property('user');\n     *\n     * _.map(users, getName);\n     * // => ['fred', barney']\n     *\n     * _.pluck(_.sortBy(users, getName), 'user');\n     * // => ['barney', 'fred']\n     */\n      function property(key) {\n        return baseProperty(key + '');\n      }\n      /**\n     * The inverse of `_.property`; this method creates a function which returns\n     * the property value of a given key on `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} object The object to inspect.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40, 'active': true };\n     * _.map(['active', 'user'], _.propertyOf(object));\n     * // => [true, 'fred']\n     *\n     * var object = { 'a': 3, 'b': 1, 'c': 2 };\n     * _.sortBy(['a', 'b', 'c'], _.propertyOf(object));\n     * // => ['b', 'c', 'a']\n     */\n      function propertyOf(object) {\n        return function (key) {\n          return object == null ? undefined : object[key];\n        };\n      }\n      /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. If `start` is less than `end` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the new array of numbers.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n      function range(start, end, step) {\n        if (step && isIterateeCall(start, end, step)) {\n          end = step = null;\n        }\n        start = +start || 0;\n        step = step == null ? 1 : +step || 0;\n        if (end == null) {\n          end = start;\n          start = 0;\n        } else {\n          end = +end || 0;\n        }\n        // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.\n        // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.\n        var index = -1, length = nativeMax(ceil((end - start) / (step || 1)), 0), result = Array(length);\n        while (++index < length) {\n          result[index] = start;\n          start += step;\n        }\n        return result;\n      }\n      /**\n     * Invokes the iteratee function `n` times, returning an array of the results\n     * of each invocation. The `iteratee` is bound to `thisArg` and invoked with\n     * one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also invokes `mage.castSpell(n)` three times\n     */\n      function times(n, iteratee, thisArg) {\n        n = +n;\n        // Exit early to avoid a JSC JIT bug in Safari 8\n        // where `Array(0)` is treated as `Array(1)`.\n        if (n < 1 || !nativeIsFinite(n)) {\n          return [];\n        }\n        var index = -1, result = Array(nativeMin(n, MAX_ARRAY_LENGTH));\n        iteratee = bindCallback(iteratee, thisArg, 1);\n        while (++index < n) {\n          if (index < MAX_ARRAY_LENGTH) {\n            result[index] = iteratee(index);\n          } else {\n            iteratee(index);\n          }\n        }\n        return result;\n      }\n      /**\n     * Generates a unique ID. If `prefix` is provided the ID is appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n      function uniqueId(prefix) {\n        var id = ++idCounter;\n        return baseToString(prefix) + id;\n      }\n      /*------------------------------------------------------------------------*/\n      // Ensure `new LodashWrapper` is an instance of `lodash`.\n      LodashWrapper.prototype = lodash.prototype;\n      // Add functions to the `Map` cache.\n      MapCache.prototype['delete'] = mapDelete;\n      MapCache.prototype.get = mapGet;\n      MapCache.prototype.has = mapHas;\n      MapCache.prototype.set = mapSet;\n      // Add functions to the `Set` cache.\n      SetCache.prototype.push = cachePush;\n      // Assign cache to `_.memoize`.\n      memoize.Cache = MapCache;\n      // Add functions that return wrapped values when chaining.\n      lodash.after = after;\n      lodash.ary = ary;\n      lodash.assign = assign;\n      lodash.at = at;\n      lodash.before = before;\n      lodash.bind = bind;\n      lodash.bindAll = bindAll;\n      lodash.bindKey = bindKey;\n      lodash.callback = callback;\n      lodash.chain = chain;\n      lodash.chunk = chunk;\n      lodash.compact = compact;\n      lodash.constant = constant;\n      lodash.countBy = countBy;\n      lodash.create = create;\n      lodash.curry = curry;\n      lodash.curryRight = curryRight;\n      lodash.debounce = debounce;\n      lodash.defaults = defaults;\n      lodash.defer = defer;\n      lodash.delay = delay;\n      lodash.difference = difference;\n      lodash.drop = drop;\n      lodash.dropRight = dropRight;\n      lodash.dropRightWhile = dropRightWhile;\n      lodash.dropWhile = dropWhile;\n      lodash.filter = filter;\n      lodash.flatten = flatten;\n      lodash.flattenDeep = flattenDeep;\n      lodash.flow = flow;\n      lodash.flowRight = flowRight;\n      lodash.forEach = forEach;\n      lodash.forEachRight = forEachRight;\n      lodash.forIn = forIn;\n      lodash.forInRight = forInRight;\n      lodash.forOwn = forOwn;\n      lodash.forOwnRight = forOwnRight;\n      lodash.functions = functions;\n      lodash.groupBy = groupBy;\n      lodash.indexBy = indexBy;\n      lodash.initial = initial;\n      lodash.intersection = intersection;\n      lodash.invert = invert;\n      lodash.invoke = invoke;\n      lodash.keys = keys;\n      lodash.keysIn = keysIn;\n      lodash.map = map;\n      lodash.mapValues = mapValues;\n      lodash.matches = matches;\n      lodash.memoize = memoize;\n      lodash.merge = merge;\n      lodash.mixin = mixin;\n      lodash.negate = negate;\n      lodash.omit = omit;\n      lodash.once = once;\n      lodash.pairs = pairs;\n      lodash.partial = partial;\n      lodash.partialRight = partialRight;\n      lodash.partition = partition;\n      lodash.pick = pick;\n      lodash.pluck = pluck;\n      lodash.property = property;\n      lodash.propertyOf = propertyOf;\n      lodash.pull = pull;\n      lodash.pullAt = pullAt;\n      lodash.range = range;\n      lodash.rearg = rearg;\n      lodash.reject = reject;\n      lodash.remove = remove;\n      lodash.rest = rest;\n      lodash.shuffle = shuffle;\n      lodash.slice = slice;\n      lodash.sortBy = sortBy;\n      lodash.sortByAll = sortByAll;\n      lodash.take = take;\n      lodash.takeRight = takeRight;\n      lodash.takeRightWhile = takeRightWhile;\n      lodash.takeWhile = takeWhile;\n      lodash.tap = tap;\n      lodash.throttle = throttle;\n      lodash.thru = thru;\n      lodash.times = times;\n      lodash.toArray = toArray;\n      lodash.toPlainObject = toPlainObject;\n      lodash.transform = transform;\n      lodash.union = union;\n      lodash.uniq = uniq;\n      lodash.unzip = unzip;\n      lodash.values = values;\n      lodash.valuesIn = valuesIn;\n      lodash.where = where;\n      lodash.without = without;\n      lodash.wrap = wrap;\n      lodash.xor = xor;\n      lodash.zip = zip;\n      lodash.zipObject = zipObject;\n      // Add aliases.\n      lodash.backflow = flowRight;\n      lodash.collect = map;\n      lodash.compose = flowRight;\n      lodash.each = forEach;\n      lodash.eachRight = forEachRight;\n      lodash.extend = assign;\n      lodash.iteratee = callback;\n      lodash.methods = functions;\n      lodash.object = zipObject;\n      lodash.select = filter;\n      lodash.tail = rest;\n      lodash.unique = uniq;\n      // Add functions to `lodash.prototype`.\n      mixin(lodash, lodash);\n      /*------------------------------------------------------------------------*/\n      // Add functions that return unwrapped values when chaining.\n      lodash.attempt = attempt;\n      lodash.camelCase = camelCase;\n      lodash.capitalize = capitalize;\n      lodash.clone = clone;\n      lodash.cloneDeep = cloneDeep;\n      lodash.deburr = deburr;\n      lodash.endsWith = endsWith;\n      lodash.escape = escape;\n      lodash.escapeRegExp = escapeRegExp;\n      lodash.every = every;\n      lodash.find = find;\n      lodash.findIndex = findIndex;\n      lodash.findKey = findKey;\n      lodash.findLast = findLast;\n      lodash.findLastIndex = findLastIndex;\n      lodash.findLastKey = findLastKey;\n      lodash.findWhere = findWhere;\n      lodash.first = first;\n      lodash.has = has;\n      lodash.identity = identity;\n      lodash.includes = includes;\n      lodash.indexOf = indexOf;\n      lodash.isArguments = isArguments;\n      lodash.isArray = isArray;\n      lodash.isBoolean = isBoolean;\n      lodash.isDate = isDate;\n      lodash.isElement = isElement;\n      lodash.isEmpty = isEmpty;\n      lodash.isEqual = isEqual;\n      lodash.isError = isError;\n      lodash.isFinite = isFinite;\n      lodash.isFunction = isFunction;\n      lodash.isMatch = isMatch;\n      lodash.isNaN = isNaN;\n      lodash.isNative = isNative;\n      lodash.isNull = isNull;\n      lodash.isNumber = isNumber;\n      lodash.isObject = isObject;\n      lodash.isPlainObject = isPlainObject;\n      lodash.isRegExp = isRegExp;\n      lodash.isString = isString;\n      lodash.isTypedArray = isTypedArray;\n      lodash.isUndefined = isUndefined;\n      lodash.kebabCase = kebabCase;\n      lodash.last = last;\n      lodash.lastIndexOf = lastIndexOf;\n      lodash.max = max;\n      lodash.min = min;\n      lodash.noConflict = noConflict;\n      lodash.noop = noop;\n      lodash.now = now;\n      lodash.pad = pad;\n      lodash.padLeft = padLeft;\n      lodash.padRight = padRight;\n      lodash.parseInt = parseInt;\n      lodash.random = random;\n      lodash.reduce = reduce;\n      lodash.reduceRight = reduceRight;\n      lodash.repeat = repeat;\n      lodash.result = result;\n      lodash.runInContext = runInContext;\n      lodash.size = size;\n      lodash.snakeCase = snakeCase;\n      lodash.some = some;\n      lodash.sortedIndex = sortedIndex;\n      lodash.sortedLastIndex = sortedLastIndex;\n      lodash.startCase = startCase;\n      lodash.startsWith = startsWith;\n      lodash.template = template;\n      lodash.trim = trim;\n      lodash.trimLeft = trimLeft;\n      lodash.trimRight = trimRight;\n      lodash.trunc = trunc;\n      lodash.unescape = unescape;\n      lodash.uniqueId = uniqueId;\n      lodash.words = words;\n      // Add aliases.\n      lodash.all = every;\n      lodash.any = some;\n      lodash.contains = includes;\n      lodash.detect = find;\n      lodash.foldl = reduce;\n      lodash.foldr = reduceRight;\n      lodash.head = first;\n      lodash.include = includes;\n      lodash.inject = reduce;\n      mixin(lodash, function () {\n        var source = {};\n        baseForOwn(lodash, function (func, methodName) {\n          if (!lodash.prototype[methodName]) {\n            source[methodName] = func;\n          }\n        });\n        return source;\n      }(), false);\n      /*------------------------------------------------------------------------*/\n      // Add functions capable of returning wrapped and unwrapped values when chaining.\n      lodash.sample = sample;\n      lodash.prototype.sample = function (n) {\n        if (!this.__chain__ && n == null) {\n          return sample(this.value());\n        }\n        return this.thru(function (value) {\n          return sample(value, n);\n        });\n      };\n      /*------------------------------------------------------------------------*/\n      /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n      lodash.VERSION = VERSION;\n      // Assign default placeholders.\n      arrayEach([\n        'bind',\n        'bindKey',\n        'curry',\n        'curryRight',\n        'partial',\n        'partialRight'\n      ], function (methodName) {\n        lodash[methodName].placeholder = lodash;\n      });\n      // Add `LazyWrapper` methods that accept an `iteratee` value.\n      arrayEach([\n        'filter',\n        'map',\n        'takeWhile'\n      ], function (methodName, index) {\n        var isFilter = index == LAZY_FILTER_FLAG;\n        LazyWrapper.prototype[methodName] = function (iteratee, thisArg) {\n          var result = this.clone(), filtered = result.filtered, iteratees = result.iteratees || (result.iteratees = []);\n          result.filtered = filtered || isFilter || index == LAZY_WHILE_FLAG && result.dir < 0;\n          iteratees.push({\n            'iteratee': getCallback(iteratee, thisArg, 3),\n            'type': index\n          });\n          return result;\n        };\n      });\n      // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n      arrayEach([\n        'drop',\n        'take'\n      ], function (methodName, index) {\n        var countName = methodName + 'Count', whileName = methodName + 'While';\n        LazyWrapper.prototype[methodName] = function (n) {\n          n = n == null ? 1 : nativeMax(+n || 0, 0);\n          var result = this.clone();\n          if (result.filtered) {\n            var value = result[countName];\n            result[countName] = index ? nativeMin(value, n) : value + n;\n          } else {\n            var views = result.views || (result.views = []);\n            views.push({\n              'size': n,\n              'type': methodName + (result.dir < 0 ? 'Right' : '')\n            });\n          }\n          return result;\n        };\n        LazyWrapper.prototype[methodName + 'Right'] = function (n) {\n          return this.reverse()[methodName](n).reverse();\n        };\n        LazyWrapper.prototype[methodName + 'RightWhile'] = function (predicate, thisArg) {\n          return this.reverse()[whileName](predicate, thisArg).reverse();\n        };\n      });\n      // Add `LazyWrapper` methods for `_.first` and `_.last`.\n      arrayEach([\n        'first',\n        'last'\n      ], function (methodName, index) {\n        var takeName = 'take' + (index ? 'Right' : '');\n        LazyWrapper.prototype[methodName] = function () {\n          return this[takeName](1).value()[0];\n        };\n      });\n      // Add `LazyWrapper` methods for `_.initial` and `_.rest`.\n      arrayEach([\n        'initial',\n        'rest'\n      ], function (methodName, index) {\n        var dropName = 'drop' + (index ? '' : 'Right');\n        LazyWrapper.prototype[methodName] = function () {\n          return this[dropName](1);\n        };\n      });\n      // Add `LazyWrapper` methods for `_.pluck` and `_.where`.\n      arrayEach([\n        'pluck',\n        'where'\n      ], function (methodName, index) {\n        var operationName = index ? 'filter' : 'map', createCallback = index ? baseMatches : baseProperty;\n        LazyWrapper.prototype[methodName] = function (value) {\n          return this[operationName](createCallback(index ? value : value + ''));\n        };\n      });\n      LazyWrapper.prototype.dropWhile = function (iteratee, thisArg) {\n        var done, lastIndex, isRight = this.dir < 0;\n        iteratee = getCallback(iteratee, thisArg, 3);\n        return this.filter(function (value, index, array) {\n          done = done && (isRight ? index < lastIndex : index > lastIndex);\n          lastIndex = index;\n          return done || (done = !iteratee(value, index, array));\n        });\n      };\n      LazyWrapper.prototype.reject = function (iteratee, thisArg) {\n        iteratee = getCallback(iteratee, thisArg, 3);\n        return this.filter(function (value, index, array) {\n          return !iteratee(value, index, array);\n        });\n      };\n      LazyWrapper.prototype.slice = function (start, end) {\n        start = start == null ? 0 : +start || 0;\n        var result = start < 0 ? this.takeRight(-start) : this.drop(start);\n        if (typeof end != 'undefined') {\n          end = +end || 0;\n          result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n        }\n        return result;\n      };\n      // Add `LazyWrapper` methods to `lodash.prototype`.\n      baseForOwn(LazyWrapper.prototype, function (func, methodName) {\n        var lodashFunc = lodash[methodName], retUnwrapped = /^(?:first|last)$/.test(methodName);\n        lodash.prototype[methodName] = function () {\n          var value = this.__wrapped__, args = arguments, chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isLazy = value instanceof LazyWrapper, onlyLazy = isLazy && !isHybrid;\n          if (retUnwrapped && !chainAll) {\n            return onlyLazy ? func.call(value) : lodashFunc.call(lodash, this.value());\n          }\n          var interceptor = function (value) {\n            var otherArgs = [value];\n            push.apply(otherArgs, args);\n            return lodashFunc.apply(lodash, otherArgs);\n          };\n          if (isLazy || isArray(value)) {\n            var wrapper = onlyLazy ? value : new LazyWrapper(this), result = func.apply(wrapper, args);\n            if (!retUnwrapped && (isHybrid || result.actions)) {\n              var actions = result.actions || (result.actions = []);\n              actions.push({\n                'func': thru,\n                'args': [interceptor],\n                'thisArg': lodash\n              });\n            }\n            return new LodashWrapper(result, chainAll);\n          }\n          return this.thru(interceptor);\n        };\n      });\n      // Add `Array.prototype` functions to `lodash.prototype`.\n      arrayEach([\n        'concat',\n        'join',\n        'pop',\n        'push',\n        'shift',\n        'sort',\n        'splice',\n        'unshift'\n      ], function (methodName) {\n        var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', retUnwrapped = /^(?:join|pop|shift)$/.test(methodName);\n        lodash.prototype[methodName] = function () {\n          var args = arguments;\n          if (retUnwrapped && !this.__chain__) {\n            return func.apply(this.value(), args);\n          }\n          return this[chainName](function (value) {\n            return func.apply(value, args);\n          });\n        };\n      });\n      // Add functions to the lazy wrapper.\n      LazyWrapper.prototype.clone = lazyClone;\n      LazyWrapper.prototype.reverse = lazyReverse;\n      LazyWrapper.prototype.value = lazyValue;\n      // Add chaining functions to the lodash wrapper.\n      lodash.prototype.chain = wrapperChain;\n      lodash.prototype.reverse = wrapperReverse;\n      lodash.prototype.toString = wrapperToString;\n      lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n      // Add function aliases to the lodash wrapper.\n      lodash.prototype.collect = lodash.prototype.map;\n      lodash.prototype.head = lodash.prototype.first;\n      lodash.prototype.select = lodash.prototype.filter;\n      lodash.prototype.tail = lodash.prototype.rest;\n      return lodash;\n    }\n    /*--------------------------------------------------------------------------*/\n    // Export lodash.\n    var _ = runInContext();\n    // Some AMD build optimizers like r.js check for condition patterns like the following:\n    if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n      // Define as an anonymous module so, through path mapping, it can be\n      // referenced as the \"underscore\" module.\n      define(function () {\n        return _;\n      });\n    }  // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n    else if (freeExports && freeModule) {\n      // Export for Node.js or RingoJS.\n      if (moduleExports) {\n        (freeModule.exports = _)._ = _;\n      }  // Export for Narwhal or Rhino -require.\n      else {\n        freeExports._ = _;\n      }\n    }\n    $provide.constant('lodash', _);\n  }\n]);"
  },
  {
    "path": "third_party/ui/bower_components/ng-lodash/package.json",
    "content": "{\n  \"name\": \"ng-lodash\",\n  \"version\": \"0.2.0\",\n  \"description\": \"An Angular module wrapper for lodash\",\n  \"main\": \"build/ng-lodash.js\",\n  \"scripts\": {\n    \"test\": \"grunt dist\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/rockabox/ng-lodash.git\"\n  },\n  \"keywords\": [\n    \"nglodash\",\n    \"angular\",\n    \"lodash\"\n  ],\n  \"author\": [\n    \"Rockabox <tech@rockabox.com> (http://rockabox.com)\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/rockabox/ng-lodash/issues\"\n  },\n  \"homepage\": \"https://github.com/rockabox/ng-lodash\",\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.5\",\n    \"grunt-bower-task\": \"~0.4.0\",\n    \"grunt-cli\": \"~0.1.13\",\n    \"grunt-contrib-jshint\": \"~0.11.0\",\n    \"grunt-contrib-uglify\": \"~0.7.0\",\n    \"grunt-jscs\": \"~1.5.0\",\n    \"grunt-karma\": \"~0.10.1\",\n    \"grunt-lodash\": \"~0.4.0\",\n    \"grunt-ngmin\": \"~0.0.3\",\n    \"jasmine-core\": \"~2.2.0\",\n    \"karma\": \"~0.12.16\",\n    \"karma-jasmine\": \"~0.3.1\",\n    \"karma-phantomjs-launcher\": \"~0.1.4\",\n    \"load-grunt-tasks\": \"~3.1.0\"\n  },\n  \"engines\": {\n    \"node\": \"~0.10.0\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/.bower.json",
    "content": "{\n  \"name\": \"sprintf\",\n  \"description\": \"JavaScript sprintf implementation\",\n  \"version\": \"1.0.2\",\n  \"main\": \"src/sprintf.js\",\n  \"license\": \"BSD-3-Clause-Clear\",\n  \"keywords\": [\n    \"sprintf\",\n    \"string\",\n    \"formatting\"\n  ],\n  \"authors\": [\n    \"Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)\"\n  ],\n  \"homepage\": \"https://github.com/alexei/sprintf.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/alexei/sprintf.js.git\"\n  },\n  \"_release\": \"1.0.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"1.0.2\",\n    \"commit\": \"b78667e68ab0ba1acc91e52c0d694273dba66dfe\"\n  },\n  \"_source\": \"git://github.com/alexei/sprintf.js.git\",\n  \"_target\": \"~1.0.2\",\n  \"_originalSource\": \"sprintf\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/.gitignore",
    "content": "/node_modules/"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/LICENSE",
    "content": "Copyright (c) 2007-2013, Alexandru Marasteanu <hello [at) alexei (dot] ro>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\n  notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\n  notice, this list of conditions and the following disclaimer in the\n  documentation and/or other materials provided with the distribution.\n* Neither the name of this software nor the names of its contributors may be\n  used to endorse or promote products derived from this software without\n  specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/README.md",
    "content": "# sprintf.js\n**sprintf.js** is a complete open source JavaScript sprintf implementation for the *browser* and *node.js*.\n\nIts prototype is simple:\n\n    string sprintf(string format , [mixed arg1 [, mixed arg2 [ ,...]]])\n\nThe placeholders in the format string are marked by `%` and are followed by one or more of these elements, in this order:\n\n* An optional number followed by a `$` sign that selects which argument index to use for the value. If not specified, arguments will be placed in the same order as the placeholders in the input string.\n* An optional `+` sign that forces to preceed the result with a plus or minus sign on numeric values. By default, only the `-` sign is used on negative numbers.\n* An optional padding specifier that says what character to use for padding (if specified). Possible values are `0` or any other character precedeed by a `'` (single quote). The default is to pad with *spaces*.\n* An optional `-` sign, that causes sprintf to left-align the result of this placeholder. The default is to right-align the result.\n* An optional number, that says how many characters the result should have. If the value to be returned is shorter than this number, the result will be padded.\n* An optional precision modifier, consisting of a `.` (dot) followed by a number, that says how many digits should be displayed for floating point numbers. When used on a string, it causes the result to be truncated.\n* A type specifier that can be any of:\n    * `%` — yields a literal `%` character\n    * `b` — yields an integer as a binary number\n    * `c` — yields an integer as the character with that ASCII value\n    * `d` or `i` — yields an integer as a signed decimal number\n    * `e` — yields a float using scientific notation\n    * `u` — yields an integer as an unsigned decimal number\n    * `f` — yields a float as is\n    * `o` — yields an integer as an octal number\n    * `s` — yields a string as is\n    * `x` — yields an integer as a hexadecimal number (lower-case)\n    * `X` — yields an integer as a hexadecimal number (upper-case)\n\n## JavaScript `vsprintf`\n`vsprintf` is the same as `sprintf` except that it accepts an array of arguments, rather than a variable number of arguments:\n\n    vsprintf(\"The first 4 letters of the english alphabet are: %s, %s, %s and %s\", [\"a\", \"b\", \"c\", \"d\"])\n\n## Argument swapping\nYou can also swap the arguments. That is, the order of the placeholders doesn't have to match the order of the arguments. You can do that by simply indicating in the format string which arguments the placeholders refer to:\n\n    sprintf(\"%2$s %3$s a %1$s\", \"cracker\", \"Polly\", \"wants\")\nAnd, of course, you can repeat the placeholders without having to increase the number of arguments.\n\n## Named arguments\nFormat strings may contain replacement fields rather than positional placeholders. Instead of referring to a certain argument, you can now refer to a certain key within an object. Replacement fields are surrounded by rounded parentheses - `(` and `)` - and begin with a keyword that refers to a key:\n\n    var user = {\n        name: \"Dolly\"\n    }\n    sprintf(\"Hello %(name)s\", user) // Hello Dolly\nKeywords in replacement fields can be optionally followed by any number of keywords or indexes:\n\n    var users = [\n        {name: \"Dolly\"},\n        {name: \"Molly\"},\n        {name: \"Polly\"}\n    ]\n    sprintf(\"Hello %(users[0].name)s, %(users[1].name)s and %(users[2].name)s\", {users: users}) // Hello Dolly, Molly and Polly\nNote: mixing positional and named placeholders is not (yet) supported\n\n## Computed values\nYou can pass in a function as a dynamic value and it will be invoked (with no arguments) in order to compute the value on-the-fly.\n\n    sprintf(\"Current timestamp: %d\", Date.now) // Current timestamp: 1398005382890\n    sprintf(\"Current date and time: %s\", function() { return new Date().toString() })\n\n# AngularJS\nYou can now use `sprintf` and `vsprintf` (also aliased as `fmt` and `vfmt` respectively) in your AngularJS projects. See `demo/`.\n\n# Installation\n\n## Via Bower\n\n    bower install sprintf\n\n## Or as a node.js module\n\n    npm install sprintf-js\n\n### Usage\n\n    var sprintf = require(\"sprintf-js\").sprintf,\n        vsprintf = require(\"sprintf-js\").vsprintf\n\n    sprintf(\"%2$s %3$s a %1$s\", \"cracker\", \"Polly\", \"wants\")\n    vsprintf(\"The first 4 letters of the english alphabet are: %s, %s, %s and %s\", [\"a\", \"b\", \"c\", \"d\"])\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/bower.json",
    "content": "{\n  \"name\": \"sprintf\",\n  \"description\": \"JavaScript sprintf implementation\",\n  \"version\": \"1.0.2\",\n  \"main\": \"src/sprintf.js\",\n  \"license\": \"BSD-3-Clause-Clear\",\n  \"keywords\": [\"sprintf\", \"string\", \"formatting\"],\n  \"authors\": [\"Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)\"],\n  \"homepage\": \"https://github.com/alexei/sprintf.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/alexei/sprintf.js.git\"\n  }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/demo/angular.html",
    "content": "<!doctype html>\n<html ng-app=\"app\">\n<head>\n    <script src=\"https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.3/angular.min.js\"></script>\n    <script src=\"../src/sprintf.js\"></script>\n    <script src=\"../src/angular-sprintf.js\"></script>\n</head>\n<body>\n    <pre>{{ \"%+010d\"|sprintf:-123 }}</pre>\n    <pre>{{ \"%+010d\"|vsprintf:[-123] }}</pre>\n    <pre>{{ \"%+010d\"|fmt:-123 }}</pre>\n    <pre>{{ \"%+010d\"|vfmt:[-123] }}</pre>\n    <pre>{{ \"I've got %2$d apples and %1$d oranges.\"|fmt:4:2 }}</pre>\n    <pre>{{ \"I've got %(apples)d apples and %(oranges)d oranges.\"|fmt:{apples: 2, oranges: 4} }}</pre>\n\n    <script>\n        angular.module(\"app\", [\"sprintf\"])\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/gruntfile.js",
    "content": "module.exports = function(grunt) {\n    grunt.initConfig({\n        pkg: grunt.file.readJSON(\"package.json\"),\n\n        uglify: {\n            options: {\n                banner: \"/*! <%= pkg.name %> | <%= pkg.author %> | <%= pkg.license %> */\\n\",\n                sourceMap: true\n            },\n            build: {\n                files: [\n                    {\n                        src: \"src/sprintf.js\",\n                        dest: \"dist/sprintf.min.js\"\n                    },\n                    {\n                        src: \"src/angular-sprintf.js\",\n                        dest: \"dist/angular-sprintf.min.js\"\n                    }\n                ]\n            }\n        },\n\n        watch: {\n            js: {\n                files: \"src/*.js\",\n                tasks: [\"uglify\"]\n            }\n        }\n    })\n\n    grunt.loadNpmTasks(\"grunt-contrib-uglify\")\n    grunt.loadNpmTasks(\"grunt-contrib-watch\")\n\n    grunt.registerTask(\"default\", [\"uglify\", \"watch\"])\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/package.json",
    "content": "{\n    \"name\": \"sprintf-js\",\n    \"version\": \"1.0.2\",\n    \"description\": \"JavaScript sprintf implementation\",\n    \"author\": \"Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)\",\n    \"main\": \"src/sprintf.js\",\n    \"scripts\": {\n        \"test\": \"mocha test/test.js\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/alexei/sprintf.js.git\"\n    },\n    \"license\": \"BSD-3-Clause\",\n    \"readmeFilename\": \"README.md\",\n    \"devDependencies\": {\n        \"mocha\": \"*\",\n        \"grunt\": \"*\",\n        \"grunt-contrib-watch\": \"*\",\n        \"grunt-contrib-uglify\": \"*\"\n    }\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/src/angular-sprintf.js",
    "content": "angular.\n    module(\"sprintf\", []).\n    filter(\"sprintf\", function() {\n        return function() {\n            return sprintf.apply(null, arguments)\n        }\n    }).\n    filter(\"fmt\", [\"$filter\", function($filter) {\n        return $filter(\"sprintf\")\n    }]).\n    filter(\"vsprintf\", function() {\n        return function(format, argv) {\n            return vsprintf(format, argv)\n        }\n    }).\n    filter(\"vfmt\", [\"$filter\", function($filter) {\n        return $filter(\"vsprintf\")\n    }])\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/src/sprintf.js",
    "content": "(function(window) {\n    var re = {\n        not_string: /[^s]/,\n        number: /[dief]/,\n        text: /^[^\\x25]+/,\n        modulo: /^\\x25{2}/,\n        placeholder: /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fiosuxX])/,\n        key: /^([a-z_][a-z_\\d]*)/i,\n        key_access: /^\\.([a-z_][a-z_\\d]*)/i,\n        index_access: /^\\[(\\d+)\\]/,\n        sign: /^[\\+\\-]/\n    }\n\n    function sprintf() {\n        var key = arguments[0], cache = sprintf.cache\n        if (!(cache[key] && cache.hasOwnProperty(key))) {\n            cache[key] = sprintf.parse(key)\n        }\n        return sprintf.format.call(null, cache[key], arguments)\n    }\n\n    sprintf.format = function(parse_tree, argv) {\n        var cursor = 1, tree_length = parse_tree.length, node_type = \"\", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = \"\"\n        for (i = 0; i < tree_length; i++) {\n            node_type = get_type(parse_tree[i])\n            if (node_type === \"string\") {\n                output[output.length] = parse_tree[i]\n            }\n            else if (node_type === \"array\") {\n                match = parse_tree[i] // convenience purposes only\n                if (match[2]) { // keyword argument\n                    arg = argv[cursor]\n                    for (k = 0; k < match[2].length; k++) {\n                        if (!arg.hasOwnProperty(match[2][k])) {\n                            throw new Error(sprintf(\"[sprintf] property '%s' does not exist\", match[2][k]))\n                        }\n                        arg = arg[match[2][k]]\n                    }\n                }\n                else if (match[1]) { // positional argument (explicit)\n                    arg = argv[match[1]]\n                }\n                else { // positional argument (implicit)\n                    arg = argv[cursor++]\n                }\n\n                if (get_type(arg) == \"function\") {\n                    arg = arg()\n                }\n\n                if (re.not_string.test(match[8]) && (get_type(arg) != \"number\" && isNaN(arg))) {\n                    throw new TypeError(sprintf(\"[sprintf] expecting number but found %s\", get_type(arg)))\n                }\n\n                if (re.number.test(match[8])) {\n                    is_positive = arg >= 0\n                }\n\n                switch (match[8]) {\n                    case \"b\":\n                        arg = arg.toString(2)\n                    break\n                    case \"c\":\n                        arg = String.fromCharCode(arg)\n                    break\n                    case \"d\":\n                    case \"i\":\n                        arg = parseInt(arg, 10)\n                    break\n                    case \"e\":\n                        arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()\n                    break\n                    case \"f\":\n                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)\n                    break\n                    case \"o\":\n                        arg = arg.toString(8)\n                    break\n                    case \"s\":\n                        arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)\n                    break\n                    case \"u\":\n                        arg = arg >>> 0\n                    break\n                    case \"x\":\n                        arg = arg.toString(16)\n                    break\n                    case \"X\":\n                        arg = arg.toString(16).toUpperCase()\n                    break\n                }\n                if (re.number.test(match[8]) && (!is_positive || match[3])) {\n                    sign = is_positive ? \"+\" : \"-\"\n                    arg = arg.toString().replace(re.sign, \"\")\n                }\n                else {\n                    sign = \"\"\n                }\n                pad_character = match[4] ? match[4] === \"0\" ? \"0\" : match[4].charAt(1) : \" \"\n                pad_length = match[6] - (sign + arg).length\n                pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : \"\") : \"\"\n                output[output.length] = match[5] ? sign + arg + pad : (pad_character === \"0\" ? sign + pad + arg : pad + sign + arg)\n            }\n        }\n        return output.join(\"\")\n    }\n\n    sprintf.cache = {}\n\n    sprintf.parse = function(fmt) {\n        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0\n        while (_fmt) {\n            if ((match = re.text.exec(_fmt)) !== null) {\n                parse_tree[parse_tree.length] = match[0]\n            }\n            else if ((match = re.modulo.exec(_fmt)) !== null) {\n                parse_tree[parse_tree.length] = \"%\"\n            }\n            else if ((match = re.placeholder.exec(_fmt)) !== null) {\n                if (match[2]) {\n                    arg_names |= 1\n                    var field_list = [], replacement_field = match[2], field_match = []\n                    if ((field_match = re.key.exec(replacement_field)) !== null) {\n                        field_list[field_list.length] = field_match[1]\n                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== \"\") {\n                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {\n                                field_list[field_list.length] = field_match[1]\n                            }\n                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {\n                                field_list[field_list.length] = field_match[1]\n                            }\n                            else {\n                                throw new SyntaxError(\"[sprintf] failed to parse named argument key\")\n                            }\n                        }\n                    }\n                    else {\n                        throw new SyntaxError(\"[sprintf] failed to parse named argument key\")\n                    }\n                    match[2] = field_list\n                }\n                else {\n                    arg_names |= 2\n                }\n                if (arg_names === 3) {\n                    throw new Error(\"[sprintf] mixing positional and named placeholders is not (yet) supported\")\n                }\n                parse_tree[parse_tree.length] = match\n            }\n            else {\n                throw new SyntaxError(\"[sprintf] unexpected placeholder\")\n            }\n            _fmt = _fmt.substring(match[0].length)\n        }\n        return parse_tree\n    }\n\n    var vsprintf = function(fmt, argv, _argv) {\n        _argv = (argv || []).slice(0)\n        _argv.splice(0, 0, fmt)\n        return sprintf.apply(null, _argv)\n    }\n\n    /**\n     * helpers\n     */\n    function get_type(variable) {\n        return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()\n    }\n\n    function str_repeat(input, multiplier) {\n        return Array(multiplier + 1).join(input)\n    }\n\n    /**\n     * export to either browser or node.js\n     */\n    if (typeof exports !== \"undefined\") {\n        exports.sprintf = sprintf\n        exports.vsprintf = vsprintf\n    }\n    else {\n        window.sprintf = sprintf\n        window.vsprintf = vsprintf\n\n        if (typeof define === \"function\" && define.amd) {\n            define(function() {\n                return {\n                    sprintf: sprintf,\n                    vsprintf: vsprintf\n                }\n            })\n        }\n    }\n})(typeof window === \"undefined\" ? this : window);\n"
  },
  {
    "path": "third_party/ui/bower_components/sprintf/test/test.js",
    "content": "var assert = require(\"assert\"),\n    sprintfjs = require(\"../src/sprintf.js\"),\n    sprintf = sprintfjs.sprintf,\n    vsprintf = sprintfjs.vsprintf\n\ndescribe(\"sprintfjs\", function() {\n    it(\"should return formated strings for simple placeholders\", function() {\n        assert.equal(\"%\", sprintf(\"%%\"))\n        assert.equal(\"10\", sprintf(\"%b\", 2))\n        assert.equal(\"A\", sprintf(\"%c\", 65))\n        assert.equal(\"2\", sprintf(\"%d\", 2))\n        assert.equal(\"2\", sprintf(\"%i\", 2))\n        assert.equal(\"2\", sprintf(\"%d\", \"2\"))\n        assert.equal(\"2\", sprintf(\"%i\", \"2\"))\n        assert.equal(\"2e+0\", sprintf(\"%e\", 2))\n        assert.equal(\"2\", sprintf(\"%u\", 2))\n        assert.equal(\"4294967294\", sprintf(\"%u\", -2))\n        assert.equal(\"2.2\", sprintf(\"%f\", 2.2))\n        assert.equal(\"10\", sprintf(\"%o\", 8))\n        assert.equal(\"%s\", sprintf(\"%s\", \"%s\"))\n        assert.equal(\"ff\", sprintf(\"%x\", 255))\n        assert.equal(\"FF\", sprintf(\"%X\", 255))\n        assert.equal(\"Polly wants a cracker\", sprintf(\"%2$s %3$s a %1$s\", \"cracker\", \"Polly\", \"wants\"))\n        assert.equal(\"Hello world!\", sprintf(\"Hello %(who)s!\", {\"who\": \"world\"}))\n    })\n\n    it(\"should return formated strings for complex placeholders\", function() {\n        // sign\n        assert.equal(\"2\", sprintf(\"%d\", 2))\n        assert.equal(\"-2\", sprintf(\"%d\", -2))\n        assert.equal(\"+2\", sprintf(\"%+d\", 2))\n        assert.equal(\"-2\", sprintf(\"%+d\", -2))\n        assert.equal(\"2\", sprintf(\"%i\", 2))\n        assert.equal(\"-2\", sprintf(\"%i\", -2))\n        assert.equal(\"+2\", sprintf(\"%+i\", 2))\n        assert.equal(\"-2\", sprintf(\"%+i\", -2))\n        assert.equal(\"2.2\", sprintf(\"%f\", 2.2))\n        assert.equal(\"-2.2\", sprintf(\"%f\", -2.2))\n        assert.equal(\"+2.2\", sprintf(\"%+f\", 2.2))\n        assert.equal(\"-2.2\", sprintf(\"%+f\", -2.2))\n        assert.equal(\"-2.3\", sprintf(\"%+.1f\", -2.34))\n        assert.equal(\"-0.0\", sprintf(\"%+.1f\", -0.01))\n        assert.equal(\"-000000123\", sprintf(\"%+010d\", -123))\n        assert.equal(\"______-123\", sprintf(\"%+'_10d\", -123))\n        assert.equal(\"-234.34 123.2\", sprintf(\"%f %f\", -234.34, 123.2))\n\n        // padding\n        assert.equal(\"-0002\", sprintf(\"%05d\", -2))\n        assert.equal(\"-0002\", sprintf(\"%05i\", -2))\n        assert.equal(\"    <\", sprintf(\"%5s\", \"<\"))\n        assert.equal(\"0000<\", sprintf(\"%05s\", \"<\"))\n        assert.equal(\"____<\", sprintf(\"%'_5s\", \"<\"))\n        assert.equal(\">    \", sprintf(\"%-5s\", \">\"))\n        assert.equal(\">0000\", sprintf(\"%0-5s\", \">\"))\n        assert.equal(\">____\", sprintf(\"%'_-5s\", \">\"))\n        assert.equal(\"xxxxxx\", sprintf(\"%5s\", \"xxxxxx\"))\n        assert.equal(\"1234\", sprintf(\"%02u\", 1234))\n        assert.equal(\" -10.235\", sprintf(\"%8.3f\", -10.23456))\n        assert.equal(\"-12.34 xxx\", sprintf(\"%f %s\", -12.34, \"xxx\"))\n\n        // precision\n        assert.equal(\"2.3\", sprintf(\"%.1f\", 2.345))\n        assert.equal(\"xxxxx\", sprintf(\"%5.5s\", \"xxxxxx\"))\n        assert.equal(\"    x\", sprintf(\"%5.1s\", \"xxxxxx\"))\n\n    })\n\n    it(\"should return formated strings for callbacks\", function() {\n        assert.equal(\"foobar\", sprintf(\"%s\", function() { return \"foobar\" }))\n        assert.equal(Date.now(), sprintf(\"%s\", Date.now)) // should pass...\n    })\n})\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/.bower.json",
    "content": "{\n  \"name\": \"string-format-js\",\n  \"main\": \"format.js\",\n  \"version\": \"0.1.2\",\n  \"homepage\": \"https://github.com/tmaeda1981jp/string-format-js\",\n  \"authors\": [\n    \"tmaeda1981jp <tmaeda1981jp@gmail.com>\"\n  ],\n  \"description\": \"String format function for javascript\",\n  \"keywords\": [\n    \"string\",\n    \"format\"\n  ],\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"libs\",\n    \"test\",\n    \"tests\"\n  ],\n  \"_release\": \"0.1.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v0.1.2\",\n    \"commit\": \"52882d494f39ec556dd73b75f4e45e4f78f1f7bb\"\n  },\n  \"_source\": \"git://github.com/tmaeda1981jp/string-format-js.git\",\n  \"_target\": \"~0.1.2\",\n  \"_originalSource\": \"string-format-js\"\n}"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/Gruntfile.js",
    "content": "/*jslint white: true, nomen: true, maxlen: 120, plusplus: true, */\n/*global _:false, $:false, define:false, require:false, */\n\nmodule.exports = function(grunt) {\n\n  'use strict';\n\n  // Add the grunt-mocha-test tasks.\n  grunt.loadNpmTasks('grunt-mocha-test');\n  grunt.loadNpmTasks('grunt-mocha-phantomjs');\n  grunt.loadNpmTasks('grunt-contrib-uglify');\n  grunt.loadNpmTasks('grunt-contrib-watch');\n\n  grunt.initConfig({\n    pkg: grunt.file.readJSON('package.json'),\n    uglify: {\n      my_target: {\n        options: {\n          mangle: true,\n          compress: true,\n          banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +\n            '<%= grunt.template.today(\"yyyy-mm-dd\") %> */'\n        },\n        files: {\n          'format.min.js': ['format.js']\n        }\n      }\n    },\n\n    mochaTest: {\n      test: {\n        options: {\n//          grep: '%b',\n          reporter: 'spec'\n        },\n        src: ['test/format.spec.js']\n      }\n    },\n\n    mocha_phantomjs: {\n      options: {\n        reporter: 'spec'\n      },\n      all: ['test/**/*.html']\n    },\n\n    watch: {\n      mochaTest: {\n        files: ['format.js', 'test/format.spec.js'],\n        tasks: ['mochaTest']\n      },\n      browserTest: {\n        files: ['format.js', 'test/format.spec.js'],\n        tasks: ['mocha_phantomjs']\n      }\n    }\n  });\n\n  grunt.registerTask('default', 'mochaTest');\n  grunt.registerTask('browserTest', 'mocha_phantomjs');\n\n};\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/LICENSE.txt",
    "content": "Copyright (c) 2014 tmaeda1981jp\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/README.md",
    "content": "# string-format-js\n\n[![Build Status](https://travis-ci.org/tmaeda1981jp/string-format-js.png?branch=master)](https://travis-ci.org/tmaeda1981jp/string-format-js)\n\n\n## Synopsis\n\nString format function for javascript.\n\n## Code Example\n\n### %d\n\n```javascript\n'%d'.format(10) === '10'\n'%d, %d'.format(5, 10) === '5, 10'\n'%d, %d and %d'.format(5, 10, 15) === '5, 10 and 15'\n'%05d'.format(123) === '00123'\n'%03d, %05d'.format(1, 123) === '001, 00123'\n'[%5d]'.format(123) === '[ 123]'\n'[%10d]'.format(123) === '[      123]'\n'[%-5d]'.format(123) === '[123 ]'\n'[%-10d]'.format(123) === '[123      ]'\n```\n\n### %s\n\n```javascript\n'This is a %s'.format('pen') === 'This is a pen'\n'This %s %s %s'.format('is', 'a', 'pen') === 'This is a pen'\n'[%5s]'.format('abc') === '[ abc]'\n'[%-5s]'.format('abc') === '[abc ]'\n'[%.4s]'.format('abcde') === '[abcd]'\n'[%5.4s]'.format('abcde') === '[ abcd]'\n'[%-5.4s]'.format('abcde') === '[abcd ]'\n'[%-5.4s]'.format('あいうえお') === '[あいうえ ]'\n```\n\n### %o\n\n```javascript\n'123 => %o'.format(123) === '123 => 173'\n'0x7b => %o'.format(0x7b) === '0x7b => 173'\n```\n\n### %b\n\n```javascript\n'123 => %b'.format(123) === '123 => 1111011'\n'0x7b => %b'.format(0x7b) === '0x7b => 1111011'\n```\n\n### %x\n\n```javascript\n'123 => %x'.format(123) === '123 => 7b'\n```\n\n### %X\n\n```javascript\n'123 => %X'.format(123) === '123 => 7B'\n```\n\n### %u\n\n```javascript\n'%u'.format(0x12345678 ^ 0xFFFFFFFF) === '3989547399'\n'%u'.format(-1) === '4294967295'\n```\n\n### %c\n\n```javascript\n'%c'.format(97) === 'a'\n'%c'.format(0x61) === 'a'\n```\n\n### %f\n\n```javascript\n'%f'.format(1.0) === '1.000000'\n'%.2f'.format(1.0) === '1.00'\n'[%10f]'.format(1.0) === '[1.00000000]'\n'[%10.2f]'.format(1.0) === '[      1.00]'\n'[%10.2f]'.format(1.2345) === '[      1.23]'\n'[%-10.2f]'.format(1.0) === '[1.00      ]'\n```\n### %e\n\n```javascript\n'%e'.format(123) === '1.23e+2'\n'%e'.format(123.45) === '1.2345e+2'\n'%.5e'.format(123.45) === '1.23450e+2'\n'[%15e]'.format(123.45) === '[1.2345000000e+2]'\n'[%20e]'.format(12345678901.45) === '[1.23456789014500e+10]'\n'[%15.2e]'.format(123.45) === '[        1.23e+2]'\n'[%7.2e]'.format(123.45) === '[1.23e+2]'\n'[%-15.2e]'.format(123.45) === '[1.23e+2        ]'\n```\n### hash\n\n```javascript\n'#{name}'.format({name:'Takashi Maeda'}) === 'Takashi Maeda'\n'#{first} #{last}'.format({first:'Takashi', last:'Maeda'}) === 'Takashi Maeda'\n'#{a} #{b}, #{c} #{d}'.format(a:'Easy', b:'come', c:'easy', d:'go'}) === 'Easy come, easy go'\n```\n\n## Installation\n\n### node\n\n```bash\n$ npm install string-format-js\n```\n\n### bower\n\n```bash\n$ bower install string-format-js\n```\n\n## Tests\n\n### node\n\n```bash\n$ grunt mochaTest\n```\n\n### browser\n\n```bash\n$ grunt browserTest\n```\n\n## License\n\nThis software is released under the MIT License, see LICENSE.txt.\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/bower.json",
    "content": "{\n  \"name\": \"string-format-js\",\n  \"main\": \"format.js\",\n  \"version\": \"0.1.2\",\n  \"homepage\": \"https://github.com/tmaeda1981jp/string-format-js\",\n  \"authors\": [\n    \"tmaeda1981jp <tmaeda1981jp@gmail.com>\"\n  ],\n  \"description\": \"String format function for javascript\",\n  \"keywords\": [\n    \"string\",\n    \"format\"\n  ],\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"libs\",\n    \"test\",\n    \"tests\"\n  ]\n}\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/format.js",
    "content": "/*jslint white: true, nomen: true, maxlen: 120, plusplus: true, */\n/*global _:false, $:false, define:false, require:false, */\n\n(function(global, undefined) {\n\n  'use strict';\n\n  var string = global.String;\n\n  if (!string.prototype.format) {\n\n    string.prototype.format = function() {\n\n      var i,\n          result = this,\n\n          isNumber = function(n) {\n            return !isNaN(parseFloat(n)) && isFinite(n);\n          },\n\n          Formatter = (function() {\n            var Constr = function(identifier) {\n              var array = function(len){ return new Array(len); };\n\n              switch(true) {\n              case /^#\\{(\\w+)\\}*$/.test(identifier):\n                this.formatter = function(line, param) {\n                  return line.replace('#{' + RegExp.$1 + '}', param[RegExp.$1]);\n                };\n                break;\n              case /^([ds])$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (RegExp.$1 === 'd' && !isNumber(param)) {\n                    throw new TypeError();\n                  }\n                  return line.replace(\"%\" + identifier, param);\n                };\n                break;\n\n              // Octet\n              case /^(o)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  return line.replace(\n                    \"%\" + identifier,\n                    parseInt(param).toString(8));\n                };\n                break;\n\n              // Binary\n              case /^(b)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  return line.replace(\n                    \"%\" + identifier,\n                    parseInt(param).toString(2));\n                };\n                break;\n\n              // Hex\n              case /^([xX])$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  var hex = parseInt(param).toString(16);\n                  if (identifier === 'X') { hex = hex.toUpperCase(); }\n                  return line.replace(\"%\" + identifier, hex);\n                };\n                break;\n\n              case /^(c)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  return line.replace(\"%\" + identifier, String.fromCharCode(param));\n                };\n                break;\n\n              case /^(u)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  return line.replace(\"%\" + identifier, parseInt(param, 10) >>> 0);\n                };\n                break;\n\n              case /^(-?)(\\d*).?(\\d?)(e)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  var lpad = RegExp.$1 === '-',\n                      width = RegExp.$2,\n                      decimal = RegExp.$3 !== '' ? RegExp.$3: undefined,\n                      val = param.toExponential(decimal),\n                      mantissa, exponent, padLength\n                  ;\n\n                  if (width !== '') {\n                    if (decimal !== undefined) {\n                      padLength = width - val.length;\n                      if (padLength >= 0){\n                        val = lpad ?\n                          val + array(padLength + 1).join(\" \"):\n                          array(padLength + 1).join(\" \") + val;\n                      }\n                      else {\n                        // TODO throw ?\n                      }\n                    }\n                    else {\n                      mantissa = val.split('e')[0];\n                      exponent = 'e' + val.split('e')[1];\n                      padLength = width - (mantissa.length + exponent.length);\n                      val = padLength >= 0 ?\n                        mantissa + (array(padLength + 1)).join(\"0\") + exponent :\n                        mantissa.slice(0, padLength) + exponent;\n                    }\n                  }\n                  return line.replace(\"%\" + identifier, val);\n                };\n                break;\n\n              case /^(-?)(\\d*).?(\\d?)(f)$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n                  var lpad = RegExp.$1 === '-',\n                      width   = RegExp.$2,\n                      decimal = RegExp.$3,\n                      DOT_LENGTH = '.'.length,\n                      integralPart = param > 0 ? Math.floor(param) : Math.ceil(param),\n                      val = parseFloat(param).toFixed(decimal !== '' ? decimal : 6),\n                      numberPartWidth, spaceWidth;\n\n                  if (width !== '') {\n                    if (decimal !== '') {\n                      numberPartWidth =\n                        integralPart.toString().length + DOT_LENGTH + parseInt(decimal, 10);\n                      spaceWidth = width - numberPartWidth;\n                      val = lpad ?\n                        parseFloat(param).toFixed(decimal) + (array(spaceWidth + 1).join(\" \")) :\n                        (array(spaceWidth + 1).join(\" \")) + parseFloat(param).toFixed(decimal);\n                    }\n                    else {\n                      val = parseFloat(param).toFixed(\n                        width - (integralPart.toString().length + DOT_LENGTH));\n                    }\n                  }\n                  return line.replace(\"%\" + identifier, val);\n                };\n                break;\n\n              // Decimal\n              case /^([0\\-]?)(\\d+)d$/.test(identifier):\n                this.formatter = function(line, param) {\n                  if (!isNumber(param)) { throw new TypeError(); }\n\n                  var len = RegExp.$2 - param.toString().length,\n                      replaceString = '',\n                      result;\n                  if (len < 0) { len = 0; }\n                  switch(RegExp.$1) {\n                  case \"\": // rpad\n                    replaceString = (array(len + 1).join(\" \") + param).slice(-RegExp.$2);\n                    break;\n                  case \"-\": // lpad\n                    replaceString = (param + array(len + 1).join(\" \")).slice(-RegExp.$2);\n                    break;\n                  case \"0\": // 0pad\n                    replaceString = (array(len + 1).join(\"0\") + param).slice(-RegExp.$2);\n                    break;\n                  }\n                  return line.replace(\"%\" + identifier, replaceString);\n                };\n                break;\n\n              // String\n              case /^(-?)(\\d)s$/.test(identifier):\n                this.formatter = function(line, param) {\n                  var len = RegExp.$2 - param.toString().length,\n                      replaceString = '',\n                      result;\n                  if (len < 0) { len = 0; }\n                  switch(RegExp.$1) {\n                  case \"\": // rpad\n                    replaceString = (array(len + 1).join(\" \") + param).slice(-RegExp.$2);\n                    break;\n                  case \"-\": // lpad\n                    replaceString = (param + array(len + 1).join(\" \")).slice(-RegExp.$2);\n                    break;\n                  default:\n                    // TODO throw ?\n                  }\n                  return line.replace(\"%\" + identifier, replaceString);\n                };\n                break;\n\n              // String with max length\n              case /^(-?\\d?)\\.(\\d)s$/.test(identifier):\n                this.formatter = function(line, param) {\n                  var replaceString = '',\n                      max, spacelen;\n\n                  // %.4s\n                  if (RegExp.$1 === '') {\n                    replaceString = param.slice(0, RegExp.$2);\n                  }\n                  // %5.4s %-5.4s\n                  else {\n                    param = param.slice(0, RegExp.$2);\n                    max = Math.abs(RegExp.$1);\n                    spacelen = max - param.toString().length;\n                    replaceString = RegExp.$1.indexOf('-') !== -1 ?\n                      (param + array(spacelen + 1).join(\" \")).slice(-max): // lpad\n                      (array(spacelen + 1).join(\" \") + param).slice(-max); // rpad\n                  }\n                  return line.replace(\"%\" + identifier, replaceString);\n                };\n                break;\n              default:\n                this.formatter = function(line, param) {\n                  return line;\n                };\n              }\n            };\n\n            Constr.prototype = {\n              format: function(line, param) {\n                return this.formatter.call(this, line, param);\n              }\n            };\n            return Constr;\n          }()),\n\n          args = Array.prototype.slice.call(arguments)\n      ;\n\n      if (args.length === 1 && typeof args[0] === 'object') {\n        for (i=0; i < Object.keys(args[0]).length; i+=1) {\n          if (result.match(/(#\\{\\w+\\})/)) {\n            result = new Formatter(RegExp.$1).format(result, args[0]);\n          }\n        }\n      }\n      else {\n        for (i=0; i <args.length; i+=1) {\n          if (result.match(/%([.#0-9\\-]*[bcdefosuxX])/)) {\n            result = new Formatter(RegExp.$1).format(result, args[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }\n}('undefined' !== typeof global ? global : window));\n"
  },
  {
    "path": "third_party/ui/bower_components/string-format-js/package.json",
    "content": "{\n  \"name\": \"string-format-js\",\n  \"version\": \"0.1.2\",\n  \"description\": \"String format function for javascript\",\n  \"main\": \"format.js\",\n  \"keywords\": [\n    \"string\",\n    \"format\"\n  ],\n  \"scripts\": {\n    \"test\": \"grunt mochaTest\",\n    \"browserTest\": \"grunt browserTest\"\n  },\n  \"author\": \"tmaeda1981jp\",\n  \"homepage\": \"https://github.com/tmaeda1981jp/string-format-js\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"mocha\": \"~1.21.4\",\n    \"grunt\": \"~0.4.5\",\n    \"grunt-mocha-test\": \"~0.11.0\",\n    \"grunt-contrib-watch\": \"~0.6.1\",\n    \"expect.js\": \"~0.3.1\",\n    \"mocha-phantomjs\": \"~3.5.0\",\n    \"grunt-exec\": \"~0.4.6\",\n    \"grunt-contrib-uglify\": \"~0.5.1\",\n    \"grunt-mocha-phantomjs\": \"~0.6.0\"\n  }\n}\n"
  }
]