fluentd-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fluentd-ui might be problematic. Click here for more details.

Files changed (320) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +31 -0
  4. data/.rspec +1 -0
  5. data/ChangeLog +3 -0
  6. data/Gemfile +21 -0
  7. data/Gemfile.lock +247 -0
  8. data/Gemfile.production +3 -0
  9. data/README.md +53 -0
  10. data/Rakefile +8 -0
  11. data/app/assets/images/.keep +0 -0
  12. data/app/assets/javascripts/alert.js +51 -0
  13. data/app/assets/javascripts/application.js +22 -0
  14. data/app/assets/javascripts/nested_setting.js +41 -0
  15. data/app/assets/javascripts/setting_format.js +15 -0
  16. data/app/assets/javascripts/tutorial.js +58 -0
  17. data/app/assets/javascripts/vue/fluent_log.js +64 -0
  18. data/app/assets/javascripts/vue/in_tail_format.js +153 -0
  19. data/app/assets/javascripts/vue/treeview.js +97 -0
  20. data/app/assets/javascripts/vue_common.js +4 -0
  21. data/app/assets/stylesheets/application.css +18 -0
  22. data/app/assets/stylesheets/common.css.scss +152 -0
  23. data/app/controllers/api_controller.rb +37 -0
  24. data/app/controllers/application_controller.rb +110 -0
  25. data/app/controllers/concerns/.keep +0 -0
  26. data/app/controllers/fluentd/agents_controller.rb +35 -0
  27. data/app/controllers/fluentd/settings/in_syslog_controller.rb +34 -0
  28. data/app/controllers/fluentd/settings/in_tail_controller.rb +57 -0
  29. data/app/controllers/fluentd/settings/out_forward_controller.rb +42 -0
  30. data/app/controllers/fluentd/settings/out_mongo_controller.rb +36 -0
  31. data/app/controllers/fluentd/settings/out_s3_controller.rb +36 -0
  32. data/app/controllers/fluentd/settings/out_td_controller.rb +36 -0
  33. data/app/controllers/fluentd/settings_controller.rb +18 -0
  34. data/app/controllers/fluentd_controller.rb +62 -0
  35. data/app/controllers/misc_controller.rb +69 -0
  36. data/app/controllers/plugins_controller.rb +44 -0
  37. data/app/controllers/polling_controller.rb +20 -0
  38. data/app/controllers/sessions_controller.rb +45 -0
  39. data/app/controllers/tutorials_controller.rb +40 -0
  40. data/app/controllers/users_controller.rb +28 -0
  41. data/app/controllers/welcome_controller.rb +5 -0
  42. data/app/helpers/application_helper.rb +55 -0
  43. data/app/helpers/fluentd/settings_helper.rb +2 -0
  44. data/app/helpers/miscs_helper.rb +2 -0
  45. data/app/helpers/settings_helper.rb +43 -0
  46. data/app/mailers/.keep +0 -0
  47. data/app/models/.keep +0 -0
  48. data/app/models/concerns/.keep +0 -0
  49. data/app/models/fluentd.rb +178 -0
  50. data/app/models/fluentd/agent.rb +28 -0
  51. data/app/models/fluentd/agent/common.rb +76 -0
  52. data/app/models/fluentd/agent/configuration.rb +35 -0
  53. data/app/models/fluentd/agent/fluentd_gem.rb +104 -0
  54. data/app/models/fluentd/agent/local_common.rb +101 -0
  55. data/app/models/fluentd/agent/remote.rb +7 -0
  56. data/app/models/fluentd/agent/td_agent.rb +44 -0
  57. data/app/models/fluentd/api.rb +6 -0
  58. data/app/models/fluentd/api/http.rb +26 -0
  59. data/app/models/fluentd/setting.rb +4 -0
  60. data/app/models/fluentd/setting/common.rb +185 -0
  61. data/app/models/fluentd/setting/in_syslog.rb +16 -0
  62. data/app/models/fluentd/setting/in_tail.rb +107 -0
  63. data/app/models/fluentd/setting/out_forward.rb +70 -0
  64. data/app/models/fluentd/setting/out_mongo.rb +35 -0
  65. data/app/models/fluentd/setting/out_s3.rb +29 -0
  66. data/app/models/fluentd/setting/out_td.rb +26 -0
  67. data/app/models/plugin.rb +193 -0
  68. data/app/models/settings.rb +4 -0
  69. data/app/models/user.rb +52 -0
  70. data/app/views/fluentd/_form.html.haml +31 -0
  71. data/app/views/fluentd/edit.html.haml +3 -0
  72. data/app/views/fluentd/errors.html.haml +19 -0
  73. data/app/views/fluentd/log.html.haml +9 -0
  74. data/app/views/fluentd/new.html.haml +3 -0
  75. data/app/views/fluentd/settings/_form.html.haml +43 -0
  76. data/app/views/fluentd/settings/edit.html.haml +7 -0
  77. data/app/views/fluentd/settings/in_syslog/_form.html.haml +9 -0
  78. data/app/views/fluentd/settings/in_syslog/show.html.haml +6 -0
  79. data/app/views/fluentd/settings/in_tail/_form.html.haml +42 -0
  80. data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +19 -0
  81. data/app/views/fluentd/settings/in_tail/after_format.html.haml +10 -0
  82. data/app/views/fluentd/settings/in_tail/confirm.html.haml +13 -0
  83. data/app/views/fluentd/settings/in_tail/show.html.haml +5 -0
  84. data/app/views/fluentd/settings/out_forward/_form.html.haml +22 -0
  85. data/app/views/fluentd/settings/out_forward/show.html.haml +6 -0
  86. data/app/views/fluentd/settings/out_mongo/_form.html.haml +30 -0
  87. data/app/views/fluentd/settings/out_mongo/finish.html.haml +4 -0
  88. data/app/views/fluentd/settings/out_mongo/show.html.haml +6 -0
  89. data/app/views/fluentd/settings/out_s3/_form.html.haml +39 -0
  90. data/app/views/fluentd/settings/out_s3/show.html.haml +6 -0
  91. data/app/views/fluentd/settings/out_td/_form.html.haml +18 -0
  92. data/app/views/fluentd/settings/out_td/show.html.haml +6 -0
  93. data/app/views/fluentd/settings/show.html.haml +10 -0
  94. data/app/views/fluentd/settings/source_and_output.html.haml +45 -0
  95. data/app/views/fluentd/show.html.haml +60 -0
  96. data/app/views/layouts/application.html.erb +102 -0
  97. data/app/views/layouts/sign_in.html.erb +28 -0
  98. data/app/views/misc/information.html.haml +75 -0
  99. data/app/views/misc/update_fluentd_ui.html.haml +45 -0
  100. data/app/views/plugins/installed.html.haml +67 -0
  101. data/app/views/plugins/recommended.html.haml +59 -0
  102. data/app/views/plugins/updated.html.haml +29 -0
  103. data/app/views/sessions/new.html.haml +13 -0
  104. data/app/views/shared/_error.html.haml +3 -0
  105. data/app/views/shared/_flash.html.haml +10 -0
  106. data/app/views/shared/_fluentd_nav.html.haml +12 -0
  107. data/app/views/shared/_global_nav.html.erb +80 -0
  108. data/app/views/shared/_initial_setup.html.haml +13 -0
  109. data/app/views/shared/_modal.html.erb +25 -0
  110. data/app/views/shared/_setting_errors.html.haml +5 -0
  111. data/app/views/shared/vue/_fluent_log.html.erb +25 -0
  112. data/app/views/shared/vue/_in_tail_format.html.erb +53 -0
  113. data/app/views/shared/vue/_treeview.html.erb +30 -0
  114. data/app/views/tutorials/chapter1.html.erb +31 -0
  115. data/app/views/tutorials/chapter2.html.haml +12 -0
  116. data/app/views/tutorials/chapter3.html.haml +12 -0
  117. data/app/views/tutorials/chapter4.html.haml +12 -0
  118. data/app/views/tutorials/chapter5.html.haml +10 -0
  119. data/app/views/tutorials/index.html.haml +26 -0
  120. data/app/views/users/show.html.haml +22 -0
  121. data/app/workers/all_plugin_check_update.rb +14 -0
  122. data/app/workers/fluentd_ui_restart.rb +41 -0
  123. data/app/workers/fluentd_ui_update_check.rb +15 -0
  124. data/app/workers/gem_installer.rb +17 -0
  125. data/app/workers/gem_uninstaller.rb +15 -0
  126. data/app/workers/gem_update_check.rb +10 -0
  127. data/bin/bundle +3 -0
  128. data/bin/fluentd-ui +13 -0
  129. data/bin/fluentd-ui-restart +12 -0
  130. data/bin/rails +8 -0
  131. data/bin/rake +8 -0
  132. data/bin/spring +18 -0
  133. data/bower.json +10 -0
  134. data/circle.yml +8 -0
  135. data/config.ru +4 -0
  136. data/config/application.rb +48 -0
  137. data/config/application.yml +211 -0
  138. data/config/boot.rb +4 -0
  139. data/config/environment.rb +5 -0
  140. data/config/environments/development.rb +36 -0
  141. data/config/environments/production.rb +69 -0
  142. data/config/environments/test.rb +40 -0
  143. data/config/initializers/backtrace_silencers.rb +7 -0
  144. data/config/initializers/cookies_serializer.rb +3 -0
  145. data/config/initializers/filter_parameter_logging.rb +4 -0
  146. data/config/initializers/inflections.rb +16 -0
  147. data/config/initializers/mime_types.rb +4 -0
  148. data/config/initializers/prefetch_gem_updates.rb +1 -0
  149. data/config/initializers/session_store.rb +3 -0
  150. data/config/initializers/wrap_parameters.rb +14 -0
  151. data/config/locales/en.yml +204 -0
  152. data/config/locales/ja.yml +194 -0
  153. data/config/locales/translation_en.yml +255 -0
  154. data/config/locales/translation_ja.yml +255 -0
  155. data/config/locales/tutorial_en.yml +117 -0
  156. data/config/locales/tutorial_ja.yml +120 -0
  157. data/config/routes.rb +93 -0
  158. data/config/secrets.yml +22 -0
  159. data/db/schema.rb +0 -0
  160. data/db/seeds.rb +11 -0
  161. data/fluentd-ui-ss01.png +0 -0
  162. data/fluentd-ui-ss02.png +0 -0
  163. data/fluentd-ui-ss03.png +0 -0
  164. data/fluentd-ui-ss04.png +0 -0
  165. data/fluentd-ui-ss05.png +0 -0
  166. data/fluentd-ui.gemspec +46 -0
  167. data/lib/assets/.keep +0 -0
  168. data/lib/file_reverse_reader.rb +56 -0
  169. data/lib/fluentd-ui.rb +22 -0
  170. data/lib/fluentd-ui/command.rb +52 -0
  171. data/lib/fluentd-ui/version.rb +3 -0
  172. data/lib/grok_converter.rb +39 -0
  173. data/lib/regexp_preview.rb +48 -0
  174. data/lib/tasks/.keep +0 -0
  175. data/lib/treeview.rb +45 -0
  176. data/log/.keep +0 -0
  177. data/public/404.html +67 -0
  178. data/public/422.html +67 -0
  179. data/public/500.html +66 -0
  180. data/public/favicon.ico +0 -0
  181. data/public/fluentd-logo-right-text.png +0 -0
  182. data/public/fluentd-logo.png +0 -0
  183. data/public/fluentd.png +0 -0
  184. data/public/robots.txt +5 -0
  185. data/spec/controllers/plugins_controller_spec.rb +5 -0
  186. data/spec/controllers/polling_controller_spec.rb +5 -0
  187. data/spec/controllers/sessions_controller_spec.rb +5 -0
  188. data/spec/controllers/tutorials_controller_spec.rb +5 -0
  189. data/spec/factories/fluentd.rb +11 -0
  190. data/spec/factories/plugins.rb +8 -0
  191. data/spec/factories/user.rb +6 -0
  192. data/spec/features/fluentd/setting/out_forward_spec.rb +45 -0
  193. data/spec/features/fluentd/setting/out_td_spec.rb +35 -0
  194. data/spec/features/sessions_spec.rb +55 -0
  195. data/spec/features/shared_examples/login_required.rb +4 -0
  196. data/spec/features/users_spec.rb +9 -0
  197. data/spec/grok_converter_spec.rb +50 -0
  198. data/spec/lib/file_reverse_reader_spec.rb +73 -0
  199. data/spec/lib/fluentd-ui_spec.rb +35 -0
  200. data/spec/models/fluentd/agent_spec.rb +91 -0
  201. data/spec/models/fluentd/setting/common_spec.rb +178 -0
  202. data/spec/models/fluentd/setting/in_syslog_spec.rb +35 -0
  203. data/spec/models/fluentd/setting/out_mongo_spec.rb +40 -0
  204. data/spec/models/fluentd/setting/out_td_spec.rb +38 -0
  205. data/spec/models/fluentd_spec.rb +166 -0
  206. data/spec/models/plugin_spec.rb +191 -0
  207. data/spec/models/user_spec.rb +15 -0
  208. data/spec/spec_helper.rb +58 -0
  209. data/spec/support/fixtures/error0.log +12 -0
  210. data/spec/support/fixtures/error2.log +130 -0
  211. data/spec/support/fluentd_agent_common_behavior.rb +114 -0
  212. data/spec/support/fluentd_agent_restart_strategy.rb +94 -0
  213. data/tmp/.gitkeep +0 -0
  214. data/vendor/assets/javascripts/.keep +0 -0
  215. data/vendor/assets/javascripts/bower/es6-promise/.bower.json +15 -0
  216. data/vendor/assets/javascripts/bower/es6-promise/bower.json +5 -0
  217. data/vendor/assets/javascripts/bower/es6-promise/promise.js +684 -0
  218. data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +1 -0
  219. data/vendor/assets/javascripts/bower/lodash/.bower.json +33 -0
  220. data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +22 -0
  221. data/vendor/assets/javascripts/bower/lodash/bower.json +23 -0
  222. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +7157 -0
  223. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +61 -0
  224. data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +6785 -0
  225. data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +56 -0
  226. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +4979 -0
  227. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +39 -0
  228. data/vendor/assets/javascripts/bower/vue/.bower.json +29 -0
  229. data/vendor/assets/javascripts/bower/vue/LICENSE +21 -0
  230. data/vendor/assets/javascripts/bower/vue/dist/vue.js +4713 -0
  231. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -0
  232. data/vendor/assets/javascripts/bower/vue/src/batcher.js +45 -0
  233. data/vendor/assets/javascripts/bower/vue/src/binding.js +103 -0
  234. data/vendor/assets/javascripts/bower/vue/src/compiler.js +1037 -0
  235. data/vendor/assets/javascripts/bower/vue/src/config.js +19 -0
  236. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +65 -0
  237. data/vendor/assets/javascripts/bower/vue/src/directive.js +258 -0
  238. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +41 -0
  239. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +56 -0
  240. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +129 -0
  241. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +174 -0
  242. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +56 -0
  243. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +50 -0
  244. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +246 -0
  245. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +40 -0
  246. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +56 -0
  247. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +50 -0
  248. data/vendor/assets/javascripts/bower/vue/src/emitter.js +97 -0
  249. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +190 -0
  250. data/vendor/assets/javascripts/bower/vue/src/filters.js +190 -0
  251. data/vendor/assets/javascripts/bower/vue/src/fragment.js +84 -0
  252. data/vendor/assets/javascripts/bower/vue/src/main.js +186 -0
  253. data/vendor/assets/javascripts/bower/vue/src/observer.js +446 -0
  254. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +96 -0
  255. data/vendor/assets/javascripts/bower/vue/src/transition.js +228 -0
  256. data/vendor/assets/javascripts/bower/vue/src/utils.js +321 -0
  257. data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +180 -0
  258. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +1951 -0
  259. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +6 -0
  260. data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +117 -0
  261. data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +1242 -0
  262. data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +155 -0
  263. data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +6 -0
  264. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +245 -0
  265. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +14013 -0
  266. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +1 -0
  267. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +2599 -0
  268. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +750 -0
  269. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +60 -0
  270. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +12 -0
  271. data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +45 -0
  272. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +1888 -0
  273. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +10 -0
  274. data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +18 -0
  275. data/vendor/assets/stylesheets/.keep +0 -0
  276. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +5830 -0
  277. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +7 -0
  278. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +1338 -0
  279. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +4 -0
  280. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/FontAwesome.otf +0 -0
  281. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  282. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.svg +414 -0
  283. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  284. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  285. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_bordered-pulled.scss +16 -0
  286. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +12 -0
  287. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +6 -0
  288. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +412 -0
  289. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +13 -0
  290. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +19 -0
  291. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +20 -0
  292. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +14 -0
  293. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +9 -0
  294. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +30 -0
  295. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +20 -0
  296. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +381 -0
  297. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +17 -0
  298. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.eot +0 -0
  299. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.svg +229 -0
  300. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.ttf +0 -0
  301. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.woff +0 -0
  302. data/vendor/assets/stylesheets/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.css +233 -0
  303. data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +2 -0
  304. data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +68 -0
  305. data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +144 -0
  306. data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +329 -0
  307. data/vendor/patterns/firewalls +60 -0
  308. data/vendor/patterns/grok-patterns +94 -0
  309. data/vendor/patterns/haproxy +37 -0
  310. data/vendor/patterns/java +3 -0
  311. data/vendor/patterns/junos +9 -0
  312. data/vendor/patterns/linux-syslog +16 -0
  313. data/vendor/patterns/mcollective +1 -0
  314. data/vendor/patterns/mcollective-patterns +4 -0
  315. data/vendor/patterns/mongodb +4 -0
  316. data/vendor/patterns/nagios +108 -0
  317. data/vendor/patterns/postgresql +3 -0
  318. data/vendor/patterns/redis +3 -0
  319. data/vendor/patterns/ruby +2 -0
  320. metadata +659 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
4
+ * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js`
5
+ */
6
+ ;(function(){function n(n,r,t){t=(t||0)-1;for(var e=n?n.length:0;++t<e;)if(n[t]===r)return t;return-1}function r(n,r){for(var t=n.m,e=r.m,u=-1,o=t.length;++u<o;){var i=t[u],f=e[u];if(i!==f){if(i>f||typeof i=="undefined")return 1;if(i<f||typeof f=="undefined")return-1}}return n.n-r.n}function t(n){return"\\"+yr[n]}function e(n,r,t){r||(r=0),typeof t=="undefined"&&(t=n?n.length:0);var e=-1;t=t-r||0;for(var u=Array(0>t?0:t);++e<t;)u[e]=n[r+e];return u}function u(n){return n instanceof u?n:new o(n)}function o(n,r){this.__chain__=!!r,this.__wrapped__=n
7
+ }function i(n){function r(){if(u){var n=e(u);Rr.apply(n,arguments)}if(this instanceof r){var i=f(t.prototype),n=t.apply(i,n||arguments);return O(n)?n:i}return t.apply(o,n||arguments)}var t=n[0],u=n[2],o=n[4];return r}function f(n){return O(n)?Br(n):{}}function a(n,r,t){if(typeof n!="function")return Y;if(typeof r=="undefined"||!("prototype"in n))return n;switch(t){case 1:return function(t){return n.call(r,t)};case 2:return function(t,e){return n.call(r,t,e)};case 3:return function(t,e,u){return n.call(r,t,e,u)
8
+ };case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return L(n,r)}function l(n){function r(){var n=p?a:this;if(o){var y=e(o);Rr.apply(y,arguments)}return(i||g)&&(y||(y=e(arguments)),i&&Rr.apply(y,i),g&&y.length<c)?(u|=16,l([t,h?u:-4&u,y,null,a,c])):(y||(y=arguments),s&&(t=n[v]),this instanceof r?(n=f(t.prototype),y=t.apply(n,y),O(y)?y:n):t.apply(n,y))}var t=n[0],u=n[1],o=n[2],i=n[3],a=n[4],c=n[5],p=1&u,s=2&u,g=4&u,h=8&u,v=t;return r}function c(n,r){for(var t=-1,e=m(),u=n?n.length:0,o=[];++t<u;){var i=n[t];
9
+ 0>e(r,i)&&o.push(i)}return o}function p(n,r,t,e){e=(e||0)-1;for(var u=n?n.length:0,o=[];++e<u;){var i=n[e];if(i&&typeof i=="object"&&typeof i.length=="number"&&(Cr(i)||b(i))){r||(i=p(i,r,t));var f=-1,a=i.length,l=o.length;for(o.length+=a;++f<a;)o[l++]=i[f]}else t||o.push(i)}return o}function s(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(n===n&&!(n&&vr[typeof n]||r&&vr[typeof r]))return false;if(null==n||null==r)return n===r;var o=Er.call(n),i=Er.call(r);if(o!=i)return false;switch(o){case lr:case cr:return+n==+r;
10
+ case pr:return n!=+n?r!=+r:0==n?1/n==1/r:n==+r;case gr:case hr:return n==r+""}if(i=o==ar,!i){var f=n instanceof u,a=r instanceof u;if(f||a)return s(f?n.__wrapped__:n,a?r.__wrapped__:r,t,e);if(o!=sr)return false;if(o=n.constructor,f=r.constructor,o!=f&&!(A(o)&&o instanceof o&&A(f)&&f instanceof f)&&"constructor"in n&&"constructor"in r)return false}for(t||(t=[]),e||(e=[]),o=t.length;o--;)if(t[o]==n)return e[o]==r;var l=true,c=0;if(t.push(n),e.push(r),i){if(c=r.length,l=c==n.length)for(;c--&&(l=s(n[c],r[c],t,e)););}else Kr(r,function(r,u,o){return Nr.call(o,u)?(c++,!(l=Nr.call(n,u)&&s(n[u],r,t,e))&&er):void 0
11
+ }),l&&Kr(n,function(n,r,t){return Nr.call(t,r)?!(l=-1<--c)&&er:void 0});return t.pop(),e.pop(),l}function g(n,r,t){for(var e=-1,u=m(),o=n?n.length:0,i=[],f=t?[]:i;++e<o;){var a=n[e],l=t?t(a,e,n):a;(r?!e||f[f.length-1]!==l:0>u(f,l))&&(t&&f.push(l),i.push(a))}return i}function h(n){return function(r,t,e){var u={};t=X(t,e,3),e=-1;var o=r?r.length:0;if(typeof o=="number")for(;++e<o;){var i=r[e];n(u,i,t(i,e,r),r)}else Lr(r,function(r,e,o){n(u,r,t(r,e,o),o)});return u}}function v(n,r,t,e,u,o){var f=16&r,a=32&r;
12
+ if(!(2&r||A(n)))throw new TypeError;return f&&!t.length&&(r&=-17,t=false),a&&!e.length&&(r&=-33,e=false),(1==r||17===r?i:l)([n,r,t,e,u,o])}function y(n){return Vr[n]}function m(){var r=(r=u.indexOf)===G?n:r;return r}function _(n){return typeof n=="function"&&Ar.test(n)}function d(n){return Gr[n]}function b(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Er.call(n)==fr||false}function w(n){if(!n)return n;for(var r=1,t=arguments.length;r<t;r++){var e=arguments[r];if(e)for(var u in e)n[u]=e[u]}return n
13
+ }function j(n){if(!n)return n;for(var r=1,t=arguments.length;r<t;r++){var e=arguments[r];if(e)for(var u in e)"undefined"==typeof n[u]&&(n[u]=e[u])}return n}function x(n){var r=[];return Kr(n,function(n,t){A(n)&&r.push(t)}),r.sort()}function T(n){for(var r=-1,t=Ur(n),e=t.length,u={};++r<e;){var o=t[r];u[n[o]]=o}return u}function E(n){if(!n)return true;if(Cr(n)||N(n))return!n.length;for(var r in n)if(Nr.call(n,r))return false;return true}function A(n){return typeof n=="function"}function O(n){return!(!n||!vr[typeof n])
14
+ }function S(n){return typeof n=="number"||n&&typeof n=="object"&&Er.call(n)==pr||false}function N(n){return typeof n=="string"||n&&typeof n=="object"&&Er.call(n)==hr||false}function R(n){for(var r=-1,t=Ur(n),e=t.length,u=Array(e);++r<e;)u[r]=n[t[r]];return u}function k(n,r){var t=m(),e=n?n.length:0,u=false;return e&&typeof e=="number"?u=-1<t(n,r):Lr(n,function(n){return(u=n===r)&&er}),u}function B(n,r,t){var e=true;r=X(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u&&(e=!!r(n[t],t,n)););else Lr(n,function(n,t,u){return!(e=!!r(n,t,u))&&er
15
+ });return e}function F(n,r,t){var e=[];r=X(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u;){var o=n[t];r(o,t,n)&&e.push(o)}else Lr(n,function(n,t,u){r(n,t,u)&&e.push(n)});return e}function q(n,r,t){r=X(r,t,3),t=-1;var e=n?n.length:0;if(typeof e!="number"){var u;return Lr(n,function(n,t,e){return r(n,t,e)?(u=n,er):void 0}),u}for(;++t<e;){var o=n[t];if(r(o,t,n))return o}}function D(n,r,t){var e=-1,u=n?n.length:0;if(r=r&&typeof t=="undefined"?r:a(r,t,3),typeof u=="number")for(;++e<u&&r(n[e],e,n)!==er;);else Lr(n,r)
16
+ }function I(n,r){var t=n?n.length:0;if(typeof t=="number")for(;t--&&false!==r(n[t],t,n););else{var e=Ur(n),t=e.length;Lr(n,function(n,u,o){return u=e?e[--t]:--t,false===r(o[u],u,o)&&er})}}function M(n,r,t){var e=-1,u=n?n.length:0;if(r=X(r,t,3),typeof u=="number")for(var o=Array(u);++e<u;)o[e]=r(n[e],e,n);else o=[],Lr(n,function(n,t,u){o[++e]=r(n,t,u)});return o}function $(n,r,t){var e=-1/0,u=e;typeof r!="function"&&t&&t[r]===n&&(r=null);var o=-1,i=n?n.length:0;if(null==r&&typeof i=="number")for(;++o<i;)t=n[o],t>u&&(u=t);
17
+ else r=X(r,t,3),D(n,function(n,t,o){t=r(n,t,o),t>e&&(e=t,u=n)});return u}function W(n,r,t,e){if(!n)return t;var u=3>arguments.length;r=X(r,e,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(t=n[++o]);++o<i;)t=r(t,n[o],o,n);else Lr(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)});return t}function z(n,r,t,e){var u=3>arguments.length;return r=X(r,e,4),I(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)}),t}function C(n){var r=-1,t=n?n.length:0,e=Array(typeof t=="number"?t:0);return D(n,function(n){var t;t=++r,t=0+Sr(Wr()*(t-0+1)),e[r]=e[t],e[t]=n
18
+ }),e}function P(n,r,t){var e;r=X(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u&&!(e=r(n[t],t,n)););else Lr(n,function(n,t,u){return(e=r(n,t,u))&&er});return!!e}function U(n,r,t){return t&&E(r)?rr:(t?q:F)(n,r)}function V(n,r,t){var u=0,o=n?n.length:0;if(typeof r!="number"&&null!=r){var i=-1;for(r=X(r,t,3);++i<o&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[0]:rr;return e(n,0,$r(Mr(0,u),o))}function G(r,t,e){if(typeof e=="number"){var u=r?r.length:0;e=0>e?Mr(0,u+e):e||0}else if(e)return e=J(r,t),r[e]===t?e:-1;
19
+ return n(r,t,e)}function H(n,r,t){if(typeof r!="number"&&null!=r){var u=0,o=-1,i=n?n.length:0;for(r=X(r,t,3);++o<i&&r(n[o],o,n);)u++}else u=null==r||t?1:Mr(0,r);return e(n,u)}function J(n,r,t,e){var u=0,o=n?n.length:u;for(t=t?X(t,e,1):Y,r=t(r);u<o;)e=u+o>>>1,t(n[e])<r?u=e+1:o=e;return u}function K(n,r,t,e){return typeof r!="boolean"&&null!=r&&(e=t,t=typeof r!="function"&&e&&e[r]===n?null:r,r=false),null!=t&&(t=X(t,e,3)),g(n,r,t)}function L(n,r){return 2<arguments.length?v(n,17,e(arguments,2),null,r):v(n,1,null,null,r)
20
+ }function Q(n,r,t){var e,u,o,i,f,a,l,c=0,p=false,s=true;if(!A(n))throw new TypeError;if(r=Mr(0,r)||0,true===t)var g=true,s=false;else O(t)&&(g=t.leading,p="maxWait"in t&&(Mr(r,t.maxWait)||0),s="trailing"in t?t.trailing:s);var h=function(){var t=r-(nt()-i);0<t?a=setTimeout(h,t):(u&&clearTimeout(u),t=l,u=a=l=rr,t&&(c=nt(),o=n.apply(f,e),a||u||(e=f=null)))},v=function(){a&&clearTimeout(a),u=a=l=rr,(s||p!==r)&&(c=nt(),o=n.apply(f,e),a||u||(e=f=null))};return function(){if(e=arguments,i=nt(),f=this,l=s&&(a||!g),false===p)var t=g&&!a;
21
+ else{u||g||(c=i);var y=p-(i-c),m=0>=y;m?(u&&(u=clearTimeout(u)),c=i,o=n.apply(f,e)):u||(u=setTimeout(v,y))}return m&&a?a=clearTimeout(a):a||r===p||(a=setTimeout(h,r)),t&&(m=true,o=n.apply(f,e)),!m||a||u||(e=f=null),o}}function X(n,r,t){var e=typeof n;if(null==n||"function"==e)return a(n,r,t);if("object"!=e)return nr(n);var u=Ur(n);return function(r){for(var t=u.length,e=false;t--&&(e=r[u[t]]===n[u[t]]););return e}}function Y(n){return n}function Z(n){D(x(n),function(r){var t=u[r]=n[r];u.prototype[r]=function(){var n=[this.__wrapped__];
22
+ return Rr.apply(n,arguments),n=t.apply(u,n),this.__chain__?new o(n,true):n}})}function nr(n){return function(r){return r[n]}}var rr,tr=0,er={},ur=+new Date+"",or=/($^)/,ir=/['\n\r\t\u2028\u2029\\]/g,fr="[object Arguments]",ar="[object Array]",lr="[object Boolean]",cr="[object Date]",pr="[object Number]",sr="[object Object]",gr="[object RegExp]",hr="[object String]",vr={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},yr={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},mr=vr[typeof window]&&window||this,_r=vr[typeof exports]&&exports&&!exports.nodeType&&exports,dr=vr[typeof module]&&module&&!module.nodeType&&module,br=dr&&dr.exports===_r&&_r,wr=vr[typeof global]&&global;
23
+ !wr||wr.global!==wr&&wr.window!==wr||(mr=wr);var jr=[],xr=Object.prototype,Tr=mr._,Er=xr.toString,Ar=RegExp("^"+(Er+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),Or=Math.ceil,Sr=Math.floor,Nr=xr.hasOwnProperty,Rr=jr.push,kr=xr.propertyIsEnumerable,Br=_(Br=Object.create)&&Br,Fr=_(Fr=Array.isArray)&&Fr,qr=mr.isFinite,Dr=mr.isNaN,Ir=_(Ir=Object.keys)&&Ir,Mr=Math.max,$r=Math.min,Wr=Math.random;o.prototype=u.prototype;var zr={};!function(){var n={0:1,length:1};zr.spliceObjects=(jr.splice.call(n,0,1),!n[0])
24
+ }(1),u.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""},Br||(f=function(){function n(){}return function(r){if(O(r)){n.prototype=r;var t=new n;n.prototype=null}return t||mr.Object()}}()),b(arguments)||(b=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Nr.call(n,"callee")&&!kr.call(n,"callee")||false});var Cr=Fr||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Er.call(n)==ar||false},Pr=function(n){var r,t=[];
25
+ if(!n||!vr[typeof n])return t;for(r in n)Nr.call(n,r)&&t.push(r);return t},Ur=Ir?function(n){return O(n)?Ir(n):[]}:Pr,Vr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"},Gr=T(Vr),Hr=RegExp("("+Ur(Gr).join("|")+")","g"),Jr=RegExp("["+Ur(Vr).join("")+"]","g"),Kr=function(n,r){var t;if(!n||!vr[typeof n])return n;for(t in n)if(r(n[t],t,n)===er)break;return n},Lr=function(n,r){var t;if(!n||!vr[typeof n])return n;for(t in n)if(Nr.call(n,t)&&r(n[t],t,n)===er)break;return n};A(/x/)&&(A=function(n){return typeof n=="function"&&"[object Function]"==Er.call(n)
26
+ });var Qr=h(function(n,r,t){Nr.call(n,t)?n[t]++:n[t]=1}),Xr=h(function(n,r,t){(Nr.call(n,t)?n[t]:n[t]=[]).push(r)}),Yr=h(function(n,r,t){n[t]=r}),Zr=M,nt=_(nt=Date.now)&&nt||function(){return(new Date).getTime()};u.after=function(n,r){if(!A(r))throw new TypeError;return function(){return 1>--n?r.apply(this,arguments):void 0}},u.bind=L,u.bindAll=function(n){for(var r=1<arguments.length?p(arguments,true,false,1):x(n),t=-1,e=r.length;++t<e;){var u=r[t];n[u]=v(n[u],1,null,null,n)}return n},u.chain=function(n){return n=new o(n),n.__chain__=true,n
27
+ },u.compact=function(n){for(var r=-1,t=n?n.length:0,e=[];++r<t;){var u=n[r];u&&e.push(u)}return e},u.compose=function(){for(var n=arguments,r=n.length;r--;)if(!A(n[r]))throw new TypeError;return function(){for(var r=arguments,t=n.length;t--;)r=[n[t].apply(this,r)];return r[0]}},u.countBy=Qr,u.debounce=Q,u.defaults=j,u.defer=function(n){if(!A(n))throw new TypeError;var r=e(arguments,1);return setTimeout(function(){n.apply(rr,r)},1)},u.delay=function(n,r){if(!A(n))throw new TypeError;var t=e(arguments,2);
28
+ return setTimeout(function(){n.apply(rr,t)},r)},u.difference=function(n){return c(n,p(arguments,true,true,1))},u.filter=F,u.flatten=function(n,r){return p(n,r)},u.forEach=D,u.functions=x,u.groupBy=Xr,u.indexBy=Yr,u.initial=function(n,r,t){var u=0,o=n?n.length:0;if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else u=null==r||t?1:r||u;return e(n,0,$r(Mr(0,o-u),o))},u.intersection=function(){for(var n=[],r=-1,t=arguments.length;++r<t;){var e=arguments[r];(Cr(e)||b(e))&&n.push(e)
29
+ }var u=n[0],o=-1,i=m(),f=u?u.length:0,a=[];n:for(;++o<f;)if(e=u[o],0>i(a,e)){for(r=t;--r;)if(0>i(n[r],e))continue n;a.push(e)}return a},u.invert=T,u.invoke=function(n,r){var t=e(arguments,2),u=-1,o=typeof r=="function",i=n?n.length:0,f=Array(typeof i=="number"?i:0);return D(n,function(n){f[++u]=(o?r:n[r]).apply(n,t)}),f},u.keys=Ur,u.map=M,u.max=$,u.memoize=function(n,r){var t={};return function(){var e=r?r.apply(this,arguments):ur+arguments[0];return Nr.call(t,e)?t[e]:t[e]=n.apply(this,arguments)
30
+ }},u.min=function(n,r,t){var e=1/0,u=e;typeof r!="function"&&t&&t[r]===n&&(r=null);var o=-1,i=n?n.length:0;if(null==r&&typeof i=="number")for(;++o<i;)t=n[o],t<u&&(u=t);else r=X(r,t,3),D(n,function(n,t,o){t=r(n,t,o),t<e&&(e=t,u=n)});return u},u.omit=function(n){var r=[];Kr(n,function(n,t){r.push(t)});for(var r=c(r,p(arguments,true,false,1)),t=-1,e=r.length,u={};++t<e;){var o=r[t];u[o]=n[o]}return u},u.once=function(n){var r,t;if(!A(n))throw new TypeError;return function(){return r?t:(r=true,t=n.apply(this,arguments),n=null,t)
31
+ }},u.pairs=function(n){for(var r=-1,t=Ur(n),e=t.length,u=Array(e);++r<e;){var o=t[r];u[r]=[o,n[o]]}return u},u.partial=function(n){return v(n,16,e(arguments,1))},u.pick=function(n){for(var r=-1,t=p(arguments,true,false,1),e=t.length,u={};++r<e;){var o=t[r];o in n&&(u[o]=n[o])}return u},u.pluck=Zr,u.range=function(n,r,t){n=+n||0,t=+t||1,null==r&&(r=n,n=0);var e=-1;r=Mr(0,Or((r-n)/t));for(var u=Array(r);++e<r;)u[e]=n,n+=t;return u},u.reject=function(n,r,t){return r=X(r,t,3),F(n,function(n,t,e){return!r(n,t,e)
32
+ })},u.rest=H,u.shuffle=C,u.sortBy=function(n,t,e){var u=-1,o=n?n.length:0,i=Array(typeof o=="number"?o:0);for(t=X(t,e,3),D(n,function(n,r,e){i[++u]={m:[t(n,r,e)],n:u,o:n}}),o=i.length,i.sort(r);o--;)i[o]=i[o].o;return i},u.tap=function(n,r){return r(n),n},u.throttle=function(n,r,t){var e=true,u=true;if(!A(n))throw new TypeError;return false===t?e=false:O(t)&&(e="leading"in t?t.leading:e,u="trailing"in t?t.trailing:u),t={},t.leading=e,t.maxWait=r,t.trailing=u,Q(n,r,t)},u.times=function(n,r,t){n=-1<(n=+n)?n:0;
33
+ var e=-1,u=Array(n);for(r=a(r,t,1);++e<n;)u[e]=r(e);return u},u.toArray=function(n){return Cr(n)?e(n):n&&typeof n.length=="number"?M(n):R(n)},u.union=function(){return g(p(arguments,true,true))},u.uniq=K,u.values=R,u.where=U,u.without=function(n){return c(n,e(arguments,1))},u.wrap=function(n,r){return v(r,16,[n])},u.zip=function(){for(var n=-1,r=$(Zr(arguments,"length")),t=Array(0>r?0:r);++n<r;)t[n]=Zr(arguments,n);return t},u.collect=M,u.drop=H,u.each=D,u.extend=w,u.methods=x,u.object=function(n,r){var t=-1,e=n?n.length:0,u={};
34
+ for(r||!e||Cr(n[0])||(r=[]);++t<e;){var o=n[t];r?u[o]=r[t]:o&&(u[o[0]]=o[1])}return u},u.select=F,u.tail=H,u.unique=K,u.clone=function(n){return O(n)?Cr(n)?e(n):w({},n):n},u.contains=k,u.escape=function(n){return null==n?"":(n+"").replace(Jr,y)},u.every=B,u.find=q,u.has=function(n,r){return n?Nr.call(n,r):false},u.identity=Y,u.indexOf=G,u.isArguments=b,u.isArray=Cr,u.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&Er.call(n)==lr||false},u.isDate=function(n){return n&&typeof n=="object"&&Er.call(n)==cr||false
35
+ },u.isElement=function(n){return n&&1===n.nodeType||false},u.isEmpty=E,u.isEqual=function(n,r){return s(n,r)},u.isFinite=function(n){return qr(n)&&!Dr(parseFloat(n))},u.isFunction=A,u.isNaN=function(n){return S(n)&&n!=+n},u.isNull=function(n){return null===n},u.isNumber=S,u.isObject=O,u.isRegExp=function(n){return n&&vr[typeof n]&&Er.call(n)==gr||false},u.isString=N,u.isUndefined=function(n){return typeof n=="undefined"},u.lastIndexOf=function(n,r,t){var e=n?n.length:0;for(typeof t=="number"&&(e=(0>t?Mr(0,e+t):$r(t,e-1))+1);e--;)if(n[e]===r)return e;
36
+ return-1},u.mixin=Z,u.noConflict=function(){return mr._=Tr,this},u.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+Sr(Wr()*(r-n+1))},u.reduce=W,u.reduceRight=z,u.result=function(n,r){if(n){var t=n[r];return A(t)?n[r]():t}},u.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:Ur(n).length},u.some=P,u.sortedIndex=J,u.template=function(n,r,e){var o=u,i=o.templateSettings;n=(n||"")+"",e=j({},e,i);var f=0,a="__p+='",i=e.variable;n.replace(RegExp((e.escape||or).source+"|"+(e.interpolate||or).source+"|"+(e.evaluate||or).source+"|$","g"),function(r,e,u,o,i){return a+=n.slice(f,i).replace(ir,t),e&&(a+="'+_.escape("+e+")+'"),o&&(a+="';"+o+";\n__p+='"),u&&(a+="'+((__t=("+u+"))==null?'':__t)+'"),f=i+r.length,r
37
+ }),a+="';",i||(i="obj",a="with("+i+"||{}){"+a+"}"),a="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var l=Function("_","return "+a)(o)}catch(c){throw c.source=a,c}return r?l(r):(l.source=a,l)},u.unescape=function(n){return null==n?"":(n+"").replace(Hr,d)},u.uniqueId=function(n){var r=++tr+"";return n?n+r:r},u.all=B,u.any=P,u.detect=q,u.findWhere=function(n,r){return U(n,r,true)},u.foldl=W,u.foldr=z,u.include=k,u.inject=W,u.first=V,u.last=function(n,r,t){var u=0,o=n?n.length:0;
38
+ if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:rr;return e(n,Mr(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=R(n)),null==r||t?n?n[0+Sr(Wr()*(n.length-1-0+1))]:rr:(n=C(n),n.length=$r(Mr(0,r),n.length),n)},u.take=V,u.head=V,Z(u),u.VERSION="2.4.1",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},D("pop push reverse shift sort splice unshift".split(" "),function(n){var r=jr[n];
39
+ u.prototype[n]=function(){var n=this.__wrapped__;return r.apply(n,arguments),zr.spliceObjects||0!==n.length||delete n[0],this}}),D(["concat","join","slice"],function(n){var r=jr[n];u.prototype[n]=function(){var n=r.apply(this.__wrapped__,arguments);return this.__chain__&&(n=new o(n),n.__chain__=true),n}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(mr._=u, define(function(){return u})):_r&&dr?br?(dr.exports=u)._=u:_r._=u:mr._=u}).call(this);
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "vue",
3
+ "version": "0.10.5",
4
+ "main": "dist/vue.js",
5
+ "description": "Simple, Fast & Composable MVVM for building interative interfaces",
6
+ "authors": [
7
+ "Evan You <yyx990803@gmail.com>"
8
+ ],
9
+ "license": "MIT",
10
+ "ignore": [
11
+ ".*",
12
+ "examples",
13
+ "test",
14
+ "tasks",
15
+ "Gruntfile.js",
16
+ "*.json",
17
+ "*.md"
18
+ ],
19
+ "homepage": "https://github.com/yyx990803/vue",
20
+ "_release": "0.10.5",
21
+ "_resolution": {
22
+ "type": "version",
23
+ "tag": "v0.10.5",
24
+ "commit": "fe996b388971b014279b1f90df26ef95d8b00f05"
25
+ },
26
+ "_source": "git://github.com/yyx990803/vue.git",
27
+ "_target": "~0.10.0",
28
+ "_originalSource": "vue"
29
+ }
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Yuxi Evan You
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,4713 @@
1
+ /*
2
+ Vue.js v0.10.5
3
+ (c) 2014 Evan You
4
+ License: MIT
5
+ */
6
+ ;(function(){
7
+ 'use strict';
8
+
9
+ /**
10
+ * Require the given path.
11
+ *
12
+ * @param {String} path
13
+ * @return {Object} exports
14
+ * @api public
15
+ */
16
+
17
+ function require(path, parent, orig) {
18
+ var resolved = require.resolve(path);
19
+
20
+ // lookup failed
21
+ if (null == resolved) {
22
+ throwError()
23
+ return
24
+ }
25
+
26
+ var module = require.modules[resolved];
27
+
28
+ // perform real require()
29
+ // by invoking the module's
30
+ // registered function
31
+ if (!module._resolving && !module.exports) {
32
+ var mod = {};
33
+ mod.exports = {};
34
+ mod.client = mod.component = true;
35
+ module._resolving = true;
36
+ module.call(this, mod.exports, require.relative(resolved), mod);
37
+ delete module._resolving;
38
+ module.exports = mod.exports;
39
+ }
40
+
41
+ function throwError () {
42
+ orig = orig || path;
43
+ parent = parent || 'root';
44
+ var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
45
+ err.path = orig;
46
+ err.parent = parent;
47
+ err.require = true;
48
+ throw err;
49
+ }
50
+
51
+ return module.exports;
52
+ }
53
+
54
+ /**
55
+ * Registered modules.
56
+ */
57
+
58
+ require.modules = {};
59
+
60
+ /**
61
+ * Registered aliases.
62
+ */
63
+
64
+ require.aliases = {};
65
+
66
+ /**
67
+ * Resolve `path`.
68
+ *
69
+ * Lookup:
70
+ *
71
+ * - PATH/index.js
72
+ * - PATH.js
73
+ * - PATH
74
+ *
75
+ * @param {String} path
76
+ * @return {String} path or null
77
+ * @api private
78
+ */
79
+
80
+ require.exts = [
81
+ '',
82
+ '.js',
83
+ '.json',
84
+ '/index.js',
85
+ '/index.json'
86
+ ];
87
+
88
+ require.resolve = function(path) {
89
+ if (path.charAt(0) === '/') path = path.slice(1);
90
+
91
+ for (var i = 0; i < 5; i++) {
92
+ var fullPath = path + require.exts[i];
93
+ if (require.modules.hasOwnProperty(fullPath)) return fullPath;
94
+ if (require.aliases.hasOwnProperty(fullPath)) return require.aliases[fullPath];
95
+ }
96
+ };
97
+
98
+ /**
99
+ * Normalize `path` relative to the current path.
100
+ *
101
+ * @param {String} curr
102
+ * @param {String} path
103
+ * @return {String}
104
+ * @api private
105
+ */
106
+
107
+ require.normalize = function(curr, path) {
108
+
109
+ var segs = [];
110
+
111
+ if ('.' != path.charAt(0)) return path;
112
+
113
+ curr = curr.split('/');
114
+ path = path.split('/');
115
+
116
+ for (var i = 0; i < path.length; ++i) {
117
+ if ('..' === path[i]) {
118
+ curr.pop();
119
+ } else if ('.' != path[i] && '' != path[i]) {
120
+ segs.push(path[i]);
121
+ }
122
+ }
123
+ return curr.concat(segs).join('/');
124
+ };
125
+
126
+ /**
127
+ * Register module at `path` with callback `definition`.
128
+ *
129
+ * @param {String} path
130
+ * @param {Function} definition
131
+ * @api private
132
+ */
133
+
134
+ require.register = function(path, definition) {
135
+ require.modules[path] = definition;
136
+ };
137
+
138
+ /**
139
+ * Alias a module definition.
140
+ *
141
+ * @param {String} from
142
+ * @param {String} to
143
+ * @api private
144
+ */
145
+
146
+ require.alias = function(from, to) {
147
+ if (!require.modules.hasOwnProperty(from)) {
148
+ throwError()
149
+ return
150
+ }
151
+ require.aliases[to] = from;
152
+
153
+ function throwError () {
154
+ throw new Error('Failed to alias "' + from + '", it does not exist');
155
+ }
156
+ };
157
+
158
+ /**
159
+ * Return a require function relative to the `parent` path.
160
+ *
161
+ * @param {String} parent
162
+ * @return {Function}
163
+ * @api private
164
+ */
165
+
166
+ require.relative = function(parent) {
167
+ var p = require.normalize(parent, '..');
168
+
169
+ /**
170
+ * The relative require() itself.
171
+ */
172
+
173
+ function localRequire(path) {
174
+ var resolved = localRequire.resolve(path);
175
+ return require(resolved, parent, path);
176
+ }
177
+
178
+ /**
179
+ * Resolve relative to the parent.
180
+ */
181
+
182
+ localRequire.resolve = function(path) {
183
+ var c = path.charAt(0);
184
+ if ('/' === c) return path.slice(1);
185
+ if ('.' === c) return require.normalize(p, path);
186
+
187
+ // resolve deps by returning
188
+ // the dep in the nearest "deps"
189
+ // directory
190
+ var segs = parent.split('/');
191
+ var i = segs.length;
192
+ while (i--) {
193
+ if (segs[i] === 'deps') {
194
+ break;
195
+ }
196
+ }
197
+ path = segs.slice(0, i + 2).join('/') + '/deps/' + path;
198
+ return path;
199
+ };
200
+
201
+ /**
202
+ * Check if module is defined at `path`.
203
+ */
204
+
205
+ localRequire.exists = function(path) {
206
+ return require.modules.hasOwnProperty(localRequire.resolve(path));
207
+ };
208
+
209
+ return localRequire;
210
+ };
211
+ require.register("vue/src/main.js", function(exports, require, module){
212
+ var config = require('./config'),
213
+ ViewModel = require('./viewmodel'),
214
+ utils = require('./utils'),
215
+ makeHash = utils.hash,
216
+ assetTypes = ['directive', 'filter', 'partial', 'effect', 'component']
217
+
218
+ // require these so Browserify can catch them
219
+ // so they can be used in Vue.require
220
+ require('./observer')
221
+ require('./transition')
222
+
223
+ ViewModel.options = config.globalAssets = {
224
+ directives : require('./directives'),
225
+ filters : require('./filters'),
226
+ partials : makeHash(),
227
+ effects : makeHash(),
228
+ components : makeHash()
229
+ }
230
+
231
+ /**
232
+ * Expose asset registration methods
233
+ */
234
+ assetTypes.forEach(function (type) {
235
+ ViewModel[type] = function (id, value) {
236
+ var hash = this.options[type + 's']
237
+ if (!hash) {
238
+ hash = this.options[type + 's'] = makeHash()
239
+ }
240
+ if (!value) return hash[id]
241
+ if (type === 'partial') {
242
+ value = utils.toFragment(value)
243
+ } else if (type === 'component') {
244
+ value = utils.toConstructor(value)
245
+ } else if (type === 'filter') {
246
+ utils.checkFilter(value)
247
+ }
248
+ hash[id] = value
249
+ return this
250
+ }
251
+ })
252
+
253
+ /**
254
+ * Set config options
255
+ */
256
+ ViewModel.config = function (opts, val) {
257
+ if (typeof opts === 'string') {
258
+ if (val === undefined) {
259
+ return config[opts]
260
+ } else {
261
+ config[opts] = val
262
+ }
263
+ } else {
264
+ utils.extend(config, opts)
265
+ }
266
+ return this
267
+ }
268
+
269
+ /**
270
+ * Expose an interface for plugins
271
+ */
272
+ ViewModel.use = function (plugin) {
273
+ if (typeof plugin === 'string') {
274
+ try {
275
+ plugin = require(plugin)
276
+ } catch (e) {
277
+ utils.warn('Cannot find plugin: ' + plugin)
278
+ return
279
+ }
280
+ }
281
+
282
+ // additional parameters
283
+ var args = [].slice.call(arguments, 1)
284
+ args.unshift(this)
285
+
286
+ if (typeof plugin.install === 'function') {
287
+ plugin.install.apply(plugin, args)
288
+ } else {
289
+ plugin.apply(null, args)
290
+ }
291
+ return this
292
+ }
293
+
294
+ /**
295
+ * Expose internal modules for plugins
296
+ */
297
+ ViewModel.require = function (path) {
298
+ return require('./' + path)
299
+ }
300
+
301
+ ViewModel.extend = extend
302
+ ViewModel.nextTick = utils.nextTick
303
+
304
+ /**
305
+ * Expose the main ViewModel class
306
+ * and add extend method
307
+ */
308
+ function extend (options) {
309
+
310
+ var ParentVM = this
311
+
312
+ // extend data options need to be copied
313
+ // on instantiation
314
+ if (options.data) {
315
+ options.defaultData = options.data
316
+ delete options.data
317
+ }
318
+
319
+ // inherit options
320
+ // but only when the super class is not the native Vue.
321
+ if (ParentVM !== ViewModel) {
322
+ options = inheritOptions(options, ParentVM.options, true)
323
+ }
324
+ utils.processOptions(options)
325
+
326
+ var ExtendedVM = function (opts, asParent) {
327
+ if (!asParent) {
328
+ opts = inheritOptions(opts, options, true)
329
+ }
330
+ ParentVM.call(this, opts, true)
331
+ }
332
+
333
+ // inherit prototype props
334
+ var proto = ExtendedVM.prototype = Object.create(ParentVM.prototype)
335
+ utils.defProtected(proto, 'constructor', ExtendedVM)
336
+
337
+ // allow extended VM to be further extended
338
+ ExtendedVM.extend = extend
339
+ ExtendedVM.super = ParentVM
340
+ ExtendedVM.options = options
341
+
342
+ // allow extended VM to add its own assets
343
+ assetTypes.forEach(function (type) {
344
+ ExtendedVM[type] = ViewModel[type]
345
+ })
346
+
347
+ // allow extended VM to use plugins
348
+ ExtendedVM.use = ViewModel.use
349
+ ExtendedVM.require = ViewModel.require
350
+
351
+ return ExtendedVM
352
+ }
353
+
354
+ /**
355
+ * Inherit options
356
+ *
357
+ * For options such as `data`, `vms`, `directives`, 'partials',
358
+ * they should be further extended. However extending should only
359
+ * be done at top level.
360
+ *
361
+ * `proto` is an exception because it's handled directly on the
362
+ * prototype.
363
+ *
364
+ * `el` is an exception because it's not allowed as an
365
+ * extension option, but only as an instance option.
366
+ */
367
+ function inheritOptions (child, parent, topLevel) {
368
+ child = child || {}
369
+ if (!parent) return child
370
+ for (var key in parent) {
371
+ if (key === 'el') continue
372
+ var val = child[key],
373
+ parentVal = parent[key]
374
+ if (topLevel && typeof val === 'function' && parentVal) {
375
+ // merge hook functions into an array
376
+ child[key] = [val]
377
+ if (Array.isArray(parentVal)) {
378
+ child[key] = child[key].concat(parentVal)
379
+ } else {
380
+ child[key].push(parentVal)
381
+ }
382
+ } else if (
383
+ topLevel &&
384
+ (utils.isTrueObject(val) || utils.isTrueObject(parentVal))
385
+ && !(parentVal instanceof ViewModel)
386
+ ) {
387
+ // merge toplevel object options
388
+ child[key] = inheritOptions(val, parentVal)
389
+ } else if (val === undefined) {
390
+ // inherit if child doesn't override
391
+ child[key] = parentVal
392
+ }
393
+ }
394
+ return child
395
+ }
396
+
397
+ module.exports = ViewModel
398
+ });
399
+ require.register("vue/src/emitter.js", function(exports, require, module){
400
+ var slice = [].slice
401
+
402
+ function Emitter (ctx) {
403
+ this._ctx = ctx || this
404
+ }
405
+
406
+ var EmitterProto = Emitter.prototype
407
+
408
+ EmitterProto.on = function (event, fn) {
409
+ this._cbs = this._cbs || {}
410
+ ;(this._cbs[event] = this._cbs[event] || [])
411
+ .push(fn)
412
+ return this
413
+ }
414
+
415
+ EmitterProto.once = function (event, fn) {
416
+ var self = this
417
+ this._cbs = this._cbs || {}
418
+
419
+ function on () {
420
+ self.off(event, on)
421
+ fn.apply(this, arguments)
422
+ }
423
+
424
+ on.fn = fn
425
+ this.on(event, on)
426
+ return this
427
+ }
428
+
429
+ EmitterProto.off = function (event, fn) {
430
+ this._cbs = this._cbs || {}
431
+
432
+ // all
433
+ if (!arguments.length) {
434
+ this._cbs = {}
435
+ return this
436
+ }
437
+
438
+ // specific event
439
+ var callbacks = this._cbs[event]
440
+ if (!callbacks) return this
441
+
442
+ // remove all handlers
443
+ if (arguments.length === 1) {
444
+ delete this._cbs[event]
445
+ return this
446
+ }
447
+
448
+ // remove specific handler
449
+ var cb
450
+ for (var i = 0; i < callbacks.length; i++) {
451
+ cb = callbacks[i]
452
+ if (cb === fn || cb.fn === fn) {
453
+ callbacks.splice(i, 1)
454
+ break
455
+ }
456
+ }
457
+ return this
458
+ }
459
+
460
+ /**
461
+ * The internal, faster emit with fixed amount of arguments
462
+ * using Function.call
463
+ */
464
+ EmitterProto.emit = function (event, a, b, c) {
465
+ this._cbs = this._cbs || {}
466
+ var callbacks = this._cbs[event]
467
+
468
+ if (callbacks) {
469
+ callbacks = callbacks.slice(0)
470
+ for (var i = 0, len = callbacks.length; i < len; i++) {
471
+ callbacks[i].call(this._ctx, a, b, c)
472
+ }
473
+ }
474
+
475
+ return this
476
+ }
477
+
478
+ /**
479
+ * The external emit using Function.apply
480
+ */
481
+ EmitterProto.applyEmit = function (event) {
482
+ this._cbs = this._cbs || {}
483
+ var callbacks = this._cbs[event], args
484
+
485
+ if (callbacks) {
486
+ callbacks = callbacks.slice(0)
487
+ args = slice.call(arguments, 1)
488
+ for (var i = 0, len = callbacks.length; i < len; i++) {
489
+ callbacks[i].apply(this._ctx, args)
490
+ }
491
+ }
492
+
493
+ return this
494
+ }
495
+
496
+ module.exports = Emitter
497
+ });
498
+ require.register("vue/src/config.js", function(exports, require, module){
499
+ var TextParser = require('./text-parser')
500
+
501
+ module.exports = {
502
+ prefix : 'v',
503
+ debug : false,
504
+ silent : false,
505
+ enterClass : 'v-enter',
506
+ leaveClass : 'v-leave',
507
+ interpolate : true
508
+ }
509
+
510
+ Object.defineProperty(module.exports, 'delimiters', {
511
+ get: function () {
512
+ return TextParser.delimiters
513
+ },
514
+ set: function (delimiters) {
515
+ TextParser.setDelimiters(delimiters)
516
+ }
517
+ })
518
+ });
519
+ require.register("vue/src/utils.js", function(exports, require, module){
520
+ var config = require('./config'),
521
+ toString = ({}).toString,
522
+ win = window,
523
+ console = win.console,
524
+ def = Object.defineProperty,
525
+ OBJECT = 'object',
526
+ THIS_RE = /[^\w]this[^\w]/,
527
+ BRACKET_RE_S = /\['([^']+)'\]/g,
528
+ BRACKET_RE_D = /\["([^"]+)"\]/g,
529
+ hasClassList = 'classList' in document.documentElement,
530
+ ViewModel // late def
531
+
532
+ var defer =
533
+ win.requestAnimationFrame ||
534
+ win.webkitRequestAnimationFrame ||
535
+ win.setTimeout
536
+
537
+ /**
538
+ * Normalize keypath with possible brackets into dot notations
539
+ */
540
+ function normalizeKeypath (key) {
541
+ return key.indexOf('[') < 0
542
+ ? key
543
+ : key.replace(BRACKET_RE_S, '.$1')
544
+ .replace(BRACKET_RE_D, '.$1')
545
+ }
546
+
547
+ var utils = module.exports = {
548
+
549
+ /**
550
+ * Convert a string template to a dom fragment
551
+ */
552
+ toFragment: require('./fragment'),
553
+
554
+ /**
555
+ * get a value from an object keypath
556
+ */
557
+ get: function (obj, key) {
558
+ /* jshint eqeqeq: false */
559
+ key = normalizeKeypath(key)
560
+ if (key.indexOf('.') < 0) {
561
+ return obj[key]
562
+ }
563
+ var path = key.split('.'),
564
+ d = -1, l = path.length
565
+ while (++d < l && obj != null) {
566
+ obj = obj[path[d]]
567
+ }
568
+ return obj
569
+ },
570
+
571
+ /**
572
+ * set a value to an object keypath
573
+ */
574
+ set: function (obj, key, val) {
575
+ /* jshint eqeqeq: false */
576
+ key = normalizeKeypath(key)
577
+ if (key.indexOf('.') < 0) {
578
+ obj[key] = val
579
+ return
580
+ }
581
+ var path = key.split('.'),
582
+ d = -1, l = path.length - 1
583
+ while (++d < l) {
584
+ if (obj[path[d]] == null) {
585
+ obj[path[d]] = {}
586
+ }
587
+ obj = obj[path[d]]
588
+ }
589
+ obj[path[d]] = val
590
+ },
591
+
592
+ /**
593
+ * return the base segment of a keypath
594
+ */
595
+ baseKey: function (key) {
596
+ return key.indexOf('.') > 0
597
+ ? key.split('.')[0]
598
+ : key
599
+ },
600
+
601
+ /**
602
+ * Create a prototype-less object
603
+ * which is a better hash/map
604
+ */
605
+ hash: function () {
606
+ return Object.create(null)
607
+ },
608
+
609
+ /**
610
+ * get an attribute and remove it.
611
+ */
612
+ attr: function (el, type) {
613
+ var attr = config.prefix + '-' + type,
614
+ val = el.getAttribute(attr)
615
+ if (val !== null) {
616
+ el.removeAttribute(attr)
617
+ }
618
+ return val
619
+ },
620
+
621
+ /**
622
+ * Define an ienumerable property
623
+ * This avoids it being included in JSON.stringify
624
+ * or for...in loops.
625
+ */
626
+ defProtected: function (obj, key, val, enumerable, writable) {
627
+ def(obj, key, {
628
+ value : val,
629
+ enumerable : enumerable,
630
+ writable : writable,
631
+ configurable : true
632
+ })
633
+ },
634
+
635
+ /**
636
+ * A less bullet-proof but more efficient type check
637
+ * than Object.prototype.toString
638
+ */
639
+ isObject: function (obj) {
640
+ return typeof obj === OBJECT && obj && !Array.isArray(obj)
641
+ },
642
+
643
+ /**
644
+ * A more accurate but less efficient type check
645
+ */
646
+ isTrueObject: function (obj) {
647
+ return toString.call(obj) === '[object Object]'
648
+ },
649
+
650
+ /**
651
+ * Most simple bind
652
+ * enough for the usecase and fast than native bind()
653
+ */
654
+ bind: function (fn, ctx) {
655
+ return function (arg) {
656
+ return fn.call(ctx, arg)
657
+ }
658
+ },
659
+
660
+ /**
661
+ * Make sure null and undefined output empty string
662
+ */
663
+ guard: function (value) {
664
+ /* jshint eqeqeq: false, eqnull: true */
665
+ return value == null
666
+ ? ''
667
+ : (typeof value == 'object')
668
+ ? JSON.stringify(value)
669
+ : value
670
+ },
671
+
672
+ /**
673
+ * When setting value on the VM, parse possible numbers
674
+ */
675
+ checkNumber: function (value) {
676
+ return (isNaN(value) || value === null || typeof value === 'boolean')
677
+ ? value
678
+ : Number(value)
679
+ },
680
+
681
+ /**
682
+ * simple extend
683
+ */
684
+ extend: function (obj, ext) {
685
+ for (var key in ext) {
686
+ if (obj[key] !== ext[key]) {
687
+ obj[key] = ext[key]
688
+ }
689
+ }
690
+ return obj
691
+ },
692
+
693
+ /**
694
+ * filter an array with duplicates into uniques
695
+ */
696
+ unique: function (arr) {
697
+ var hash = utils.hash(),
698
+ i = arr.length,
699
+ key, res = []
700
+ while (i--) {
701
+ key = arr[i]
702
+ if (hash[key]) continue
703
+ hash[key] = 1
704
+ res.push(key)
705
+ }
706
+ return res
707
+ },
708
+
709
+ /**
710
+ * Convert the object to a ViewModel constructor
711
+ * if it is not already one
712
+ */
713
+ toConstructor: function (obj) {
714
+ ViewModel = ViewModel || require('./viewmodel')
715
+ return utils.isObject(obj)
716
+ ? ViewModel.extend(obj)
717
+ : typeof obj === 'function'
718
+ ? obj
719
+ : null
720
+ },
721
+
722
+ /**
723
+ * Check if a filter function contains references to `this`
724
+ * If yes, mark it as a computed filter.
725
+ */
726
+ checkFilter: function (filter) {
727
+ if (THIS_RE.test(filter.toString())) {
728
+ filter.computed = true
729
+ }
730
+ },
731
+
732
+ /**
733
+ * convert certain option values to the desired format.
734
+ */
735
+ processOptions: function (options) {
736
+ var components = options.components,
737
+ partials = options.partials,
738
+ template = options.template,
739
+ filters = options.filters,
740
+ key
741
+ if (components) {
742
+ for (key in components) {
743
+ components[key] = utils.toConstructor(components[key])
744
+ }
745
+ }
746
+ if (partials) {
747
+ for (key in partials) {
748
+ partials[key] = utils.toFragment(partials[key])
749
+ }
750
+ }
751
+ if (filters) {
752
+ for (key in filters) {
753
+ utils.checkFilter(filters[key])
754
+ }
755
+ }
756
+ if (template) {
757
+ options.template = utils.toFragment(template)
758
+ }
759
+ },
760
+
761
+ /**
762
+ * used to defer batch updates
763
+ */
764
+ nextTick: function (cb) {
765
+ defer(cb, 0)
766
+ },
767
+
768
+ /**
769
+ * add class for IE9
770
+ * uses classList if available
771
+ */
772
+ addClass: function (el, cls) {
773
+ if (hasClassList) {
774
+ el.classList.add(cls)
775
+ } else {
776
+ var cur = ' ' + el.className + ' '
777
+ if (cur.indexOf(' ' + cls + ' ') < 0) {
778
+ el.className = (cur + cls).trim()
779
+ }
780
+ }
781
+ },
782
+
783
+ /**
784
+ * remove class for IE9
785
+ */
786
+ removeClass: function (el, cls) {
787
+ if (hasClassList) {
788
+ el.classList.remove(cls)
789
+ } else {
790
+ var cur = ' ' + el.className + ' ',
791
+ tar = ' ' + cls + ' '
792
+ while (cur.indexOf(tar) >= 0) {
793
+ cur = cur.replace(tar, ' ')
794
+ }
795
+ el.className = cur.trim()
796
+ }
797
+ },
798
+
799
+ /**
800
+ * Convert an object to Array
801
+ * used in v-repeat and array filters
802
+ */
803
+ objectToArray: function (obj) {
804
+ var res = [], val, data
805
+ for (var key in obj) {
806
+ val = obj[key]
807
+ data = utils.isObject(val)
808
+ ? val
809
+ : { $value: val }
810
+ data.$key = key
811
+ res.push(data)
812
+ }
813
+ return res
814
+ }
815
+ }
816
+
817
+ enableDebug()
818
+ function enableDebug () {
819
+ /**
820
+ * log for debugging
821
+ */
822
+ utils.log = function (msg) {
823
+ if (config.debug && console) {
824
+ console.log(msg)
825
+ }
826
+ }
827
+
828
+ /**
829
+ * warnings, traces by default
830
+ * can be suppressed by `silent` option.
831
+ */
832
+ utils.warn = function (msg) {
833
+ if (!config.silent && console) {
834
+ console.warn(msg)
835
+ if (config.debug && console.trace) {
836
+ console.trace()
837
+ }
838
+ }
839
+ }
840
+ }
841
+ });
842
+ require.register("vue/src/fragment.js", function(exports, require, module){
843
+ // string -> DOM conversion
844
+ // wrappers originally from jQuery, scooped from component/domify
845
+ var map = {
846
+ legend : [1, '<fieldset>', '</fieldset>'],
847
+ tr : [2, '<table><tbody>', '</tbody></table>'],
848
+ col : [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
849
+ _default : [0, '', '']
850
+ }
851
+
852
+ map.td =
853
+ map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>']
854
+
855
+ map.option =
856
+ map.optgroup = [1, '<select multiple="multiple">', '</select>']
857
+
858
+ map.thead =
859
+ map.tbody =
860
+ map.colgroup =
861
+ map.caption =
862
+ map.tfoot = [1, '<table>', '</table>']
863
+
864
+ map.text =
865
+ map.circle =
866
+ map.ellipse =
867
+ map.line =
868
+ map.path =
869
+ map.polygon =
870
+ map.polyline =
871
+ map.rect = [1, '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">','</svg>']
872
+
873
+ var TAG_RE = /<([\w:]+)/
874
+
875
+ module.exports = function (template) {
876
+
877
+ if (typeof template !== 'string') {
878
+ return template
879
+ }
880
+
881
+ // template by ID
882
+ if (template.charAt(0) === '#') {
883
+ var templateNode = document.getElementById(template.slice(1))
884
+ if (!templateNode) return
885
+ // if its a template tag and the browser supports it,
886
+ // its content is already a document fragment!
887
+ if (templateNode.tagName === 'TEMPLATE' && templateNode.content) {
888
+ return templateNode.content
889
+ }
890
+ template = templateNode.innerHTML
891
+ }
892
+
893
+ var frag = document.createDocumentFragment(),
894
+ m = TAG_RE.exec(template)
895
+ // text only
896
+ if (!m) {
897
+ frag.appendChild(document.createTextNode(template))
898
+ return frag
899
+ }
900
+
901
+ var tag = m[1],
902
+ wrap = map[tag] || map._default,
903
+ depth = wrap[0],
904
+ prefix = wrap[1],
905
+ suffix = wrap[2],
906
+ node = document.createElement('div')
907
+
908
+ node.innerHTML = prefix + template.trim() + suffix
909
+ while (depth--) node = node.lastChild
910
+
911
+ // one element
912
+ if (node.firstChild === node.lastChild) {
913
+ frag.appendChild(node.firstChild)
914
+ return frag
915
+ }
916
+
917
+ // multiple nodes, return a fragment
918
+ var child
919
+ /* jshint boss: true */
920
+ while (child = node.firstChild) {
921
+ if (node.nodeType === 1) {
922
+ frag.appendChild(child)
923
+ }
924
+ }
925
+ return frag
926
+ }
927
+ });
928
+ require.register("vue/src/compiler.js", function(exports, require, module){
929
+ var Emitter = require('./emitter'),
930
+ Observer = require('./observer'),
931
+ config = require('./config'),
932
+ utils = require('./utils'),
933
+ Binding = require('./binding'),
934
+ Directive = require('./directive'),
935
+ TextParser = require('./text-parser'),
936
+ DepsParser = require('./deps-parser'),
937
+ ExpParser = require('./exp-parser'),
938
+ ViewModel,
939
+
940
+ // cache methods
941
+ slice = [].slice,
942
+ extend = utils.extend,
943
+ hasOwn = ({}).hasOwnProperty,
944
+ def = Object.defineProperty,
945
+
946
+ // hooks to register
947
+ hooks = [
948
+ 'created', 'ready',
949
+ 'beforeDestroy', 'afterDestroy',
950
+ 'attached', 'detached'
951
+ ],
952
+
953
+ // list of priority directives
954
+ // that needs to be checked in specific order
955
+ priorityDirectives = [
956
+ 'if',
957
+ 'repeat',
958
+ 'view',
959
+ 'component'
960
+ ]
961
+
962
+ /**
963
+ * The DOM compiler
964
+ * scans a DOM node and compile bindings for a ViewModel
965
+ */
966
+ function Compiler (vm, options) {
967
+
968
+ var compiler = this,
969
+ key, i
970
+
971
+ // default state
972
+ compiler.init = true
973
+ compiler.destroyed = false
974
+
975
+ // process and extend options
976
+ options = compiler.options = options || {}
977
+ utils.processOptions(options)
978
+
979
+ // copy compiler options
980
+ extend(compiler, options.compilerOptions)
981
+ // repeat indicates this is a v-repeat instance
982
+ compiler.repeat = compiler.repeat || false
983
+ // expCache will be shared between v-repeat instances
984
+ compiler.expCache = compiler.expCache || {}
985
+
986
+ // initialize element
987
+ var el = compiler.el = compiler.setupElement(options)
988
+ utils.log('\nnew VM instance: ' + el.tagName + '\n')
989
+
990
+ // set other compiler properties
991
+ compiler.vm = el.vue_vm = vm
992
+ compiler.bindings = utils.hash()
993
+ compiler.dirs = []
994
+ compiler.deferred = []
995
+ compiler.computed = []
996
+ compiler.children = []
997
+ compiler.emitter = new Emitter(vm)
998
+
999
+ // VM ---------------------------------------------------------------------
1000
+
1001
+ // set VM properties
1002
+ vm.$ = {}
1003
+ vm.$el = el
1004
+ vm.$options = options
1005
+ vm.$compiler = compiler
1006
+ vm.$event = null
1007
+
1008
+ // set parent & root
1009
+ var parentVM = options.parent
1010
+ if (parentVM) {
1011
+ compiler.parent = parentVM.$compiler
1012
+ parentVM.$compiler.children.push(compiler)
1013
+ vm.$parent = parentVM
1014
+ // inherit lazy option
1015
+ if (!('lazy' in options)) {
1016
+ options.lazy = compiler.parent.options.lazy
1017
+ }
1018
+ }
1019
+ vm.$root = getRoot(compiler).vm
1020
+
1021
+ // DATA -------------------------------------------------------------------
1022
+
1023
+ // setup observer
1024
+ // this is necesarry for all hooks and data observation events
1025
+ compiler.setupObserver()
1026
+
1027
+ // create bindings for computed properties
1028
+ if (options.methods) {
1029
+ for (key in options.methods) {
1030
+ compiler.createBinding(key)
1031
+ }
1032
+ }
1033
+
1034
+ // create bindings for methods
1035
+ if (options.computed) {
1036
+ for (key in options.computed) {
1037
+ compiler.createBinding(key)
1038
+ }
1039
+ }
1040
+
1041
+ // initialize data
1042
+ var data = compiler.data = options.data || {},
1043
+ defaultData = options.defaultData
1044
+ if (defaultData) {
1045
+ for (key in defaultData) {
1046
+ if (!hasOwn.call(data, key)) {
1047
+ data[key] = defaultData[key]
1048
+ }
1049
+ }
1050
+ }
1051
+
1052
+ // copy paramAttributes
1053
+ var params = options.paramAttributes
1054
+ if (params) {
1055
+ i = params.length
1056
+ while (i--) {
1057
+ data[params[i]] = utils.checkNumber(
1058
+ compiler.eval(
1059
+ el.getAttribute(params[i])
1060
+ )
1061
+ )
1062
+ }
1063
+ }
1064
+
1065
+ // copy data properties to vm
1066
+ // so user can access them in the created hook
1067
+ extend(vm, data)
1068
+ vm.$data = data
1069
+
1070
+ // beforeCompile hook
1071
+ compiler.execHook('created')
1072
+
1073
+ // the user might have swapped the data ...
1074
+ data = compiler.data = vm.$data
1075
+
1076
+ // user might also set some properties on the vm
1077
+ // in which case we should copy back to $data
1078
+ var vmProp
1079
+ for (key in vm) {
1080
+ vmProp = vm[key]
1081
+ if (
1082
+ key.charAt(0) !== '$' &&
1083
+ data[key] !== vmProp &&
1084
+ typeof vmProp !== 'function'
1085
+ ) {
1086
+ data[key] = vmProp
1087
+ }
1088
+ }
1089
+
1090
+ // now we can observe the data.
1091
+ // this will convert data properties to getter/setters
1092
+ // and emit the first batch of set events, which will
1093
+ // in turn create the corresponding bindings.
1094
+ compiler.observeData(data)
1095
+
1096
+ // COMPILE ----------------------------------------------------------------
1097
+
1098
+ // before compiling, resolve content insertion points
1099
+ if (options.template) {
1100
+ this.resolveContent()
1101
+ }
1102
+
1103
+ // now parse the DOM and bind directives.
1104
+ // During this stage, we will also create bindings for
1105
+ // encountered keypaths that don't have a binding yet.
1106
+ compiler.compile(el, true)
1107
+
1108
+ // Any directive that creates child VMs are deferred
1109
+ // so that when they are compiled, all bindings on the
1110
+ // parent VM have been created.
1111
+ i = compiler.deferred.length
1112
+ while (i--) {
1113
+ compiler.bindDirective(compiler.deferred[i])
1114
+ }
1115
+ compiler.deferred = null
1116
+
1117
+ // extract dependencies for computed properties.
1118
+ // this will evaluated all collected computed bindings
1119
+ // and collect get events that are emitted.
1120
+ if (this.computed.length) {
1121
+ DepsParser.parse(this.computed)
1122
+ }
1123
+
1124
+ // done!
1125
+ compiler.init = false
1126
+
1127
+ // post compile / ready hook
1128
+ compiler.execHook('ready')
1129
+ }
1130
+
1131
+ var CompilerProto = Compiler.prototype
1132
+
1133
+ /**
1134
+ * Initialize the VM/Compiler's element.
1135
+ * Fill it in with the template if necessary.
1136
+ */
1137
+ CompilerProto.setupElement = function (options) {
1138
+ // create the node first
1139
+ var el = typeof options.el === 'string'
1140
+ ? document.querySelector(options.el)
1141
+ : options.el || document.createElement(options.tagName || 'div')
1142
+
1143
+ var template = options.template,
1144
+ child, replacer, i, attr, attrs
1145
+
1146
+ if (template) {
1147
+ // collect anything already in there
1148
+ if (el.hasChildNodes()) {
1149
+ this.rawContent = document.createElement('div')
1150
+ /* jshint boss: true */
1151
+ while (child = el.firstChild) {
1152
+ this.rawContent.appendChild(child)
1153
+ }
1154
+ }
1155
+ // replace option: use the first node in
1156
+ // the template directly
1157
+ if (options.replace && template.firstChild === template.lastChild) {
1158
+ replacer = template.firstChild.cloneNode(true)
1159
+ if (el.parentNode) {
1160
+ el.parentNode.insertBefore(replacer, el)
1161
+ el.parentNode.removeChild(el)
1162
+ }
1163
+ // copy over attributes
1164
+ if (el.hasAttributes()) {
1165
+ i = el.attributes.length
1166
+ while (i--) {
1167
+ attr = el.attributes[i]
1168
+ replacer.setAttribute(attr.name, attr.value)
1169
+ }
1170
+ }
1171
+ // replace
1172
+ el = replacer
1173
+ } else {
1174
+ el.appendChild(template.cloneNode(true))
1175
+ }
1176
+
1177
+ }
1178
+
1179
+ // apply element options
1180
+ if (options.id) el.id = options.id
1181
+ if (options.className) el.className = options.className
1182
+ attrs = options.attributes
1183
+ if (attrs) {
1184
+ for (attr in attrs) {
1185
+ el.setAttribute(attr, attrs[attr])
1186
+ }
1187
+ }
1188
+
1189
+ return el
1190
+ }
1191
+
1192
+ /**
1193
+ * Deal with <content> insertion points
1194
+ * per the Web Components spec
1195
+ */
1196
+ CompilerProto.resolveContent = function () {
1197
+
1198
+ var outlets = slice.call(this.el.getElementsByTagName('content')),
1199
+ raw = this.rawContent,
1200
+ outlet, select, i, j, main
1201
+
1202
+ i = outlets.length
1203
+ if (i) {
1204
+ // first pass, collect corresponding content
1205
+ // for each outlet.
1206
+ while (i--) {
1207
+ outlet = outlets[i]
1208
+ if (raw) {
1209
+ select = outlet.getAttribute('select')
1210
+ if (select) { // select content
1211
+ outlet.content =
1212
+ slice.call(raw.querySelectorAll(select))
1213
+ } else { // default content
1214
+ main = outlet
1215
+ }
1216
+ } else { // fallback content
1217
+ outlet.content =
1218
+ slice.call(outlet.childNodes)
1219
+ }
1220
+ }
1221
+ // second pass, actually insert the contents
1222
+ for (i = 0, j = outlets.length; i < j; i++) {
1223
+ outlet = outlets[i]
1224
+ if (outlet === main) continue
1225
+ insert(outlet, outlet.content)
1226
+ }
1227
+ // finally insert the main content
1228
+ if (raw && main) {
1229
+ insert(main, slice.call(raw.childNodes))
1230
+ }
1231
+ }
1232
+
1233
+ function insert (outlet, contents) {
1234
+ var parent = outlet.parentNode,
1235
+ i = 0, j = contents.length
1236
+ for (; i < j; i++) {
1237
+ parent.insertBefore(contents[i], outlet)
1238
+ }
1239
+ parent.removeChild(outlet)
1240
+ }
1241
+
1242
+ this.rawContent = null
1243
+ }
1244
+
1245
+ /**
1246
+ * Setup observer.
1247
+ * The observer listens for get/set/mutate events on all VM
1248
+ * values/objects and trigger corresponding binding updates.
1249
+ * It also listens for lifecycle hooks.
1250
+ */
1251
+ CompilerProto.setupObserver = function () {
1252
+
1253
+ var compiler = this,
1254
+ bindings = compiler.bindings,
1255
+ options = compiler.options,
1256
+ observer = compiler.observer = new Emitter(compiler.vm)
1257
+
1258
+ // a hash to hold event proxies for each root level key
1259
+ // so they can be referenced and removed later
1260
+ observer.proxies = {}
1261
+
1262
+ // add own listeners which trigger binding updates
1263
+ observer
1264
+ .on('get', onGet)
1265
+ .on('set', onSet)
1266
+ .on('mutate', onSet)
1267
+
1268
+ // register hooks
1269
+ var i = hooks.length, j, hook, fns
1270
+ while (i--) {
1271
+ hook = hooks[i]
1272
+ fns = options[hook]
1273
+ if (Array.isArray(fns)) {
1274
+ j = fns.length
1275
+ // since hooks were merged with child at head,
1276
+ // we loop reversely.
1277
+ while (j--) {
1278
+ registerHook(hook, fns[j])
1279
+ }
1280
+ } else if (fns) {
1281
+ registerHook(hook, fns)
1282
+ }
1283
+ }
1284
+
1285
+ // broadcast attached/detached hooks
1286
+ observer
1287
+ .on('hook:attached', function () {
1288
+ broadcast(1)
1289
+ })
1290
+ .on('hook:detached', function () {
1291
+ broadcast(0)
1292
+ })
1293
+
1294
+ function onGet (key) {
1295
+ check(key)
1296
+ DepsParser.catcher.emit('get', bindings[key])
1297
+ }
1298
+
1299
+ function onSet (key, val, mutation) {
1300
+ observer.emit('change:' + key, val, mutation)
1301
+ check(key)
1302
+ bindings[key].update(val)
1303
+ }
1304
+
1305
+ function registerHook (hook, fn) {
1306
+ observer.on('hook:' + hook, function () {
1307
+ fn.call(compiler.vm)
1308
+ })
1309
+ }
1310
+
1311
+ function broadcast (event) {
1312
+ var children = compiler.children
1313
+ if (children) {
1314
+ var child, i = children.length
1315
+ while (i--) {
1316
+ child = children[i]
1317
+ if (child.el.parentNode) {
1318
+ event = 'hook:' + (event ? 'attached' : 'detached')
1319
+ child.observer.emit(event)
1320
+ child.emitter.emit(event)
1321
+ }
1322
+ }
1323
+ }
1324
+ }
1325
+
1326
+ function check (key) {
1327
+ if (!bindings[key]) {
1328
+ compiler.createBinding(key)
1329
+ }
1330
+ }
1331
+ }
1332
+
1333
+ CompilerProto.observeData = function (data) {
1334
+
1335
+ var compiler = this,
1336
+ observer = compiler.observer
1337
+
1338
+ // recursively observe nested properties
1339
+ Observer.observe(data, '', observer)
1340
+
1341
+ // also create binding for top level $data
1342
+ // so it can be used in templates too
1343
+ var $dataBinding = compiler.bindings['$data'] = new Binding(compiler, '$data')
1344
+ $dataBinding.update(data)
1345
+
1346
+ // allow $data to be swapped
1347
+ def(compiler.vm, '$data', {
1348
+ get: function () {
1349
+ compiler.observer.emit('get', '$data')
1350
+ return compiler.data
1351
+ },
1352
+ set: function (newData) {
1353
+ var oldData = compiler.data
1354
+ Observer.unobserve(oldData, '', observer)
1355
+ compiler.data = newData
1356
+ Observer.copyPaths(newData, oldData)
1357
+ Observer.observe(newData, '', observer)
1358
+ update()
1359
+ }
1360
+ })
1361
+
1362
+ // emit $data change on all changes
1363
+ observer
1364
+ .on('set', onSet)
1365
+ .on('mutate', onSet)
1366
+
1367
+ function onSet (key) {
1368
+ if (key !== '$data') update()
1369
+ }
1370
+
1371
+ function update () {
1372
+ $dataBinding.update(compiler.data)
1373
+ observer.emit('change:$data', compiler.data)
1374
+ }
1375
+ }
1376
+
1377
+ /**
1378
+ * Compile a DOM node (recursive)
1379
+ */
1380
+ CompilerProto.compile = function (node, root) {
1381
+ var nodeType = node.nodeType
1382
+ if (nodeType === 1 && node.tagName !== 'SCRIPT') { // a normal node
1383
+ this.compileElement(node, root)
1384
+ } else if (nodeType === 3 && config.interpolate) {
1385
+ this.compileTextNode(node)
1386
+ }
1387
+ }
1388
+
1389
+ /**
1390
+ * Check for a priority directive
1391
+ * If it is present and valid, return true to skip the rest
1392
+ */
1393
+ CompilerProto.checkPriorityDir = function (dirname, node, root) {
1394
+ var expression, directive, Ctor
1395
+ if (
1396
+ dirname === 'component' &&
1397
+ root !== true &&
1398
+ (Ctor = this.resolveComponent(node, undefined, true))
1399
+ ) {
1400
+ directive = this.parseDirective(dirname, '', node)
1401
+ directive.Ctor = Ctor
1402
+ } else {
1403
+ expression = utils.attr(node, dirname)
1404
+ directive = expression && this.parseDirective(dirname, expression, node)
1405
+ }
1406
+ if (directive) {
1407
+ if (root === true) {
1408
+ utils.warn(
1409
+ 'Directive v-' + dirname + ' cannot be used on an already instantiated ' +
1410
+ 'VM\'s root node. Use it from the parent\'s template instead.'
1411
+ )
1412
+ return
1413
+ }
1414
+ this.deferred.push(directive)
1415
+ return true
1416
+ }
1417
+ }
1418
+
1419
+ /**
1420
+ * Compile normal directives on a node
1421
+ */
1422
+ CompilerProto.compileElement = function (node, root) {
1423
+
1424
+ // textarea is pretty annoying
1425
+ // because its value creates childNodes which
1426
+ // we don't want to compile.
1427
+ if (node.tagName === 'TEXTAREA' && node.value) {
1428
+ node.value = this.eval(node.value)
1429
+ }
1430
+
1431
+ // only compile if this element has attributes
1432
+ // or its tagName contains a hyphen (which means it could
1433
+ // potentially be a custom element)
1434
+ if (node.hasAttributes() || node.tagName.indexOf('-') > -1) {
1435
+
1436
+ // skip anything with v-pre
1437
+ if (utils.attr(node, 'pre') !== null) {
1438
+ return
1439
+ }
1440
+
1441
+ var i, l, j, k
1442
+
1443
+ // check priority directives.
1444
+ // if any of them are present, it will take over the node with a childVM
1445
+ // so we can skip the rest
1446
+ for (i = 0, l = priorityDirectives.length; i < l; i++) {
1447
+ if (this.checkPriorityDir(priorityDirectives[i], node, root)) {
1448
+ return
1449
+ }
1450
+ }
1451
+
1452
+ // check transition & animation properties
1453
+ node.vue_trans = utils.attr(node, 'transition')
1454
+ node.vue_anim = utils.attr(node, 'animation')
1455
+ node.vue_effect = this.eval(utils.attr(node, 'effect'))
1456
+
1457
+ var prefix = config.prefix + '-',
1458
+ params = this.options.paramAttributes,
1459
+ attr, attrname, isDirective, exp, directives, directive, dirname
1460
+
1461
+ // v-with has special priority among the rest
1462
+ // it needs to pull in the value from the parent before
1463
+ // computed properties are evaluated, because at this stage
1464
+ // the computed properties have not set up their dependencies yet.
1465
+ if (root) {
1466
+ var withExp = utils.attr(node, 'with')
1467
+ if (withExp) {
1468
+ directives = this.parseDirective('with', withExp, node, true)
1469
+ for (j = 0, k = directives.length; j < k; j++) {
1470
+ this.bindDirective(directives[j], this.parent)
1471
+ }
1472
+ }
1473
+ }
1474
+
1475
+ var attrs = slice.call(node.attributes)
1476
+ for (i = 0, l = attrs.length; i < l; i++) {
1477
+
1478
+ attr = attrs[i]
1479
+ attrname = attr.name
1480
+ isDirective = false
1481
+
1482
+ if (attrname.indexOf(prefix) === 0) {
1483
+ // a directive - split, parse and bind it.
1484
+ isDirective = true
1485
+ dirname = attrname.slice(prefix.length)
1486
+ // build with multiple: true
1487
+ directives = this.parseDirective(dirname, attr.value, node, true)
1488
+ // loop through clauses (separated by ",")
1489
+ // inside each attribute
1490
+ for (j = 0, k = directives.length; j < k; j++) {
1491
+ this.bindDirective(directives[j])
1492
+ }
1493
+ } else if (config.interpolate) {
1494
+ // non directive attribute, check interpolation tags
1495
+ exp = TextParser.parseAttr(attr.value)
1496
+ if (exp) {
1497
+ directive = this.parseDirective('attr', exp, node)
1498
+ directive.arg = attrname
1499
+ if (params && params.indexOf(attrname) > -1) {
1500
+ // a param attribute... we should use the parent binding
1501
+ // to avoid circular updates like size={{size}}
1502
+ this.bindDirective(directive, this.parent)
1503
+ } else {
1504
+ this.bindDirective(directive)
1505
+ }
1506
+ }
1507
+ }
1508
+
1509
+ if (isDirective && dirname !== 'cloak') {
1510
+ node.removeAttribute(attrname)
1511
+ }
1512
+ }
1513
+
1514
+ }
1515
+
1516
+ // recursively compile childNodes
1517
+ if (node.hasChildNodes()) {
1518
+ slice.call(node.childNodes).forEach(this.compile, this)
1519
+ }
1520
+ }
1521
+
1522
+ /**
1523
+ * Compile a text node
1524
+ */
1525
+ CompilerProto.compileTextNode = function (node) {
1526
+
1527
+ var tokens = TextParser.parse(node.nodeValue)
1528
+ if (!tokens) return
1529
+ var el, token, directive
1530
+
1531
+ for (var i = 0, l = tokens.length; i < l; i++) {
1532
+
1533
+ token = tokens[i]
1534
+ directive = null
1535
+
1536
+ if (token.key) { // a binding
1537
+ if (token.key.charAt(0) === '>') { // a partial
1538
+ el = document.createComment('ref')
1539
+ directive = this.parseDirective('partial', token.key.slice(1), el)
1540
+ } else {
1541
+ if (!token.html) { // text binding
1542
+ el = document.createTextNode('')
1543
+ directive = this.parseDirective('text', token.key, el)
1544
+ } else { // html binding
1545
+ el = document.createComment(config.prefix + '-html')
1546
+ directive = this.parseDirective('html', token.key, el)
1547
+ }
1548
+ }
1549
+ } else { // a plain string
1550
+ el = document.createTextNode(token)
1551
+ }
1552
+
1553
+ // insert node
1554
+ node.parentNode.insertBefore(el, node)
1555
+ // bind directive
1556
+ this.bindDirective(directive)
1557
+
1558
+ }
1559
+ node.parentNode.removeChild(node)
1560
+ }
1561
+
1562
+ /**
1563
+ * Parse a directive name/value pair into one or more
1564
+ * directive instances
1565
+ */
1566
+ CompilerProto.parseDirective = function (name, value, el, multiple) {
1567
+ var compiler = this,
1568
+ definition = compiler.getOption('directives', name)
1569
+ if (definition) {
1570
+ // parse into AST-like objects
1571
+ var asts = Directive.parse(value)
1572
+ return multiple
1573
+ ? asts.map(build)
1574
+ : build(asts[0])
1575
+ }
1576
+ function build (ast) {
1577
+ return new Directive(name, ast, definition, compiler, el)
1578
+ }
1579
+ }
1580
+
1581
+ /**
1582
+ * Add a directive instance to the correct binding & viewmodel
1583
+ */
1584
+ CompilerProto.bindDirective = function (directive, bindingOwner) {
1585
+
1586
+ if (!directive) return
1587
+
1588
+ // keep track of it so we can unbind() later
1589
+ this.dirs.push(directive)
1590
+
1591
+ // for empty or literal directives, simply call its bind()
1592
+ // and we're done.
1593
+ if (directive.isEmpty || directive.isLiteral) {
1594
+ if (directive.bind) directive.bind()
1595
+ return
1596
+ }
1597
+
1598
+ // otherwise, we got more work to do...
1599
+ var binding,
1600
+ compiler = bindingOwner || this,
1601
+ key = directive.key
1602
+
1603
+ if (directive.isExp) {
1604
+ // expression bindings are always created on current compiler
1605
+ binding = compiler.createBinding(key, directive)
1606
+ } else {
1607
+ // recursively locate which compiler owns the binding
1608
+ while (compiler) {
1609
+ if (compiler.hasKey(key)) {
1610
+ break
1611
+ } else {
1612
+ compiler = compiler.parent
1613
+ }
1614
+ }
1615
+ compiler = compiler || this
1616
+ binding = compiler.bindings[key] || compiler.createBinding(key)
1617
+ }
1618
+ binding.dirs.push(directive)
1619
+ directive.binding = binding
1620
+
1621
+ var value = binding.val()
1622
+ // invoke bind hook if exists
1623
+ if (directive.bind) {
1624
+ directive.bind(value)
1625
+ }
1626
+ // set initial value
1627
+ directive.$update(value, true)
1628
+ }
1629
+
1630
+ /**
1631
+ * Create binding and attach getter/setter for a key to the viewmodel object
1632
+ */
1633
+ CompilerProto.createBinding = function (key, directive) {
1634
+
1635
+ utils.log(' created binding: ' + key)
1636
+
1637
+ var compiler = this,
1638
+ methods = compiler.options.methods,
1639
+ isExp = directive && directive.isExp,
1640
+ isFn = (directive && directive.isFn) || (methods && methods[key]),
1641
+ bindings = compiler.bindings,
1642
+ computed = compiler.options.computed,
1643
+ binding = new Binding(compiler, key, isExp, isFn)
1644
+
1645
+ if (isExp) {
1646
+ // expression bindings are anonymous
1647
+ compiler.defineExp(key, binding, directive)
1648
+ } else if (isFn) {
1649
+ bindings[key] = binding
1650
+ compiler.defineVmProp(key, binding, methods[key])
1651
+ } else {
1652
+ bindings[key] = binding
1653
+ if (binding.root) {
1654
+ // this is a root level binding. we need to define getter/setters for it.
1655
+ if (computed && computed[key]) {
1656
+ // computed property
1657
+ compiler.defineComputed(key, binding, computed[key])
1658
+ } else if (key.charAt(0) !== '$') {
1659
+ // normal property
1660
+ compiler.defineDataProp(key, binding)
1661
+ } else {
1662
+ // properties that start with $ are meta properties
1663
+ // they should be kept on the vm but not in the data object.
1664
+ compiler.defineVmProp(key, binding, compiler.data[key])
1665
+ delete compiler.data[key]
1666
+ }
1667
+ } else if (computed && computed[utils.baseKey(key)]) {
1668
+ // nested path on computed property
1669
+ compiler.defineExp(key, binding)
1670
+ } else {
1671
+ // ensure path in data so that computed properties that
1672
+ // access the path don't throw an error and can collect
1673
+ // dependencies
1674
+ Observer.ensurePath(compiler.data, key)
1675
+ var parentKey = key.slice(0, key.lastIndexOf('.'))
1676
+ if (!bindings[parentKey]) {
1677
+ // this is a nested value binding, but the binding for its parent
1678
+ // has not been created yet. We better create that one too.
1679
+ compiler.createBinding(parentKey)
1680
+ }
1681
+ }
1682
+ }
1683
+ return binding
1684
+ }
1685
+
1686
+ /**
1687
+ * Define the getter/setter to proxy a root-level
1688
+ * data property on the VM
1689
+ */
1690
+ CompilerProto.defineDataProp = function (key, binding) {
1691
+ var compiler = this,
1692
+ data = compiler.data,
1693
+ ob = data.__emitter__
1694
+
1695
+ // make sure the key is present in data
1696
+ // so it can be observed
1697
+ if (!(hasOwn.call(data, key))) {
1698
+ data[key] = undefined
1699
+ }
1700
+
1701
+ // if the data object is already observed, but the key
1702
+ // is not observed, we need to add it to the observed keys.
1703
+ if (ob && !(hasOwn.call(ob.values, key))) {
1704
+ Observer.convertKey(data, key)
1705
+ }
1706
+
1707
+ binding.value = data[key]
1708
+
1709
+ def(compiler.vm, key, {
1710
+ get: function () {
1711
+ return compiler.data[key]
1712
+ },
1713
+ set: function (val) {
1714
+ compiler.data[key] = val
1715
+ }
1716
+ })
1717
+ }
1718
+
1719
+ /**
1720
+ * Define a vm property, e.g. $index, $key, or mixin methods
1721
+ * which are bindable but only accessible on the VM,
1722
+ * not in the data.
1723
+ */
1724
+ CompilerProto.defineVmProp = function (key, binding, value) {
1725
+ var ob = this.observer
1726
+ binding.value = value
1727
+ def(this.vm, key, {
1728
+ get: function () {
1729
+ if (Observer.shouldGet) ob.emit('get', key)
1730
+ return binding.value
1731
+ },
1732
+ set: function (val) {
1733
+ ob.emit('set', key, val)
1734
+ }
1735
+ })
1736
+ }
1737
+
1738
+ /**
1739
+ * Define an expression binding, which is essentially
1740
+ * an anonymous computed property
1741
+ */
1742
+ CompilerProto.defineExp = function (key, binding, directive) {
1743
+ var computedKey = directive && directive.computedKey,
1744
+ exp = computedKey ? directive.expression : key,
1745
+ getter = this.expCache[exp]
1746
+ if (!getter) {
1747
+ getter = this.expCache[exp] = ExpParser.parse(computedKey || key, this)
1748
+ }
1749
+ if (getter) {
1750
+ this.markComputed(binding, getter)
1751
+ }
1752
+ }
1753
+
1754
+ /**
1755
+ * Define a computed property on the VM
1756
+ */
1757
+ CompilerProto.defineComputed = function (key, binding, value) {
1758
+ this.markComputed(binding, value)
1759
+ def(this.vm, key, {
1760
+ get: binding.value.$get,
1761
+ set: binding.value.$set
1762
+ })
1763
+ }
1764
+
1765
+ /**
1766
+ * Process a computed property binding
1767
+ * so its getter/setter are bound to proper context
1768
+ */
1769
+ CompilerProto.markComputed = function (binding, value) {
1770
+ binding.isComputed = true
1771
+ // bind the accessors to the vm
1772
+ if (binding.isFn) {
1773
+ binding.value = value
1774
+ } else {
1775
+ if (typeof value === 'function') {
1776
+ value = { $get: value }
1777
+ }
1778
+ binding.value = {
1779
+ $get: utils.bind(value.$get, this.vm),
1780
+ $set: value.$set
1781
+ ? utils.bind(value.$set, this.vm)
1782
+ : undefined
1783
+ }
1784
+ }
1785
+ // keep track for dep parsing later
1786
+ this.computed.push(binding)
1787
+ }
1788
+
1789
+ /**
1790
+ * Retrive an option from the compiler
1791
+ */
1792
+ CompilerProto.getOption = function (type, id, silent) {
1793
+ var opts = this.options,
1794
+ parent = this.parent,
1795
+ globalAssets = config.globalAssets,
1796
+ res = (opts[type] && opts[type][id]) || (
1797
+ parent
1798
+ ? parent.getOption(type, id, silent)
1799
+ : globalAssets[type] && globalAssets[type][id]
1800
+ )
1801
+ if (!res && !silent && typeof id === 'string') {
1802
+ utils.warn('Unknown ' + type.slice(0, -1) + ': ' + id)
1803
+ }
1804
+ return res
1805
+ }
1806
+
1807
+ /**
1808
+ * Emit lifecycle events to trigger hooks
1809
+ */
1810
+ CompilerProto.execHook = function (event) {
1811
+ event = 'hook:' + event
1812
+ this.observer.emit(event)
1813
+ this.emitter.emit(event)
1814
+ }
1815
+
1816
+ /**
1817
+ * Check if a compiler's data contains a keypath
1818
+ */
1819
+ CompilerProto.hasKey = function (key) {
1820
+ var baseKey = utils.baseKey(key)
1821
+ return hasOwn.call(this.data, baseKey) ||
1822
+ hasOwn.call(this.vm, baseKey)
1823
+ }
1824
+
1825
+ /**
1826
+ * Do a one-time eval of a string that potentially
1827
+ * includes bindings. It accepts additional raw data
1828
+ * because we need to dynamically resolve v-component
1829
+ * before a childVM is even compiled...
1830
+ */
1831
+ CompilerProto.eval = function (exp, data) {
1832
+ var parsed = TextParser.parseAttr(exp)
1833
+ return parsed
1834
+ ? ExpParser.eval(parsed, this, data)
1835
+ : exp
1836
+ }
1837
+
1838
+ /**
1839
+ * Resolve a Component constructor for an element
1840
+ * with the data to be used
1841
+ */
1842
+ CompilerProto.resolveComponent = function (node, data, test) {
1843
+
1844
+ // late require to avoid circular deps
1845
+ ViewModel = ViewModel || require('./viewmodel')
1846
+
1847
+ var exp = utils.attr(node, 'component'),
1848
+ tagName = node.tagName,
1849
+ id = this.eval(exp, data),
1850
+ tagId = (tagName.indexOf('-') > 0 && tagName.toLowerCase()),
1851
+ Ctor = this.getOption('components', id || tagId, true)
1852
+
1853
+ if (id && !Ctor) {
1854
+ utils.warn('Unknown component: ' + id)
1855
+ }
1856
+
1857
+ return test
1858
+ ? exp === ''
1859
+ ? ViewModel
1860
+ : Ctor
1861
+ : Ctor || ViewModel
1862
+ }
1863
+
1864
+ /**
1865
+ * Unbind and remove element
1866
+ */
1867
+ CompilerProto.destroy = function (noRemove) {
1868
+
1869
+ // avoid being called more than once
1870
+ // this is irreversible!
1871
+ if (this.destroyed) return
1872
+
1873
+ var compiler = this,
1874
+ i, j, key, dir, dirs, binding,
1875
+ vm = compiler.vm,
1876
+ el = compiler.el,
1877
+ directives = compiler.dirs,
1878
+ computed = compiler.computed,
1879
+ bindings = compiler.bindings,
1880
+ children = compiler.children,
1881
+ parent = compiler.parent
1882
+
1883
+ compiler.execHook('beforeDestroy')
1884
+
1885
+ // unobserve data
1886
+ Observer.unobserve(compiler.data, '', compiler.observer)
1887
+
1888
+ // destroy all children
1889
+ // do not remove their elements since the parent
1890
+ // may have transitions and the children may not
1891
+ i = children.length
1892
+ while (i--) {
1893
+ children[i].destroy(true)
1894
+ }
1895
+
1896
+ // unbind all direcitves
1897
+ i = directives.length
1898
+ while (i--) {
1899
+ dir = directives[i]
1900
+ // if this directive is an instance of an external binding
1901
+ // e.g. a directive that refers to a variable on the parent VM
1902
+ // we need to remove it from that binding's directives
1903
+ // * empty and literal bindings do not have binding.
1904
+ if (dir.binding && dir.binding.compiler !== compiler) {
1905
+ dirs = dir.binding.dirs
1906
+ if (dirs) {
1907
+ j = dirs.indexOf(dir)
1908
+ if (j > -1) dirs.splice(j, 1)
1909
+ }
1910
+ }
1911
+ dir.$unbind()
1912
+ }
1913
+
1914
+ // unbind all computed, anonymous bindings
1915
+ i = computed.length
1916
+ while (i--) {
1917
+ computed[i].unbind()
1918
+ }
1919
+
1920
+ // unbind all keypath bindings
1921
+ for (key in bindings) {
1922
+ binding = bindings[key]
1923
+ if (binding) {
1924
+ binding.unbind()
1925
+ }
1926
+ }
1927
+
1928
+ // remove self from parent
1929
+ if (parent) {
1930
+ j = parent.children.indexOf(compiler)
1931
+ if (j > -1) parent.children.splice(j, 1)
1932
+ }
1933
+
1934
+ // finally remove dom element
1935
+ if (!noRemove) {
1936
+ if (el === document.body) {
1937
+ el.innerHTML = ''
1938
+ } else {
1939
+ vm.$remove()
1940
+ }
1941
+ }
1942
+ el.vue_vm = null
1943
+
1944
+ compiler.destroyed = true
1945
+ // emit destroy hook
1946
+ compiler.execHook('afterDestroy')
1947
+
1948
+ // finally, unregister all listeners
1949
+ compiler.observer.off()
1950
+ compiler.emitter.off()
1951
+ }
1952
+
1953
+ // Helpers --------------------------------------------------------------------
1954
+
1955
+ /**
1956
+ * shorthand for getting root compiler
1957
+ */
1958
+ function getRoot (compiler) {
1959
+ while (compiler.parent) {
1960
+ compiler = compiler.parent
1961
+ }
1962
+ return compiler
1963
+ }
1964
+
1965
+ module.exports = Compiler
1966
+ });
1967
+ require.register("vue/src/viewmodel.js", function(exports, require, module){
1968
+ var Compiler = require('./compiler'),
1969
+ utils = require('./utils'),
1970
+ transition = require('./transition'),
1971
+ Batcher = require('./batcher'),
1972
+ slice = [].slice,
1973
+ def = utils.defProtected,
1974
+ nextTick = utils.nextTick,
1975
+
1976
+ // batch $watch callbacks
1977
+ watcherBatcher = new Batcher(),
1978
+ watcherId = 1
1979
+
1980
+ /**
1981
+ * ViewModel exposed to the user that holds data,
1982
+ * computed properties, event handlers
1983
+ * and a few reserved methods
1984
+ */
1985
+ function ViewModel (options) {
1986
+ // just compile. options are passed directly to compiler
1987
+ new Compiler(this, options)
1988
+ }
1989
+
1990
+ // All VM prototype methods are inenumerable
1991
+ // so it can be stringified/looped through as raw data
1992
+ var VMProto = ViewModel.prototype
1993
+
1994
+ /**
1995
+ * Convenience function to get a value from
1996
+ * a keypath
1997
+ */
1998
+ def(VMProto, '$get', function (key) {
1999
+ var val = utils.get(this, key)
2000
+ return val === undefined && this.$parent
2001
+ ? this.$parent.$get(key)
2002
+ : val
2003
+ })
2004
+
2005
+ /**
2006
+ * Convenience function to set an actual nested value
2007
+ * from a flat key string. Used in directives.
2008
+ */
2009
+ def(VMProto, '$set', function (key, value) {
2010
+ utils.set(this, key, value)
2011
+ })
2012
+
2013
+ /**
2014
+ * watch a key on the viewmodel for changes
2015
+ * fire callback with new value
2016
+ */
2017
+ def(VMProto, '$watch', function (key, callback) {
2018
+ // save a unique id for each watcher
2019
+ var id = watcherId++,
2020
+ self = this
2021
+ function on () {
2022
+ var args = slice.call(arguments)
2023
+ watcherBatcher.push({
2024
+ id: id,
2025
+ override: true,
2026
+ execute: function () {
2027
+ callback.apply(self, args)
2028
+ }
2029
+ })
2030
+ }
2031
+ callback._fn = on
2032
+ self.$compiler.observer.on('change:' + key, on)
2033
+ })
2034
+
2035
+ /**
2036
+ * unwatch a key
2037
+ */
2038
+ def(VMProto, '$unwatch', function (key, callback) {
2039
+ // workaround here
2040
+ // since the emitter module checks callback existence
2041
+ // by checking the length of arguments
2042
+ var args = ['change:' + key],
2043
+ ob = this.$compiler.observer
2044
+ if (callback) args.push(callback._fn)
2045
+ ob.off.apply(ob, args)
2046
+ })
2047
+
2048
+ /**
2049
+ * unbind everything, remove everything
2050
+ */
2051
+ def(VMProto, '$destroy', function () {
2052
+ this.$compiler.destroy()
2053
+ })
2054
+
2055
+ /**
2056
+ * broadcast an event to all child VMs recursively.
2057
+ */
2058
+ def(VMProto, '$broadcast', function () {
2059
+ var children = this.$compiler.children,
2060
+ i = children.length,
2061
+ child
2062
+ while (i--) {
2063
+ child = children[i]
2064
+ child.emitter.applyEmit.apply(child.emitter, arguments)
2065
+ child.vm.$broadcast.apply(child.vm, arguments)
2066
+ }
2067
+ })
2068
+
2069
+ /**
2070
+ * emit an event that propagates all the way up to parent VMs.
2071
+ */
2072
+ def(VMProto, '$dispatch', function () {
2073
+ var compiler = this.$compiler,
2074
+ emitter = compiler.emitter,
2075
+ parent = compiler.parent
2076
+ emitter.applyEmit.apply(emitter, arguments)
2077
+ if (parent) {
2078
+ parent.vm.$dispatch.apply(parent.vm, arguments)
2079
+ }
2080
+ })
2081
+
2082
+ /**
2083
+ * delegate on/off/once to the compiler's emitter
2084
+ */
2085
+ ;['emit', 'on', 'off', 'once'].forEach(function (method) {
2086
+ // internal emit has fixed number of arguments.
2087
+ // exposed emit uses the external version
2088
+ // with fn.apply.
2089
+ var realMethod = method === 'emit'
2090
+ ? 'applyEmit'
2091
+ : method
2092
+ def(VMProto, '$' + method, function () {
2093
+ var emitter = this.$compiler.emitter
2094
+ emitter[realMethod].apply(emitter, arguments)
2095
+ })
2096
+ })
2097
+
2098
+ // DOM convenience methods
2099
+
2100
+ def(VMProto, '$appendTo', function (target, cb) {
2101
+ target = query(target)
2102
+ var el = this.$el
2103
+ transition(el, 1, function () {
2104
+ target.appendChild(el)
2105
+ if (cb) nextTick(cb)
2106
+ }, this.$compiler)
2107
+ })
2108
+
2109
+ def(VMProto, '$remove', function (cb) {
2110
+ var el = this.$el
2111
+ transition(el, -1, function () {
2112
+ if (el.parentNode) {
2113
+ el.parentNode.removeChild(el)
2114
+ }
2115
+ if (cb) nextTick(cb)
2116
+ }, this.$compiler)
2117
+ })
2118
+
2119
+ def(VMProto, '$before', function (target, cb) {
2120
+ target = query(target)
2121
+ var el = this.$el
2122
+ transition(el, 1, function () {
2123
+ target.parentNode.insertBefore(el, target)
2124
+ if (cb) nextTick(cb)
2125
+ }, this.$compiler)
2126
+ })
2127
+
2128
+ def(VMProto, '$after', function (target, cb) {
2129
+ target = query(target)
2130
+ var el = this.$el
2131
+ transition(el, 1, function () {
2132
+ if (target.nextSibling) {
2133
+ target.parentNode.insertBefore(el, target.nextSibling)
2134
+ } else {
2135
+ target.parentNode.appendChild(el)
2136
+ }
2137
+ if (cb) nextTick(cb)
2138
+ }, this.$compiler)
2139
+ })
2140
+
2141
+ function query (el) {
2142
+ return typeof el === 'string'
2143
+ ? document.querySelector(el)
2144
+ : el
2145
+ }
2146
+
2147
+ module.exports = ViewModel
2148
+ });
2149
+ require.register("vue/src/binding.js", function(exports, require, module){
2150
+ var Batcher = require('./batcher'),
2151
+ bindingBatcher = new Batcher(),
2152
+ bindingId = 1
2153
+
2154
+ /**
2155
+ * Binding class.
2156
+ *
2157
+ * each property on the viewmodel has one corresponding Binding object
2158
+ * which has multiple directive instances on the DOM
2159
+ * and multiple computed property dependents
2160
+ */
2161
+ function Binding (compiler, key, isExp, isFn) {
2162
+ this.id = bindingId++
2163
+ this.value = undefined
2164
+ this.isExp = !!isExp
2165
+ this.isFn = isFn
2166
+ this.root = !this.isExp && key.indexOf('.') === -1
2167
+ this.compiler = compiler
2168
+ this.key = key
2169
+ this.dirs = []
2170
+ this.subs = []
2171
+ this.deps = []
2172
+ this.unbound = false
2173
+ }
2174
+
2175
+ var BindingProto = Binding.prototype
2176
+
2177
+ /**
2178
+ * Update value and queue instance updates.
2179
+ */
2180
+ BindingProto.update = function (value) {
2181
+ if (!this.isComputed || this.isFn) {
2182
+ this.value = value
2183
+ }
2184
+ if (this.dirs.length || this.subs.length) {
2185
+ var self = this
2186
+ bindingBatcher.push({
2187
+ id: this.id,
2188
+ execute: function () {
2189
+ if (!self.unbound) {
2190
+ self._update()
2191
+ }
2192
+ }
2193
+ })
2194
+ }
2195
+ }
2196
+
2197
+ /**
2198
+ * Actually update the directives.
2199
+ */
2200
+ BindingProto._update = function () {
2201
+ var i = this.dirs.length,
2202
+ value = this.val()
2203
+ while (i--) {
2204
+ this.dirs[i].$update(value)
2205
+ }
2206
+ this.pub()
2207
+ }
2208
+
2209
+ /**
2210
+ * Return the valuated value regardless
2211
+ * of whether it is computed or not
2212
+ */
2213
+ BindingProto.val = function () {
2214
+ return this.isComputed && !this.isFn
2215
+ ? this.value.$get()
2216
+ : this.value
2217
+ }
2218
+
2219
+ /**
2220
+ * Notify computed properties that depend on this binding
2221
+ * to update themselves
2222
+ */
2223
+ BindingProto.pub = function () {
2224
+ var i = this.subs.length
2225
+ while (i--) {
2226
+ this.subs[i].update()
2227
+ }
2228
+ }
2229
+
2230
+ /**
2231
+ * Unbind the binding, remove itself from all of its dependencies
2232
+ */
2233
+ BindingProto.unbind = function () {
2234
+ // Indicate this has been unbound.
2235
+ // It's possible this binding will be in
2236
+ // the batcher's flush queue when its owner
2237
+ // compiler has already been destroyed.
2238
+ this.unbound = true
2239
+ var i = this.dirs.length
2240
+ while (i--) {
2241
+ this.dirs[i].$unbind()
2242
+ }
2243
+ i = this.deps.length
2244
+ var subs
2245
+ while (i--) {
2246
+ subs = this.deps[i].subs
2247
+ var j = subs.indexOf(this)
2248
+ if (j > -1) subs.splice(j, 1)
2249
+ }
2250
+ }
2251
+
2252
+ module.exports = Binding
2253
+ });
2254
+ require.register("vue/src/observer.js", function(exports, require, module){
2255
+ /* jshint proto:true */
2256
+
2257
+ var Emitter = require('./emitter'),
2258
+ utils = require('./utils'),
2259
+ // cache methods
2260
+ def = utils.defProtected,
2261
+ isObject = utils.isObject,
2262
+ isArray = Array.isArray,
2263
+ hasOwn = ({}).hasOwnProperty,
2264
+ oDef = Object.defineProperty,
2265
+ slice = [].slice,
2266
+ // fix for IE + __proto__ problem
2267
+ // define methods as inenumerable if __proto__ is present,
2268
+ // otherwise enumerable so we can loop through and manually
2269
+ // attach to array instances
2270
+ hasProto = ({}).__proto__
2271
+
2272
+ // Array Mutation Handlers & Augmentations ------------------------------------
2273
+
2274
+ // The proxy prototype to replace the __proto__ of
2275
+ // an observed array
2276
+ var ArrayProxy = Object.create(Array.prototype)
2277
+
2278
+ // intercept mutation methods
2279
+ ;[
2280
+ 'push',
2281
+ 'pop',
2282
+ 'shift',
2283
+ 'unshift',
2284
+ 'splice',
2285
+ 'sort',
2286
+ 'reverse'
2287
+ ].forEach(watchMutation)
2288
+
2289
+ // Augment the ArrayProxy with convenience methods
2290
+ def(ArrayProxy, '$set', function (index, data) {
2291
+ return this.splice(index, 1, data)[0]
2292
+ }, !hasProto)
2293
+
2294
+ def(ArrayProxy, '$remove', function (index) {
2295
+ if (typeof index !== 'number') {
2296
+ index = this.indexOf(index)
2297
+ }
2298
+ if (index > -1) {
2299
+ return this.splice(index, 1)[0]
2300
+ }
2301
+ }, !hasProto)
2302
+
2303
+ /**
2304
+ * Intercep a mutation event so we can emit the mutation info.
2305
+ * we also analyze what elements are added/removed and link/unlink
2306
+ * them with the parent Array.
2307
+ */
2308
+ function watchMutation (method) {
2309
+ def(ArrayProxy, method, function () {
2310
+
2311
+ var args = slice.call(arguments),
2312
+ result = Array.prototype[method].apply(this, args),
2313
+ inserted, removed
2314
+
2315
+ // determine new / removed elements
2316
+ if (method === 'push' || method === 'unshift') {
2317
+ inserted = args
2318
+ } else if (method === 'pop' || method === 'shift') {
2319
+ removed = [result]
2320
+ } else if (method === 'splice') {
2321
+ inserted = args.slice(2)
2322
+ removed = result
2323
+ }
2324
+
2325
+ // link & unlink
2326
+ linkArrayElements(this, inserted)
2327
+ unlinkArrayElements(this, removed)
2328
+
2329
+ // emit the mutation event
2330
+ this.__emitter__.emit('mutate', '', this, {
2331
+ method : method,
2332
+ args : args,
2333
+ result : result,
2334
+ inserted : inserted,
2335
+ removed : removed
2336
+ })
2337
+
2338
+ return result
2339
+
2340
+ }, !hasProto)
2341
+ }
2342
+
2343
+ /**
2344
+ * Link new elements to an Array, so when they change
2345
+ * and emit events, the owner Array can be notified.
2346
+ */
2347
+ function linkArrayElements (arr, items) {
2348
+ if (items) {
2349
+ var i = items.length, item, owners
2350
+ while (i--) {
2351
+ item = items[i]
2352
+ if (isWatchable(item)) {
2353
+ // if object is not converted for observing
2354
+ // convert it...
2355
+ if (!item.__emitter__) {
2356
+ convert(item)
2357
+ watch(item)
2358
+ }
2359
+ owners = item.__emitter__.owners
2360
+ if (owners.indexOf(arr) < 0) {
2361
+ owners.push(arr)
2362
+ }
2363
+ }
2364
+ }
2365
+ }
2366
+ }
2367
+
2368
+ /**
2369
+ * Unlink removed elements from the ex-owner Array.
2370
+ */
2371
+ function unlinkArrayElements (arr, items) {
2372
+ if (items) {
2373
+ var i = items.length, item
2374
+ while (i--) {
2375
+ item = items[i]
2376
+ if (item && item.__emitter__) {
2377
+ var owners = item.__emitter__.owners
2378
+ if (owners) owners.splice(owners.indexOf(arr))
2379
+ }
2380
+ }
2381
+ }
2382
+ }
2383
+
2384
+ // Object add/delete key augmentation -----------------------------------------
2385
+
2386
+ var ObjProxy = Object.create(Object.prototype)
2387
+
2388
+ def(ObjProxy, '$add', function (key, val) {
2389
+ if (hasOwn.call(this, key)) return
2390
+ this[key] = val
2391
+ convertKey(this, key, true)
2392
+ }, !hasProto)
2393
+
2394
+ def(ObjProxy, '$delete', function (key) {
2395
+ if (!(hasOwn.call(this, key))) return
2396
+ // trigger set events
2397
+ this[key] = undefined
2398
+ delete this[key]
2399
+ this.__emitter__.emit('delete', key)
2400
+ }, !hasProto)
2401
+
2402
+ // Watch Helpers --------------------------------------------------------------
2403
+
2404
+ /**
2405
+ * Check if a value is watchable
2406
+ */
2407
+ function isWatchable (obj) {
2408
+ return typeof obj === 'object' && obj && !obj.$compiler
2409
+ }
2410
+
2411
+ /**
2412
+ * Convert an Object/Array to give it a change emitter.
2413
+ */
2414
+ function convert (obj) {
2415
+ if (obj.__emitter__) return true
2416
+ var emitter = new Emitter()
2417
+ def(obj, '__emitter__', emitter)
2418
+ emitter
2419
+ .on('set', function (key, val, propagate) {
2420
+ if (propagate) propagateChange(obj)
2421
+ })
2422
+ .on('mutate', function () {
2423
+ propagateChange(obj)
2424
+ })
2425
+ emitter.values = utils.hash()
2426
+ emitter.owners = []
2427
+ return false
2428
+ }
2429
+
2430
+ /**
2431
+ * Propagate an array element's change to its owner arrays
2432
+ */
2433
+ function propagateChange (obj) {
2434
+ var owners = obj.__emitter__.owners,
2435
+ i = owners.length
2436
+ while (i--) {
2437
+ owners[i].__emitter__.emit('set', '', '', true)
2438
+ }
2439
+ }
2440
+
2441
+ /**
2442
+ * Watch target based on its type
2443
+ */
2444
+ function watch (obj) {
2445
+ if (isArray(obj)) {
2446
+ watchArray(obj)
2447
+ } else {
2448
+ watchObject(obj)
2449
+ }
2450
+ }
2451
+
2452
+ /**
2453
+ * Augment target objects with modified
2454
+ * methods
2455
+ */
2456
+ function augment (target, src) {
2457
+ if (hasProto) {
2458
+ target.__proto__ = src
2459
+ } else {
2460
+ for (var key in src) {
2461
+ def(target, key, src[key])
2462
+ }
2463
+ }
2464
+ }
2465
+
2466
+ /**
2467
+ * Watch an Object, recursive.
2468
+ */
2469
+ function watchObject (obj) {
2470
+ augment(obj, ObjProxy)
2471
+ for (var key in obj) {
2472
+ convertKey(obj, key)
2473
+ }
2474
+ }
2475
+
2476
+ /**
2477
+ * Watch an Array, overload mutation methods
2478
+ * and add augmentations by intercepting the prototype chain
2479
+ */
2480
+ function watchArray (arr) {
2481
+ augment(arr, ArrayProxy)
2482
+ linkArrayElements(arr, arr)
2483
+ }
2484
+
2485
+ /**
2486
+ * Define accessors for a property on an Object
2487
+ * so it emits get/set events.
2488
+ * Then watch the value itself.
2489
+ */
2490
+ function convertKey (obj, key, propagate) {
2491
+ var keyPrefix = key.charAt(0)
2492
+ if (keyPrefix === '$' || keyPrefix === '_') {
2493
+ return
2494
+ }
2495
+ // emit set on bind
2496
+ // this means when an object is observed it will emit
2497
+ // a first batch of set events.
2498
+ var emitter = obj.__emitter__,
2499
+ values = emitter.values
2500
+
2501
+ init(obj[key], propagate)
2502
+
2503
+ oDef(obj, key, {
2504
+ enumerable: true,
2505
+ configurable: true,
2506
+ get: function () {
2507
+ var value = values[key]
2508
+ // only emit get on tip values
2509
+ if (pub.shouldGet) {
2510
+ emitter.emit('get', key)
2511
+ }
2512
+ return value
2513
+ },
2514
+ set: function (newVal) {
2515
+ var oldVal = values[key]
2516
+ unobserve(oldVal, key, emitter)
2517
+ copyPaths(newVal, oldVal)
2518
+ // an immediate property should notify its parent
2519
+ // to emit set for itself too
2520
+ init(newVal, true)
2521
+ }
2522
+ })
2523
+
2524
+ function init (val, propagate) {
2525
+ values[key] = val
2526
+ emitter.emit('set', key, val, propagate)
2527
+ if (isArray(val)) {
2528
+ emitter.emit('set', key + '.length', val.length, propagate)
2529
+ }
2530
+ observe(val, key, emitter)
2531
+ }
2532
+ }
2533
+
2534
+ /**
2535
+ * When a value that is already converted is
2536
+ * observed again by another observer, we can skip
2537
+ * the watch conversion and simply emit set event for
2538
+ * all of its properties.
2539
+ */
2540
+ function emitSet (obj) {
2541
+ var emitter = obj && obj.__emitter__
2542
+ if (!emitter) return
2543
+ if (isArray(obj)) {
2544
+ emitter.emit('set', 'length', obj.length)
2545
+ } else {
2546
+ var key, val
2547
+ for (key in obj) {
2548
+ val = obj[key]
2549
+ emitter.emit('set', key, val)
2550
+ emitSet(val)
2551
+ }
2552
+ }
2553
+ }
2554
+
2555
+ /**
2556
+ * Make sure all the paths in an old object exists
2557
+ * in a new object.
2558
+ * So when an object changes, all missing keys will
2559
+ * emit a set event with undefined value.
2560
+ */
2561
+ function copyPaths (newObj, oldObj) {
2562
+ if (!isObject(newObj) || !isObject(oldObj)) {
2563
+ return
2564
+ }
2565
+ var path, oldVal, newVal
2566
+ for (path in oldObj) {
2567
+ if (!(hasOwn.call(newObj, path))) {
2568
+ oldVal = oldObj[path]
2569
+ if (isArray(oldVal)) {
2570
+ newObj[path] = []
2571
+ } else if (isObject(oldVal)) {
2572
+ newVal = newObj[path] = {}
2573
+ copyPaths(newVal, oldVal)
2574
+ } else {
2575
+ newObj[path] = undefined
2576
+ }
2577
+ }
2578
+ }
2579
+ }
2580
+
2581
+ /**
2582
+ * walk along a path and make sure it can be accessed
2583
+ * and enumerated in that object
2584
+ */
2585
+ function ensurePath (obj, key) {
2586
+ var path = key.split('.'), sec
2587
+ for (var i = 0, d = path.length - 1; i < d; i++) {
2588
+ sec = path[i]
2589
+ if (!obj[sec]) {
2590
+ obj[sec] = {}
2591
+ if (obj.__emitter__) convertKey(obj, sec)
2592
+ }
2593
+ obj = obj[sec]
2594
+ }
2595
+ if (isObject(obj)) {
2596
+ sec = path[i]
2597
+ if (!(hasOwn.call(obj, sec))) {
2598
+ obj[sec] = undefined
2599
+ if (obj.__emitter__) convertKey(obj, sec)
2600
+ }
2601
+ }
2602
+ }
2603
+
2604
+ // Main API Methods -----------------------------------------------------------
2605
+
2606
+ /**
2607
+ * Observe an object with a given path,
2608
+ * and proxy get/set/mutate events to the provided observer.
2609
+ */
2610
+ function observe (obj, rawPath, observer) {
2611
+
2612
+ if (!isWatchable(obj)) return
2613
+
2614
+ var path = rawPath ? rawPath + '.' : '',
2615
+ alreadyConverted = convert(obj),
2616
+ emitter = obj.__emitter__
2617
+
2618
+ // setup proxy listeners on the parent observer.
2619
+ // we need to keep reference to them so that they
2620
+ // can be removed when the object is un-observed.
2621
+ observer.proxies = observer.proxies || {}
2622
+ var proxies = observer.proxies[path] = {
2623
+ get: function (key) {
2624
+ observer.emit('get', path + key)
2625
+ },
2626
+ set: function (key, val, propagate) {
2627
+ if (key) observer.emit('set', path + key, val)
2628
+ // also notify observer that the object itself changed
2629
+ // but only do so when it's a immediate property. this
2630
+ // avoids duplicate event firing.
2631
+ if (rawPath && propagate) {
2632
+ observer.emit('set', rawPath, obj, true)
2633
+ }
2634
+ },
2635
+ mutate: function (key, val, mutation) {
2636
+ // if the Array is a root value
2637
+ // the key will be null
2638
+ var fixedPath = key ? path + key : rawPath
2639
+ observer.emit('mutate', fixedPath, val, mutation)
2640
+ // also emit set for Array's length when it mutates
2641
+ var m = mutation.method
2642
+ if (m !== 'sort' && m !== 'reverse') {
2643
+ observer.emit('set', fixedPath + '.length', val.length)
2644
+ }
2645
+ }
2646
+ }
2647
+
2648
+ // attach the listeners to the child observer.
2649
+ // now all the events will propagate upwards.
2650
+ emitter
2651
+ .on('get', proxies.get)
2652
+ .on('set', proxies.set)
2653
+ .on('mutate', proxies.mutate)
2654
+
2655
+ if (alreadyConverted) {
2656
+ // for objects that have already been converted,
2657
+ // emit set events for everything inside
2658
+ emitSet(obj)
2659
+ } else {
2660
+ watch(obj)
2661
+ }
2662
+ }
2663
+
2664
+ /**
2665
+ * Cancel observation, turn off the listeners.
2666
+ */
2667
+ function unobserve (obj, path, observer) {
2668
+
2669
+ if (!obj || !obj.__emitter__) return
2670
+
2671
+ path = path ? path + '.' : ''
2672
+ var proxies = observer.proxies[path]
2673
+ if (!proxies) return
2674
+
2675
+ // turn off listeners
2676
+ obj.__emitter__
2677
+ .off('get', proxies.get)
2678
+ .off('set', proxies.set)
2679
+ .off('mutate', proxies.mutate)
2680
+
2681
+ // remove reference
2682
+ observer.proxies[path] = null
2683
+ }
2684
+
2685
+ // Expose API -----------------------------------------------------------------
2686
+
2687
+ var pub = module.exports = {
2688
+
2689
+ // whether to emit get events
2690
+ // only enabled during dependency parsing
2691
+ shouldGet : false,
2692
+
2693
+ observe : observe,
2694
+ unobserve : unobserve,
2695
+ ensurePath : ensurePath,
2696
+ copyPaths : copyPaths,
2697
+ watch : watch,
2698
+ convert : convert,
2699
+ convertKey : convertKey
2700
+ }
2701
+ });
2702
+ require.register("vue/src/directive.js", function(exports, require, module){
2703
+ var dirId = 1,
2704
+ ARG_RE = /^[\w\$-]+$/,
2705
+ FILTER_TOKEN_RE = /[^\s'"]+|'[^']+'|"[^"]+"/g,
2706
+ NESTING_RE = /^\$(parent|root)\./,
2707
+ SINGLE_VAR_RE = /^[\w\.$]+$/,
2708
+ QUOTE_RE = /"/g,
2709
+ TextParser = require('./text-parser')
2710
+
2711
+ /**
2712
+ * Directive class
2713
+ * represents a single directive instance in the DOM
2714
+ */
2715
+ function Directive (name, ast, definition, compiler, el) {
2716
+
2717
+ this.id = dirId++
2718
+ this.name = name
2719
+ this.compiler = compiler
2720
+ this.vm = compiler.vm
2721
+ this.el = el
2722
+ this.computeFilters = false
2723
+ this.key = ast.key
2724
+ this.arg = ast.arg
2725
+ this.expression = ast.expression
2726
+
2727
+ var isEmpty = this.expression === ''
2728
+
2729
+ // mix in properties from the directive definition
2730
+ if (typeof definition === 'function') {
2731
+ this[isEmpty ? 'bind' : 'update'] = definition
2732
+ } else {
2733
+ for (var prop in definition) {
2734
+ this[prop] = definition[prop]
2735
+ }
2736
+ }
2737
+
2738
+ // empty expression, we're done.
2739
+ if (isEmpty || this.isEmpty) {
2740
+ this.isEmpty = true
2741
+ return
2742
+ }
2743
+
2744
+ if (TextParser.Regex.test(this.key)) {
2745
+ this.key = compiler.eval(this.key)
2746
+ if (this.isLiteral) {
2747
+ this.expression = this.key
2748
+ }
2749
+ }
2750
+
2751
+ var filters = ast.filters,
2752
+ filter, fn, i, l, computed
2753
+ if (filters) {
2754
+ this.filters = []
2755
+ for (i = 0, l = filters.length; i < l; i++) {
2756
+ filter = filters[i]
2757
+ fn = this.compiler.getOption('filters', filter.name)
2758
+ if (fn) {
2759
+ filter.apply = fn
2760
+ this.filters.push(filter)
2761
+ if (fn.computed) {
2762
+ computed = true
2763
+ }
2764
+ }
2765
+ }
2766
+ }
2767
+
2768
+ if (!this.filters || !this.filters.length) {
2769
+ this.filters = null
2770
+ }
2771
+
2772
+ if (computed) {
2773
+ this.computedKey = Directive.inlineFilters(this.key, this.filters)
2774
+ this.filters = null
2775
+ }
2776
+
2777
+ this.isExp =
2778
+ computed ||
2779
+ !SINGLE_VAR_RE.test(this.key) ||
2780
+ NESTING_RE.test(this.key)
2781
+
2782
+ }
2783
+
2784
+ var DirProto = Directive.prototype
2785
+
2786
+ /**
2787
+ * called when a new value is set
2788
+ * for computed properties, this will only be called once
2789
+ * during initialization.
2790
+ */
2791
+ DirProto.$update = function (value, init) {
2792
+ if (this.$lock) return
2793
+ if (init || value !== this.value || (value && typeof value === 'object')) {
2794
+ this.value = value
2795
+ if (this.update) {
2796
+ this.update(
2797
+ this.filters && !this.computeFilters
2798
+ ? this.$applyFilters(value)
2799
+ : value,
2800
+ init
2801
+ )
2802
+ }
2803
+ }
2804
+ }
2805
+
2806
+ /**
2807
+ * pipe the value through filters
2808
+ */
2809
+ DirProto.$applyFilters = function (value) {
2810
+ var filtered = value, filter
2811
+ for (var i = 0, l = this.filters.length; i < l; i++) {
2812
+ filter = this.filters[i]
2813
+ filtered = filter.apply.apply(this.vm, [filtered].concat(filter.args))
2814
+ }
2815
+ return filtered
2816
+ }
2817
+
2818
+ /**
2819
+ * Unbind diretive
2820
+ */
2821
+ DirProto.$unbind = function () {
2822
+ // this can be called before the el is even assigned...
2823
+ if (!this.el || !this.vm) return
2824
+ if (this.unbind) this.unbind()
2825
+ this.vm = this.el = this.binding = this.compiler = null
2826
+ }
2827
+
2828
+ // Exposed static methods -----------------------------------------------------
2829
+
2830
+ /**
2831
+ * Parse a directive string into an Array of
2832
+ * AST-like objects representing directives
2833
+ */
2834
+ Directive.parse = function (str) {
2835
+
2836
+ var inSingle = false,
2837
+ inDouble = false,
2838
+ curly = 0,
2839
+ square = 0,
2840
+ paren = 0,
2841
+ begin = 0,
2842
+ argIndex = 0,
2843
+ dirs = [],
2844
+ dir = {},
2845
+ lastFilterIndex = 0,
2846
+ arg
2847
+
2848
+ for (var c, i = 0, l = str.length; i < l; i++) {
2849
+ c = str.charAt(i)
2850
+ if (inSingle) {
2851
+ // check single quote
2852
+ if (c === "'") inSingle = !inSingle
2853
+ } else if (inDouble) {
2854
+ // check double quote
2855
+ if (c === '"') inDouble = !inDouble
2856
+ } else if (c === ',' && !paren && !curly && !square) {
2857
+ // reached the end of a directive
2858
+ pushDir()
2859
+ // reset & skip the comma
2860
+ dir = {}
2861
+ begin = argIndex = lastFilterIndex = i + 1
2862
+ } else if (c === ':' && !dir.key && !dir.arg) {
2863
+ // argument
2864
+ arg = str.slice(begin, i).trim()
2865
+ if (ARG_RE.test(arg)) {
2866
+ argIndex = i + 1
2867
+ dir.arg = arg
2868
+ }
2869
+ } else if (c === '|' && str.charAt(i + 1) !== '|' && str.charAt(i - 1) !== '|') {
2870
+ if (dir.key === undefined) {
2871
+ // first filter, end of key
2872
+ lastFilterIndex = i + 1
2873
+ dir.key = str.slice(argIndex, i).trim()
2874
+ } else {
2875
+ // already has filter
2876
+ pushFilter()
2877
+ }
2878
+ } else if (c === '"') {
2879
+ inDouble = true
2880
+ } else if (c === "'") {
2881
+ inSingle = true
2882
+ } else if (c === '(') {
2883
+ paren++
2884
+ } else if (c === ')') {
2885
+ paren--
2886
+ } else if (c === '[') {
2887
+ square++
2888
+ } else if (c === ']') {
2889
+ square--
2890
+ } else if (c === '{') {
2891
+ curly++
2892
+ } else if (c === '}') {
2893
+ curly--
2894
+ }
2895
+ }
2896
+ if (i === 0 || begin !== i) {
2897
+ pushDir()
2898
+ }
2899
+
2900
+ function pushDir () {
2901
+ dir.expression = str.slice(begin, i).trim()
2902
+ if (dir.key === undefined) {
2903
+ dir.key = str.slice(argIndex, i).trim()
2904
+ } else if (lastFilterIndex !== begin) {
2905
+ pushFilter()
2906
+ }
2907
+ if (i === 0 || dir.key) {
2908
+ dirs.push(dir)
2909
+ }
2910
+ }
2911
+
2912
+ function pushFilter () {
2913
+ var exp = str.slice(lastFilterIndex, i).trim(),
2914
+ filter
2915
+ if (exp) {
2916
+ filter = {}
2917
+ var tokens = exp.match(FILTER_TOKEN_RE)
2918
+ filter.name = tokens[0]
2919
+ filter.args = tokens.length > 1 ? tokens.slice(1) : null
2920
+ }
2921
+ if (filter) {
2922
+ (dir.filters = dir.filters || []).push(filter)
2923
+ }
2924
+ lastFilterIndex = i + 1
2925
+ }
2926
+
2927
+ return dirs
2928
+ }
2929
+
2930
+ /**
2931
+ * Inline computed filters so they become part
2932
+ * of the expression
2933
+ */
2934
+ Directive.inlineFilters = function (key, filters) {
2935
+ var args, filter
2936
+ for (var i = 0, l = filters.length; i < l; i++) {
2937
+ filter = filters[i]
2938
+ args = filter.args
2939
+ ? ',"' + filter.args.map(escapeQuote).join('","') + '"'
2940
+ : ''
2941
+ key = 'this.$compiler.getOption("filters", "' +
2942
+ filter.name +
2943
+ '").call(this,' +
2944
+ key + args +
2945
+ ')'
2946
+ }
2947
+ return key
2948
+ }
2949
+
2950
+ /**
2951
+ * Convert double quotes to single quotes
2952
+ * so they don't mess up the generated function body
2953
+ */
2954
+ function escapeQuote (v) {
2955
+ return v.indexOf('"') > -1
2956
+ ? v.replace(QUOTE_RE, '\'')
2957
+ : v
2958
+ }
2959
+
2960
+ module.exports = Directive
2961
+ });
2962
+ require.register("vue/src/exp-parser.js", function(exports, require, module){
2963
+ var utils = require('./utils'),
2964
+ STR_SAVE_RE = /"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g,
2965
+ STR_RESTORE_RE = /"(\d+)"/g,
2966
+ NEWLINE_RE = /\n/g,
2967
+ CTOR_RE = new RegExp('constructor'.split('').join('[\'"+, ]*')),
2968
+ UNICODE_RE = /\\u\d\d\d\d/
2969
+
2970
+ // Variable extraction scooped from https://github.com/RubyLouvre/avalon
2971
+
2972
+ var KEYWORDS =
2973
+ // keywords
2974
+ 'break,case,catch,continue,debugger,default,delete,do,else,false' +
2975
+ ',finally,for,function,if,in,instanceof,new,null,return,switch,this' +
2976
+ ',throw,true,try,typeof,var,void,while,with,undefined' +
2977
+ // reserved
2978
+ ',abstract,boolean,byte,char,class,const,double,enum,export,extends' +
2979
+ ',final,float,goto,implements,import,int,interface,long,native' +
2980
+ ',package,private,protected,public,short,static,super,synchronized' +
2981
+ ',throws,transient,volatile' +
2982
+ // ECMA 5 - use strict
2983
+ ',arguments,let,yield' +
2984
+ // allow using Math in expressions
2985
+ ',Math',
2986
+
2987
+ KEYWORDS_RE = new RegExp(["\\b" + KEYWORDS.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g'),
2988
+ REMOVE_RE = /\/\*(?:.|\n)*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|'[^']*'|"[^"]*"|[\s\t\n]*\.[\s\t\n]*[$\w\.]+|[\{,]\s*[\w\$_]+\s*:/g,
2989
+ SPLIT_RE = /[^\w$]+/g,
2990
+ NUMBER_RE = /\b\d[^,]*/g,
2991
+ BOUNDARY_RE = /^,+|,+$/g
2992
+
2993
+ /**
2994
+ * Strip top level variable names from a snippet of JS expression
2995
+ */
2996
+ function getVariables (code) {
2997
+ code = code
2998
+ .replace(REMOVE_RE, '')
2999
+ .replace(SPLIT_RE, ',')
3000
+ .replace(KEYWORDS_RE, '')
3001
+ .replace(NUMBER_RE, '')
3002
+ .replace(BOUNDARY_RE, '')
3003
+ return code
3004
+ ? code.split(/,+/)
3005
+ : []
3006
+ }
3007
+
3008
+ /**
3009
+ * A given path could potentially exist not on the
3010
+ * current compiler, but up in the parent chain somewhere.
3011
+ * This function generates an access relationship string
3012
+ * that can be used in the getter function by walking up
3013
+ * the parent chain to check for key existence.
3014
+ *
3015
+ * It stops at top parent if no vm in the chain has the
3016
+ * key. It then creates any missing bindings on the
3017
+ * final resolved vm.
3018
+ */
3019
+ function traceScope (path, compiler, data) {
3020
+ var rel = '',
3021
+ dist = 0,
3022
+ self = compiler
3023
+
3024
+ if (data && utils.get(data, path) !== undefined) {
3025
+ // hack: temporarily attached data
3026
+ return '$temp.'
3027
+ }
3028
+
3029
+ while (compiler) {
3030
+ if (compiler.hasKey(path)) {
3031
+ break
3032
+ } else {
3033
+ compiler = compiler.parent
3034
+ dist++
3035
+ }
3036
+ }
3037
+ if (compiler) {
3038
+ while (dist--) {
3039
+ rel += '$parent.'
3040
+ }
3041
+ if (!compiler.bindings[path] && path.charAt(0) !== '$') {
3042
+ compiler.createBinding(path)
3043
+ }
3044
+ } else {
3045
+ self.createBinding(path)
3046
+ }
3047
+ return rel
3048
+ }
3049
+
3050
+ /**
3051
+ * Create a function from a string...
3052
+ * this looks like evil magic but since all variables are limited
3053
+ * to the VM's data it's actually properly sandboxed
3054
+ */
3055
+ function makeGetter (exp, raw) {
3056
+ var fn
3057
+ try {
3058
+ fn = new Function(exp)
3059
+ } catch (e) {
3060
+ utils.warn('Error parsing expression: ' + raw)
3061
+ }
3062
+ return fn
3063
+ }
3064
+
3065
+ /**
3066
+ * Escape a leading dollar sign for regex construction
3067
+ */
3068
+ function escapeDollar (v) {
3069
+ return v.charAt(0) === '$'
3070
+ ? '\\' + v
3071
+ : v
3072
+ }
3073
+
3074
+ /**
3075
+ * Parse and return an anonymous computed property getter function
3076
+ * from an arbitrary expression, together with a list of paths to be
3077
+ * created as bindings.
3078
+ */
3079
+ exports.parse = function (exp, compiler, data) {
3080
+ // unicode and 'constructor' are not allowed for XSS security.
3081
+ if (UNICODE_RE.test(exp) || CTOR_RE.test(exp)) {
3082
+ utils.warn('Unsafe expression: ' + exp)
3083
+ return
3084
+ }
3085
+ // extract variable names
3086
+ var vars = getVariables(exp)
3087
+ if (!vars.length) {
3088
+ return makeGetter('return ' + exp, exp)
3089
+ }
3090
+ vars = utils.unique(vars)
3091
+
3092
+ var accessors = '',
3093
+ has = utils.hash(),
3094
+ strings = [],
3095
+ // construct a regex to extract all valid variable paths
3096
+ // ones that begin with "$" are particularly tricky
3097
+ // because we can't use \b for them
3098
+ pathRE = new RegExp(
3099
+ "[^$\\w\\.](" +
3100
+ vars.map(escapeDollar).join('|') +
3101
+ ")[$\\w\\.]*\\b", 'g'
3102
+ ),
3103
+ body = (' ' + exp)
3104
+ .replace(STR_SAVE_RE, saveStrings)
3105
+ .replace(pathRE, replacePath)
3106
+ .replace(STR_RESTORE_RE, restoreStrings)
3107
+
3108
+ body = accessors + 'return ' + body
3109
+
3110
+ function saveStrings (str) {
3111
+ var i = strings.length
3112
+ // escape newlines in strings so the expression
3113
+ // can be correctly evaluated
3114
+ strings[i] = str.replace(NEWLINE_RE, '\\n')
3115
+ return '"' + i + '"'
3116
+ }
3117
+
3118
+ function replacePath (path) {
3119
+ // keep track of the first char
3120
+ var c = path.charAt(0)
3121
+ path = path.slice(1)
3122
+ var val = 'this.' + traceScope(path, compiler, data) + path
3123
+ if (!has[path]) {
3124
+ accessors += val + ';'
3125
+ has[path] = 1
3126
+ }
3127
+ // don't forget to put that first char back
3128
+ return c + val
3129
+ }
3130
+
3131
+ function restoreStrings (str, i) {
3132
+ return strings[i]
3133
+ }
3134
+
3135
+ return makeGetter(body, exp)
3136
+ }
3137
+
3138
+ /**
3139
+ * Evaluate an expression in the context of a compiler.
3140
+ * Accepts additional data.
3141
+ */
3142
+ exports.eval = function (exp, compiler, data) {
3143
+ var getter = exports.parse(exp, compiler, data), res
3144
+ if (getter) {
3145
+ // hack: temporarily attach the additional data so
3146
+ // it can be accessed in the getter
3147
+ compiler.vm.$temp = data
3148
+ res = getter.call(compiler.vm)
3149
+ delete compiler.vm.$temp
3150
+ }
3151
+ return res
3152
+ }
3153
+ });
3154
+ require.register("vue/src/text-parser.js", function(exports, require, module){
3155
+ var openChar = '{',
3156
+ endChar = '}',
3157
+ ESCAPE_RE = /[-.*+?^${}()|[\]\/\\]/g,
3158
+ // lazy require
3159
+ Directive
3160
+
3161
+ exports.Regex = buildInterpolationRegex()
3162
+
3163
+ function buildInterpolationRegex () {
3164
+ var open = escapeRegex(openChar),
3165
+ end = escapeRegex(endChar)
3166
+ return new RegExp(open + open + open + '?(.+?)' + end + '?' + end + end)
3167
+ }
3168
+
3169
+ function escapeRegex (str) {
3170
+ return str.replace(ESCAPE_RE, '\\$&')
3171
+ }
3172
+
3173
+ function setDelimiters (delimiters) {
3174
+ openChar = delimiters[0]
3175
+ endChar = delimiters[1]
3176
+ exports.delimiters = delimiters
3177
+ exports.Regex = buildInterpolationRegex()
3178
+ }
3179
+
3180
+ /**
3181
+ * Parse a piece of text, return an array of tokens
3182
+ * token types:
3183
+ * 1. plain string
3184
+ * 2. object with key = binding key
3185
+ * 3. object with key & html = true
3186
+ */
3187
+ function parse (text) {
3188
+ if (!exports.Regex.test(text)) return null
3189
+ var m, i, token, match, tokens = []
3190
+ /* jshint boss: true */
3191
+ while (m = text.match(exports.Regex)) {
3192
+ i = m.index
3193
+ if (i > 0) tokens.push(text.slice(0, i))
3194
+ token = { key: m[1].trim() }
3195
+ match = m[0]
3196
+ token.html =
3197
+ match.charAt(2) === openChar &&
3198
+ match.charAt(match.length - 3) === endChar
3199
+ tokens.push(token)
3200
+ text = text.slice(i + m[0].length)
3201
+ }
3202
+ if (text.length) tokens.push(text)
3203
+ return tokens
3204
+ }
3205
+
3206
+ /**
3207
+ * Parse an attribute value with possible interpolation tags
3208
+ * return a Directive-friendly expression
3209
+ *
3210
+ * e.g. a {{b}} c => "a " + b + " c"
3211
+ */
3212
+ function parseAttr (attr) {
3213
+ Directive = Directive || require('./directive')
3214
+ var tokens = parse(attr)
3215
+ if (!tokens) return null
3216
+ if (tokens.length === 1) return tokens[0].key
3217
+ var res = [], token
3218
+ for (var i = 0, l = tokens.length; i < l; i++) {
3219
+ token = tokens[i]
3220
+ res.push(
3221
+ token.key
3222
+ ? inlineFilters(token.key)
3223
+ : ('"' + token + '"')
3224
+ )
3225
+ }
3226
+ return res.join('+')
3227
+ }
3228
+
3229
+ /**
3230
+ * Inlines any possible filters in a binding
3231
+ * so that we can combine everything into a huge expression
3232
+ */
3233
+ function inlineFilters (key) {
3234
+ if (key.indexOf('|') > -1) {
3235
+ var dirs = Directive.parse(key),
3236
+ dir = dirs && dirs[0]
3237
+ if (dir && dir.filters) {
3238
+ key = Directive.inlineFilters(
3239
+ dir.key,
3240
+ dir.filters
3241
+ )
3242
+ }
3243
+ }
3244
+ return '(' + key + ')'
3245
+ }
3246
+
3247
+ exports.parse = parse
3248
+ exports.parseAttr = parseAttr
3249
+ exports.setDelimiters = setDelimiters
3250
+ exports.delimiters = [openChar, endChar]
3251
+ });
3252
+ require.register("vue/src/deps-parser.js", function(exports, require, module){
3253
+ var Emitter = require('./emitter'),
3254
+ utils = require('./utils'),
3255
+ Observer = require('./observer'),
3256
+ catcher = new Emitter()
3257
+
3258
+ /**
3259
+ * Auto-extract the dependencies of a computed property
3260
+ * by recording the getters triggered when evaluating it.
3261
+ */
3262
+ function catchDeps (binding) {
3263
+ if (binding.isFn) return
3264
+ utils.log('\n- ' + binding.key)
3265
+ var got = utils.hash()
3266
+ binding.deps = []
3267
+ catcher.on('get', function (dep) {
3268
+ var has = got[dep.key]
3269
+ if (
3270
+ // avoid duplicate bindings
3271
+ (has && has.compiler === dep.compiler) ||
3272
+ // avoid repeated items as dependency
3273
+ // only when the binding is from self or the parent chain
3274
+ (dep.compiler.repeat && !isParentOf(dep.compiler, binding.compiler))
3275
+ ) {
3276
+ return
3277
+ }
3278
+ got[dep.key] = dep
3279
+ utils.log(' - ' + dep.key)
3280
+ binding.deps.push(dep)
3281
+ dep.subs.push(binding)
3282
+ })
3283
+ binding.value.$get()
3284
+ catcher.off('get')
3285
+ }
3286
+
3287
+ /**
3288
+ * Test if A is a parent of or equals B
3289
+ */
3290
+ function isParentOf (a, b) {
3291
+ while (b) {
3292
+ if (a === b) {
3293
+ return true
3294
+ }
3295
+ b = b.parent
3296
+ }
3297
+ }
3298
+
3299
+ module.exports = {
3300
+
3301
+ /**
3302
+ * the observer that catches events triggered by getters
3303
+ */
3304
+ catcher: catcher,
3305
+
3306
+ /**
3307
+ * parse a list of computed property bindings
3308
+ */
3309
+ parse: function (bindings) {
3310
+ utils.log('\nparsing dependencies...')
3311
+ Observer.shouldGet = true
3312
+ bindings.forEach(catchDeps)
3313
+ Observer.shouldGet = false
3314
+ utils.log('\ndone.')
3315
+ }
3316
+
3317
+ }
3318
+ });
3319
+ require.register("vue/src/filters.js", function(exports, require, module){
3320
+ var utils = require('./utils'),
3321
+ get = utils.get,
3322
+ slice = [].slice,
3323
+ QUOTE_RE = /^'.*'$/,
3324
+ filters = module.exports = utils.hash()
3325
+
3326
+ /**
3327
+ * 'abc' => 'Abc'
3328
+ */
3329
+ filters.capitalize = function (value) {
3330
+ if (!value && value !== 0) return ''
3331
+ value = value.toString()
3332
+ return value.charAt(0).toUpperCase() + value.slice(1)
3333
+ }
3334
+
3335
+ /**
3336
+ * 'abc' => 'ABC'
3337
+ */
3338
+ filters.uppercase = function (value) {
3339
+ return (value || value === 0)
3340
+ ? value.toString().toUpperCase()
3341
+ : ''
3342
+ }
3343
+
3344
+ /**
3345
+ * 'AbC' => 'abc'
3346
+ */
3347
+ filters.lowercase = function (value) {
3348
+ return (value || value === 0)
3349
+ ? value.toString().toLowerCase()
3350
+ : ''
3351
+ }
3352
+
3353
+ /**
3354
+ * 12345 => $12,345.00
3355
+ */
3356
+ filters.currency = function (value, sign) {
3357
+ if (!value && value !== 0) return ''
3358
+ sign = sign || '$'
3359
+ var s = Math.floor(value).toString(),
3360
+ i = s.length % 3,
3361
+ h = i > 0 ? (s.slice(0, i) + (s.length > 3 ? ',' : '')) : '',
3362
+ f = '.' + value.toFixed(2).slice(-2)
3363
+ return sign + h + s.slice(i).replace(/(\d{3})(?=\d)/g, '$1,') + f
3364
+ }
3365
+
3366
+ /**
3367
+ * args: an array of strings corresponding to
3368
+ * the single, double, triple ... forms of the word to
3369
+ * be pluralized. When the number to be pluralized
3370
+ * exceeds the length of the args, it will use the last
3371
+ * entry in the array.
3372
+ *
3373
+ * e.g. ['single', 'double', 'triple', 'multiple']
3374
+ */
3375
+ filters.pluralize = function (value) {
3376
+ var args = slice.call(arguments, 1)
3377
+ return args.length > 1
3378
+ ? (args[value - 1] || args[args.length - 1])
3379
+ : (args[value - 1] || args[0] + 's')
3380
+ }
3381
+
3382
+ /**
3383
+ * A special filter that takes a handler function,
3384
+ * wraps it so it only gets triggered on specific keypresses.
3385
+ *
3386
+ * v-on only
3387
+ */
3388
+
3389
+ var keyCodes = {
3390
+ enter : 13,
3391
+ tab : 9,
3392
+ 'delete' : 46,
3393
+ up : 38,
3394
+ left : 37,
3395
+ right : 39,
3396
+ down : 40,
3397
+ esc : 27
3398
+ }
3399
+
3400
+ filters.key = function (handler, key) {
3401
+ if (!handler) return
3402
+ var code = keyCodes[key]
3403
+ if (!code) {
3404
+ code = parseInt(key, 10)
3405
+ }
3406
+ return function (e) {
3407
+ if (e.keyCode === code) {
3408
+ return handler.call(this, e)
3409
+ }
3410
+ }
3411
+ }
3412
+
3413
+ /**
3414
+ * Filter filter for v-repeat
3415
+ */
3416
+ filters.filterBy = function (arr, searchKey, delimiter, dataKey) {
3417
+
3418
+ // allow optional `in` delimiter
3419
+ // because why not
3420
+ if (delimiter && delimiter !== 'in') {
3421
+ dataKey = delimiter
3422
+ }
3423
+
3424
+ // get the search string
3425
+ var search = stripQuotes(searchKey) || this.$get(searchKey)
3426
+ if (!search) return arr
3427
+ search = search.toLowerCase()
3428
+
3429
+ // get the optional dataKey
3430
+ dataKey = dataKey && (stripQuotes(dataKey) || this.$get(dataKey))
3431
+
3432
+ // convert object to array
3433
+ if (!Array.isArray(arr)) {
3434
+ arr = utils.objectToArray(arr)
3435
+ }
3436
+
3437
+ return arr.filter(function (item) {
3438
+ return dataKey
3439
+ ? contains(get(item, dataKey), search)
3440
+ : contains(item, search)
3441
+ })
3442
+
3443
+ }
3444
+
3445
+ filters.filterBy.computed = true
3446
+
3447
+ /**
3448
+ * Sort fitler for v-repeat
3449
+ */
3450
+ filters.orderBy = function (arr, sortKey, reverseKey) {
3451
+
3452
+ var key = stripQuotes(sortKey) || this.$get(sortKey)
3453
+ if (!key) return arr
3454
+
3455
+ // convert object to array
3456
+ if (!Array.isArray(arr)) {
3457
+ arr = utils.objectToArray(arr)
3458
+ }
3459
+
3460
+ var order = 1
3461
+ if (reverseKey) {
3462
+ if (reverseKey === '-1') {
3463
+ order = -1
3464
+ } else if (reverseKey.charAt(0) === '!') {
3465
+ reverseKey = reverseKey.slice(1)
3466
+ order = this.$get(reverseKey) ? 1 : -1
3467
+ } else {
3468
+ order = this.$get(reverseKey) ? -1 : 1
3469
+ }
3470
+ }
3471
+
3472
+ // sort on a copy to avoid mutating original array
3473
+ return arr.slice().sort(function (a, b) {
3474
+ a = get(a, key)
3475
+ b = get(b, key)
3476
+ return a === b ? 0 : a > b ? order : -order
3477
+ })
3478
+
3479
+ }
3480
+
3481
+ filters.orderBy.computed = true
3482
+
3483
+ // Array filter helpers -------------------------------------------------------
3484
+
3485
+ /**
3486
+ * String contain helper
3487
+ */
3488
+ function contains (val, search) {
3489
+ /* jshint eqeqeq: false */
3490
+ if (utils.isObject(val)) {
3491
+ for (var key in val) {
3492
+ if (contains(val[key], search)) {
3493
+ return true
3494
+ }
3495
+ }
3496
+ } else if (val != null) {
3497
+ return val.toString().toLowerCase().indexOf(search) > -1
3498
+ }
3499
+ }
3500
+
3501
+ /**
3502
+ * Test whether a string is in quotes,
3503
+ * if yes return stripped string
3504
+ */
3505
+ function stripQuotes (str) {
3506
+ if (QUOTE_RE.test(str)) {
3507
+ return str.slice(1, -1)
3508
+ }
3509
+ }
3510
+ });
3511
+ require.register("vue/src/transition.js", function(exports, require, module){
3512
+ var endEvents = sniffEndEvents(),
3513
+ config = require('./config'),
3514
+ // batch enter animations so we only force the layout once
3515
+ Batcher = require('./batcher'),
3516
+ batcher = new Batcher(),
3517
+ // cache timer functions
3518
+ setTO = window.setTimeout,
3519
+ clearTO = window.clearTimeout,
3520
+ // exit codes for testing
3521
+ codes = {
3522
+ CSS_E : 1,
3523
+ CSS_L : 2,
3524
+ JS_E : 3,
3525
+ JS_L : 4,
3526
+ CSS_SKIP : -1,
3527
+ JS_SKIP : -2,
3528
+ JS_SKIP_E : -3,
3529
+ JS_SKIP_L : -4,
3530
+ INIT : -5,
3531
+ SKIP : -6
3532
+ }
3533
+
3534
+ // force layout before triggering transitions/animations
3535
+ batcher._preFlush = function () {
3536
+ /* jshint unused: false */
3537
+ var f = document.body.offsetHeight
3538
+ }
3539
+
3540
+ /**
3541
+ * stage:
3542
+ * 1 = enter
3543
+ * 2 = leave
3544
+ */
3545
+ var transition = module.exports = function (el, stage, cb, compiler) {
3546
+
3547
+ var changeState = function () {
3548
+ cb()
3549
+ compiler.execHook(stage > 0 ? 'attached' : 'detached')
3550
+ }
3551
+
3552
+ if (compiler.init) {
3553
+ changeState()
3554
+ return codes.INIT
3555
+ }
3556
+
3557
+ var hasTransition = el.vue_trans === '',
3558
+ hasAnimation = el.vue_anim === '',
3559
+ effectId = el.vue_effect
3560
+
3561
+ if (effectId) {
3562
+ return applyTransitionFunctions(
3563
+ el,
3564
+ stage,
3565
+ changeState,
3566
+ effectId,
3567
+ compiler
3568
+ )
3569
+ } else if (hasTransition || hasAnimation) {
3570
+ return applyTransitionClass(
3571
+ el,
3572
+ stage,
3573
+ changeState,
3574
+ hasAnimation
3575
+ )
3576
+ } else {
3577
+ changeState()
3578
+ return codes.SKIP
3579
+ }
3580
+
3581
+ }
3582
+
3583
+ /**
3584
+ * Togggle a CSS class to trigger transition
3585
+ */
3586
+ function applyTransitionClass (el, stage, changeState, hasAnimation) {
3587
+
3588
+ if (!endEvents.trans) {
3589
+ changeState()
3590
+ return codes.CSS_SKIP
3591
+ }
3592
+
3593
+ // if the browser supports transition,
3594
+ // it must have classList...
3595
+ var onEnd,
3596
+ classList = el.classList,
3597
+ existingCallback = el.vue_trans_cb,
3598
+ enterClass = config.enterClass,
3599
+ leaveClass = config.leaveClass,
3600
+ endEvent = hasAnimation ? endEvents.anim : endEvents.trans
3601
+
3602
+ // cancel unfinished callbacks and jobs
3603
+ if (existingCallback) {
3604
+ el.removeEventListener(endEvent, existingCallback)
3605
+ classList.remove(enterClass)
3606
+ classList.remove(leaveClass)
3607
+ el.vue_trans_cb = null
3608
+ }
3609
+
3610
+ if (stage > 0) { // enter
3611
+
3612
+ // set to enter state before appending
3613
+ classList.add(enterClass)
3614
+ // append
3615
+ changeState()
3616
+ // trigger transition
3617
+ if (!hasAnimation) {
3618
+ batcher.push({
3619
+ execute: function () {
3620
+ classList.remove(enterClass)
3621
+ }
3622
+ })
3623
+ } else {
3624
+ onEnd = function (e) {
3625
+ if (e.target === el) {
3626
+ el.removeEventListener(endEvent, onEnd)
3627
+ el.vue_trans_cb = null
3628
+ classList.remove(enterClass)
3629
+ }
3630
+ }
3631
+ el.addEventListener(endEvent, onEnd)
3632
+ el.vue_trans_cb = onEnd
3633
+ }
3634
+ return codes.CSS_E
3635
+
3636
+ } else { // leave
3637
+
3638
+ if (el.offsetWidth || el.offsetHeight) {
3639
+ // trigger hide transition
3640
+ classList.add(leaveClass)
3641
+ onEnd = function (e) {
3642
+ if (e.target === el) {
3643
+ el.removeEventListener(endEvent, onEnd)
3644
+ el.vue_trans_cb = null
3645
+ // actually remove node here
3646
+ changeState()
3647
+ classList.remove(leaveClass)
3648
+ }
3649
+ }
3650
+ // attach transition end listener
3651
+ el.addEventListener(endEvent, onEnd)
3652
+ el.vue_trans_cb = onEnd
3653
+ } else {
3654
+ // directly remove invisible elements
3655
+ changeState()
3656
+ }
3657
+ return codes.CSS_L
3658
+
3659
+ }
3660
+
3661
+ }
3662
+
3663
+ function applyTransitionFunctions (el, stage, changeState, effectId, compiler) {
3664
+
3665
+ var funcs = compiler.getOption('effects', effectId)
3666
+ if (!funcs) {
3667
+ changeState()
3668
+ return codes.JS_SKIP
3669
+ }
3670
+
3671
+ var enter = funcs.enter,
3672
+ leave = funcs.leave,
3673
+ timeouts = el.vue_timeouts
3674
+
3675
+ // clear previous timeouts
3676
+ if (timeouts) {
3677
+ var i = timeouts.length
3678
+ while (i--) {
3679
+ clearTO(timeouts[i])
3680
+ }
3681
+ }
3682
+
3683
+ timeouts = el.vue_timeouts = []
3684
+ function timeout (cb, delay) {
3685
+ var id = setTO(function () {
3686
+ cb()
3687
+ timeouts.splice(timeouts.indexOf(id), 1)
3688
+ if (!timeouts.length) {
3689
+ el.vue_timeouts = null
3690
+ }
3691
+ }, delay)
3692
+ timeouts.push(id)
3693
+ }
3694
+
3695
+ if (stage > 0) { // enter
3696
+ if (typeof enter !== 'function') {
3697
+ changeState()
3698
+ return codes.JS_SKIP_E
3699
+ }
3700
+ enter(el, changeState, timeout)
3701
+ return codes.JS_E
3702
+ } else { // leave
3703
+ if (typeof leave !== 'function') {
3704
+ changeState()
3705
+ return codes.JS_SKIP_L
3706
+ }
3707
+ leave(el, changeState, timeout)
3708
+ return codes.JS_L
3709
+ }
3710
+
3711
+ }
3712
+
3713
+ /**
3714
+ * Sniff proper transition end event name
3715
+ */
3716
+ function sniffEndEvents () {
3717
+ var el = document.createElement('vue'),
3718
+ defaultEvent = 'transitionend',
3719
+ events = {
3720
+ 'webkitTransition' : 'webkitTransitionEnd',
3721
+ 'transition' : defaultEvent,
3722
+ 'mozTransition' : defaultEvent
3723
+ },
3724
+ ret = {}
3725
+ for (var name in events) {
3726
+ if (el.style[name] !== undefined) {
3727
+ ret.trans = events[name]
3728
+ break
3729
+ }
3730
+ }
3731
+ ret.anim = el.style.animation === ''
3732
+ ? 'animationend'
3733
+ : 'webkitAnimationEnd'
3734
+ return ret
3735
+ }
3736
+
3737
+ // Expose some stuff for testing purposes
3738
+ transition.codes = codes
3739
+ transition.sniff = sniffEndEvents
3740
+ });
3741
+ require.register("vue/src/batcher.js", function(exports, require, module){
3742
+ var utils = require('./utils')
3743
+
3744
+ function Batcher () {
3745
+ this.reset()
3746
+ }
3747
+
3748
+ var BatcherProto = Batcher.prototype
3749
+
3750
+ BatcherProto.push = function (job) {
3751
+ if (!job.id || !this.has[job.id]) {
3752
+ this.queue.push(job)
3753
+ this.has[job.id] = job
3754
+ if (!this.waiting) {
3755
+ this.waiting = true
3756
+ utils.nextTick(utils.bind(this.flush, this))
3757
+ }
3758
+ } else if (job.override) {
3759
+ var oldJob = this.has[job.id]
3760
+ oldJob.cancelled = true
3761
+ this.queue.push(job)
3762
+ this.has[job.id] = job
3763
+ }
3764
+ }
3765
+
3766
+ BatcherProto.flush = function () {
3767
+ // before flush hook
3768
+ if (this._preFlush) this._preFlush()
3769
+ // do not cache length because more jobs might be pushed
3770
+ // as we execute existing jobs
3771
+ for (var i = 0; i < this.queue.length; i++) {
3772
+ var job = this.queue[i]
3773
+ if (!job.cancelled) {
3774
+ job.execute()
3775
+ }
3776
+ }
3777
+ this.reset()
3778
+ }
3779
+
3780
+ BatcherProto.reset = function () {
3781
+ this.has = utils.hash()
3782
+ this.queue = []
3783
+ this.waiting = false
3784
+ }
3785
+
3786
+ module.exports = Batcher
3787
+ });
3788
+ require.register("vue/src/directives/index.js", function(exports, require, module){
3789
+ var utils = require('../utils'),
3790
+ config = require('../config'),
3791
+ transition = require('../transition'),
3792
+ directives = module.exports = utils.hash()
3793
+
3794
+ /**
3795
+ * Nest and manage a Child VM
3796
+ */
3797
+ directives.component = {
3798
+ isLiteral: true,
3799
+ bind: function () {
3800
+ if (!this.el.vue_vm) {
3801
+ this.childVM = new this.Ctor({
3802
+ el: this.el,
3803
+ parent: this.vm
3804
+ })
3805
+ }
3806
+ },
3807
+ unbind: function () {
3808
+ if (this.childVM) {
3809
+ this.childVM.$destroy()
3810
+ }
3811
+ }
3812
+ }
3813
+
3814
+ /**
3815
+ * Binding HTML attributes
3816
+ */
3817
+ directives.attr = {
3818
+ bind: function () {
3819
+ var params = this.vm.$options.paramAttributes
3820
+ this.isParam = params && params.indexOf(this.arg) > -1
3821
+ },
3822
+ update: function (value) {
3823
+ if (value || value === 0) {
3824
+ this.el.setAttribute(this.arg, value)
3825
+ } else {
3826
+ this.el.removeAttribute(this.arg)
3827
+ }
3828
+ if (this.isParam) {
3829
+ this.vm[this.arg] = utils.checkNumber(value)
3830
+ }
3831
+ }
3832
+ }
3833
+
3834
+ /**
3835
+ * Binding textContent
3836
+ */
3837
+ directives.text = {
3838
+ bind: function () {
3839
+ this.attr = this.el.nodeType === 3
3840
+ ? 'nodeValue'
3841
+ : 'textContent'
3842
+ },
3843
+ update: function (value) {
3844
+ this.el[this.attr] = utils.guard(value)
3845
+ }
3846
+ }
3847
+
3848
+ /**
3849
+ * Binding CSS display property
3850
+ */
3851
+ directives.show = function (value) {
3852
+ var el = this.el,
3853
+ target = value ? '' : 'none',
3854
+ change = function () {
3855
+ el.style.display = target
3856
+ }
3857
+ transition(el, value ? 1 : -1, change, this.compiler)
3858
+ }
3859
+
3860
+ /**
3861
+ * Binding CSS classes
3862
+ */
3863
+ directives['class'] = function (value) {
3864
+ if (this.arg) {
3865
+ utils[value ? 'addClass' : 'removeClass'](this.el, this.arg)
3866
+ } else {
3867
+ if (this.lastVal) {
3868
+ utils.removeClass(this.el, this.lastVal)
3869
+ }
3870
+ if (value) {
3871
+ utils.addClass(this.el, value)
3872
+ this.lastVal = value
3873
+ }
3874
+ }
3875
+ }
3876
+
3877
+ /**
3878
+ * Only removed after the owner VM is ready
3879
+ */
3880
+ directives.cloak = {
3881
+ isEmpty: true,
3882
+ bind: function () {
3883
+ var el = this.el
3884
+ this.compiler.observer.once('hook:ready', function () {
3885
+ el.removeAttribute(config.prefix + '-cloak')
3886
+ })
3887
+ }
3888
+ }
3889
+
3890
+ /**
3891
+ * Store a reference to self in parent VM's $
3892
+ */
3893
+ directives.ref = {
3894
+ isLiteral: true,
3895
+ bind: function () {
3896
+ var id = this.expression
3897
+ if (id) {
3898
+ this.vm.$parent.$[id] = this.vm
3899
+ }
3900
+ },
3901
+ unbind: function () {
3902
+ var id = this.expression
3903
+ if (id) {
3904
+ delete this.vm.$parent.$[id]
3905
+ }
3906
+ }
3907
+ }
3908
+
3909
+ directives.on = require('./on')
3910
+ directives.repeat = require('./repeat')
3911
+ directives.model = require('./model')
3912
+ directives['if'] = require('./if')
3913
+ directives['with'] = require('./with')
3914
+ directives.html = require('./html')
3915
+ directives.style = require('./style')
3916
+ directives.partial = require('./partial')
3917
+ directives.view = require('./view')
3918
+ });
3919
+ require.register("vue/src/directives/if.js", function(exports, require, module){
3920
+ var utils = require('../utils')
3921
+
3922
+ /**
3923
+ * Manages a conditional child VM
3924
+ */
3925
+ module.exports = {
3926
+
3927
+ bind: function () {
3928
+
3929
+ this.parent = this.el.parentNode
3930
+ this.ref = document.createComment('vue-if')
3931
+ this.Ctor = this.compiler.resolveComponent(this.el)
3932
+
3933
+ // insert ref
3934
+ this.parent.insertBefore(this.ref, this.el)
3935
+ this.parent.removeChild(this.el)
3936
+
3937
+ if (utils.attr(this.el, 'view')) {
3938
+ utils.warn(
3939
+ 'Conflict: v-if cannot be used together with v-view. ' +
3940
+ 'Just set v-view\'s binding value to empty string to empty it.'
3941
+ )
3942
+ }
3943
+ if (utils.attr(this.el, 'repeat')) {
3944
+ utils.warn(
3945
+ 'Conflict: v-if cannot be used together with v-repeat. ' +
3946
+ 'Use `v-show` or the `filterBy` filter instead.'
3947
+ )
3948
+ }
3949
+ },
3950
+
3951
+ update: function (value) {
3952
+
3953
+ if (!value) {
3954
+ this.unbind()
3955
+ } else if (!this.childVM) {
3956
+ this.childVM = new this.Ctor({
3957
+ el: this.el.cloneNode(true),
3958
+ parent: this.vm
3959
+ })
3960
+ if (this.compiler.init) {
3961
+ this.parent.insertBefore(this.childVM.$el, this.ref)
3962
+ } else {
3963
+ this.childVM.$before(this.ref)
3964
+ }
3965
+ }
3966
+
3967
+ },
3968
+
3969
+ unbind: function () {
3970
+ if (this.childVM) {
3971
+ this.childVM.$destroy()
3972
+ this.childVM = null
3973
+ }
3974
+ }
3975
+ }
3976
+ });
3977
+ require.register("vue/src/directives/repeat.js", function(exports, require, module){
3978
+ var utils = require('../utils'),
3979
+ config = require('../config')
3980
+
3981
+ /**
3982
+ * Binding that manages VMs based on an Array
3983
+ */
3984
+ module.exports = {
3985
+
3986
+ bind: function () {
3987
+
3988
+ this.identifier = '$r' + this.id
3989
+
3990
+ // a hash to cache the same expressions on repeated instances
3991
+ // so they don't have to be compiled for every single instance
3992
+ this.expCache = utils.hash()
3993
+
3994
+ var el = this.el,
3995
+ ctn = this.container = el.parentNode
3996
+
3997
+ // extract child Id, if any
3998
+ this.childId = this.compiler.eval(utils.attr(el, 'ref'))
3999
+
4000
+ // create a comment node as a reference node for DOM insertions
4001
+ this.ref = document.createComment(config.prefix + '-repeat-' + this.key)
4002
+ ctn.insertBefore(this.ref, el)
4003
+ ctn.removeChild(el)
4004
+
4005
+ this.collection = null
4006
+ this.vms = null
4007
+
4008
+ },
4009
+
4010
+ update: function (collection) {
4011
+
4012
+ if (!Array.isArray(collection)) {
4013
+ if (utils.isObject(collection)) {
4014
+ collection = utils.objectToArray(collection)
4015
+ } else {
4016
+ utils.warn('v-repeat only accepts Array or Object values.')
4017
+ }
4018
+ }
4019
+
4020
+ // keep reference of old data and VMs
4021
+ // so we can reuse them if possible
4022
+ this.oldVMs = this.vms
4023
+ this.oldCollection = this.collection
4024
+ collection = this.collection = collection || []
4025
+
4026
+ var isObject = collection[0] && utils.isObject(collection[0])
4027
+ this.vms = this.oldCollection
4028
+ ? this.diff(collection, isObject)
4029
+ : this.init(collection, isObject)
4030
+
4031
+ if (this.childId) {
4032
+ this.vm.$[this.childId] = this.vms
4033
+ }
4034
+
4035
+ },
4036
+
4037
+ init: function (collection, isObject) {
4038
+ var vm, vms = []
4039
+ for (var i = 0, l = collection.length; i < l; i++) {
4040
+ vm = this.build(collection[i], i, isObject)
4041
+ vms.push(vm)
4042
+ if (this.compiler.init) {
4043
+ this.container.insertBefore(vm.$el, this.ref)
4044
+ } else {
4045
+ vm.$before(this.ref)
4046
+ }
4047
+ }
4048
+ return vms
4049
+ },
4050
+
4051
+ /**
4052
+ * Diff the new array with the old
4053
+ * and determine the minimum amount of DOM manipulations.
4054
+ */
4055
+ diff: function (newCollection, isObject) {
4056
+
4057
+ var i, l, item, vm,
4058
+ oldIndex,
4059
+ targetNext,
4060
+ currentNext,
4061
+ nextEl,
4062
+ ctn = this.container,
4063
+ oldVMs = this.oldVMs,
4064
+ vms = []
4065
+
4066
+ vms.length = newCollection.length
4067
+
4068
+ // first pass, collect new reused and new created
4069
+ for (i = 0, l = newCollection.length; i < l; i++) {
4070
+ item = newCollection[i]
4071
+ if (isObject) {
4072
+ item.$index = i
4073
+ if (item.__emitter__ && item.__emitter__[this.identifier]) {
4074
+ // this piece of data is being reused.
4075
+ // record its final position in reused vms
4076
+ item.$reused = true
4077
+ } else {
4078
+ vms[i] = this.build(item, i, isObject)
4079
+ }
4080
+ } else {
4081
+ // we can't attach an identifier to primitive values
4082
+ // so have to do an indexOf...
4083
+ oldIndex = indexOf(oldVMs, item)
4084
+ if (oldIndex > -1) {
4085
+ // record the position on the existing vm
4086
+ oldVMs[oldIndex].$reused = true
4087
+ oldVMs[oldIndex].$data.$index = i
4088
+ } else {
4089
+ vms[i] = this.build(item, i, isObject)
4090
+ }
4091
+ }
4092
+ }
4093
+
4094
+ // second pass, collect old reused and destroy unused
4095
+ for (i = 0, l = oldVMs.length; i < l; i++) {
4096
+ vm = oldVMs[i]
4097
+ item = this.arg
4098
+ ? vm.$data[this.arg]
4099
+ : vm.$data
4100
+ if (item.$reused) {
4101
+ vm.$reused = true
4102
+ delete item.$reused
4103
+ }
4104
+ if (vm.$reused) {
4105
+ // update the index to latest
4106
+ vm.$index = item.$index
4107
+ // the item could have had a new key
4108
+ if (item.$key && item.$key !== vm.$key) {
4109
+ vm.$key = item.$key
4110
+ }
4111
+ vms[vm.$index] = vm
4112
+ } else {
4113
+ // this one can be destroyed.
4114
+ if (item.__emitter__) {
4115
+ delete item.__emitter__[this.identifier]
4116
+ }
4117
+ vm.$destroy()
4118
+ }
4119
+ }
4120
+
4121
+ // final pass, move/insert DOM elements
4122
+ i = vms.length
4123
+ while (i--) {
4124
+ vm = vms[i]
4125
+ item = vm.$data
4126
+ targetNext = vms[i + 1]
4127
+ if (vm.$reused) {
4128
+ nextEl = vm.$el.nextSibling
4129
+ // destroyed VMs' element might still be in the DOM
4130
+ // due to transitions
4131
+ while (!nextEl.vue_vm && nextEl !== this.ref) {
4132
+ nextEl = nextEl.nextSibling
4133
+ }
4134
+ currentNext = nextEl.vue_vm
4135
+ if (currentNext !== targetNext) {
4136
+ if (!targetNext) {
4137
+ ctn.insertBefore(vm.$el, this.ref)
4138
+ } else {
4139
+ nextEl = targetNext.$el
4140
+ // new VMs' element might not be in the DOM yet
4141
+ // due to transitions
4142
+ while (!nextEl.parentNode) {
4143
+ targetNext = vms[nextEl.vue_vm.$index + 1]
4144
+ nextEl = targetNext
4145
+ ? targetNext.$el
4146
+ : this.ref
4147
+ }
4148
+ ctn.insertBefore(vm.$el, nextEl)
4149
+ }
4150
+ }
4151
+ delete vm.$reused
4152
+ delete item.$index
4153
+ delete item.$key
4154
+ } else { // a new vm
4155
+ vm.$before(targetNext ? targetNext.$el : this.ref)
4156
+ }
4157
+ }
4158
+
4159
+ return vms
4160
+ },
4161
+
4162
+ build: function (data, index, isObject) {
4163
+
4164
+ // wrap non-object values
4165
+ var raw, alias,
4166
+ wrap = !isObject || this.arg
4167
+ if (wrap) {
4168
+ raw = data
4169
+ alias = this.arg || '$value'
4170
+ data = {}
4171
+ data[alias] = raw
4172
+ }
4173
+ data.$index = index
4174
+
4175
+ var el = this.el.cloneNode(true),
4176
+ Ctor = this.compiler.resolveComponent(el, data),
4177
+ vm = new Ctor({
4178
+ el: el,
4179
+ data: data,
4180
+ parent: this.vm,
4181
+ compilerOptions: {
4182
+ repeat: true,
4183
+ expCache: this.expCache
4184
+ }
4185
+ })
4186
+
4187
+ if (isObject) {
4188
+ // attach an ienumerable identifier to the raw data
4189
+ (raw || data).__emitter__[this.identifier] = true
4190
+ }
4191
+
4192
+ return vm
4193
+
4194
+ },
4195
+
4196
+ unbind: function () {
4197
+ if (this.childId) {
4198
+ delete this.vm.$[this.childId]
4199
+ }
4200
+ if (this.vms) {
4201
+ var i = this.vms.length
4202
+ while (i--) {
4203
+ this.vms[i].$destroy()
4204
+ }
4205
+ }
4206
+ }
4207
+ }
4208
+
4209
+ // Helpers --------------------------------------------------------------------
4210
+
4211
+ /**
4212
+ * Find an object or a wrapped data object
4213
+ * from an Array
4214
+ */
4215
+ function indexOf (vms, obj) {
4216
+ for (var vm, i = 0, l = vms.length; i < l; i++) {
4217
+ vm = vms[i]
4218
+ if (!vm.$reused && vm.$value === obj) {
4219
+ return i
4220
+ }
4221
+ }
4222
+ return -1
4223
+ }
4224
+ });
4225
+ require.register("vue/src/directives/on.js", function(exports, require, module){
4226
+ var utils = require('../utils')
4227
+
4228
+ /**
4229
+ * Binding for event listeners
4230
+ */
4231
+ module.exports = {
4232
+
4233
+ isFn: true,
4234
+
4235
+ bind: function () {
4236
+ this.context = this.binding.isExp
4237
+ ? this.vm
4238
+ : this.binding.compiler.vm
4239
+ if (this.el.tagName === 'IFRAME' && this.arg !== 'load') {
4240
+ var self = this
4241
+ this.iframeBind = function () {
4242
+ self.el.contentWindow.addEventListener(self.arg, self.handler)
4243
+ }
4244
+ this.el.addEventListener('load', this.iframeBind)
4245
+ }
4246
+ },
4247
+
4248
+ update: function (handler) {
4249
+ if (typeof handler !== 'function') {
4250
+ utils.warn('Directive "v-on:' + this.expression + '" expects a method.')
4251
+ return
4252
+ }
4253
+ this.reset()
4254
+ var vm = this.vm,
4255
+ context = this.context
4256
+ this.handler = function (e) {
4257
+ e.targetVM = vm
4258
+ context.$event = e
4259
+ var res = handler.call(context, e)
4260
+ context.$event = null
4261
+ return res
4262
+ }
4263
+ if (this.iframeBind) {
4264
+ this.iframeBind()
4265
+ } else {
4266
+ this.el.addEventListener(this.arg, this.handler)
4267
+ }
4268
+ },
4269
+
4270
+ reset: function () {
4271
+ var el = this.iframeBind
4272
+ ? this.el.contentWindow
4273
+ : this.el
4274
+ el.removeEventListener(this.arg, this.handler)
4275
+ },
4276
+
4277
+ unbind: function () {
4278
+ this.reset()
4279
+ this.el.removeEventListener('load', this.iframeBind)
4280
+ }
4281
+ }
4282
+ });
4283
+ require.register("vue/src/directives/model.js", function(exports, require, module){
4284
+ var utils = require('../utils'),
4285
+ isIE9 = navigator.userAgent.indexOf('MSIE 9.0') > 0,
4286
+ filter = [].filter
4287
+
4288
+ /**
4289
+ * Returns an array of values from a multiple select
4290
+ */
4291
+ function getMultipleSelectOptions (select) {
4292
+ return filter
4293
+ .call(select.options, function (option) {
4294
+ return option.selected
4295
+ })
4296
+ .map(function (option) {
4297
+ return option.value || option.text
4298
+ })
4299
+ }
4300
+
4301
+ /**
4302
+ * Two-way binding for form input elements
4303
+ */
4304
+ module.exports = {
4305
+
4306
+ bind: function () {
4307
+
4308
+ var self = this,
4309
+ el = self.el,
4310
+ type = el.type,
4311
+ tag = el.tagName
4312
+
4313
+ self.lock = false
4314
+ self.ownerVM = self.binding.compiler.vm
4315
+
4316
+ // determine what event to listen to
4317
+ self.event =
4318
+ (self.compiler.options.lazy ||
4319
+ tag === 'SELECT' ||
4320
+ type === 'checkbox' || type === 'radio')
4321
+ ? 'change'
4322
+ : 'input'
4323
+
4324
+ // determine the attribute to change when updating
4325
+ self.attr = type === 'checkbox'
4326
+ ? 'checked'
4327
+ : (tag === 'INPUT' || tag === 'SELECT' || tag === 'TEXTAREA')
4328
+ ? 'value'
4329
+ : 'innerHTML'
4330
+
4331
+ // select[multiple] support
4332
+ if(tag === 'SELECT' && el.hasAttribute('multiple')) {
4333
+ this.multi = true
4334
+ }
4335
+
4336
+ var compositionLock = false
4337
+ self.cLock = function () {
4338
+ compositionLock = true
4339
+ }
4340
+ self.cUnlock = function () {
4341
+ compositionLock = false
4342
+ }
4343
+ el.addEventListener('compositionstart', this.cLock)
4344
+ el.addEventListener('compositionend', this.cUnlock)
4345
+
4346
+ // attach listener
4347
+ self.set = self.filters
4348
+ ? function () {
4349
+ if (compositionLock) return
4350
+ // if this directive has filters
4351
+ // we need to let the vm.$set trigger
4352
+ // update() so filters are applied.
4353
+ // therefore we have to record cursor position
4354
+ // so that after vm.$set changes the input
4355
+ // value we can put the cursor back at where it is
4356
+ var cursorPos
4357
+ try { cursorPos = el.selectionStart } catch (e) {}
4358
+
4359
+ self._set()
4360
+
4361
+ // since updates are async
4362
+ // we need to reset cursor position async too
4363
+ utils.nextTick(function () {
4364
+ if (cursorPos !== undefined) {
4365
+ el.setSelectionRange(cursorPos, cursorPos)
4366
+ }
4367
+ })
4368
+ }
4369
+ : function () {
4370
+ if (compositionLock) return
4371
+ // no filters, don't let it trigger update()
4372
+ self.lock = true
4373
+
4374
+ self._set()
4375
+
4376
+ utils.nextTick(function () {
4377
+ self.lock = false
4378
+ })
4379
+ }
4380
+ el.addEventListener(self.event, self.set)
4381
+
4382
+ // fix shit for IE9
4383
+ // since it doesn't fire input on backspace / del / cut
4384
+ if (isIE9) {
4385
+ self.onCut = function () {
4386
+ // cut event fires before the value actually changes
4387
+ utils.nextTick(function () {
4388
+ self.set()
4389
+ })
4390
+ }
4391
+ self.onDel = function (e) {
4392
+ if (e.keyCode === 46 || e.keyCode === 8) {
4393
+ self.set()
4394
+ }
4395
+ }
4396
+ el.addEventListener('cut', self.onCut)
4397
+ el.addEventListener('keyup', self.onDel)
4398
+ }
4399
+ },
4400
+
4401
+ _set: function () {
4402
+ this.ownerVM.$set(
4403
+ this.key, this.multi
4404
+ ? getMultipleSelectOptions(this.el)
4405
+ : this.el[this.attr]
4406
+ )
4407
+ },
4408
+
4409
+ update: function (value, init) {
4410
+ /* jshint eqeqeq: false */
4411
+ // sync back inline value if initial data is undefined
4412
+ if (init && value === undefined) {
4413
+ return this._set()
4414
+ }
4415
+ if (this.lock) return
4416
+ var el = this.el
4417
+ if (el.tagName === 'SELECT') { // select dropdown
4418
+ el.selectedIndex = -1
4419
+ if(this.multi && Array.isArray(value)) {
4420
+ value.forEach(this.updateSelect, this)
4421
+ } else {
4422
+ this.updateSelect(value)
4423
+ }
4424
+ } else if (el.type === 'radio') { // radio button
4425
+ el.checked = value == el.value
4426
+ } else if (el.type === 'checkbox') { // checkbox
4427
+ el.checked = !!value
4428
+ } else {
4429
+ el[this.attr] = utils.guard(value)
4430
+ }
4431
+ },
4432
+
4433
+ updateSelect: function (value) {
4434
+ /* jshint eqeqeq: false */
4435
+ // setting <select>'s value in IE9 doesn't work
4436
+ // we have to manually loop through the options
4437
+ var options = this.el.options,
4438
+ i = options.length
4439
+ while (i--) {
4440
+ if (options[i].value == value) {
4441
+ options[i].selected = true
4442
+ break
4443
+ }
4444
+ }
4445
+ },
4446
+
4447
+ unbind: function () {
4448
+ var el = this.el
4449
+ el.removeEventListener(this.event, this.set)
4450
+ el.removeEventListener('compositionstart', this.cLock)
4451
+ el.removeEventListener('compositionend', this.cUnlock)
4452
+ if (isIE9) {
4453
+ el.removeEventListener('cut', this.onCut)
4454
+ el.removeEventListener('keyup', this.onDel)
4455
+ }
4456
+ }
4457
+ }
4458
+ });
4459
+ require.register("vue/src/directives/with.js", function(exports, require, module){
4460
+ var utils = require('../utils')
4461
+
4462
+ /**
4463
+ * Binding for inheriting data from parent VMs.
4464
+ */
4465
+ module.exports = {
4466
+
4467
+ bind: function () {
4468
+
4469
+ var self = this,
4470
+ childKey = self.arg,
4471
+ parentKey = self.key,
4472
+ compiler = self.compiler,
4473
+ owner = self.binding.compiler
4474
+
4475
+ if (compiler === owner) {
4476
+ this.alone = true
4477
+ return
4478
+ }
4479
+
4480
+ if (childKey) {
4481
+ if (!compiler.bindings[childKey]) {
4482
+ compiler.createBinding(childKey)
4483
+ }
4484
+ // sync changes on child back to parent
4485
+ compiler.observer.on('change:' + childKey, function (val) {
4486
+ if (compiler.init) return
4487
+ if (!self.lock) {
4488
+ self.lock = true
4489
+ utils.nextTick(function () {
4490
+ self.lock = false
4491
+ })
4492
+ }
4493
+ owner.vm.$set(parentKey, val)
4494
+ })
4495
+ }
4496
+ },
4497
+
4498
+ update: function (value) {
4499
+ // sync from parent
4500
+ if (!this.alone && !this.lock) {
4501
+ if (this.arg) {
4502
+ this.vm.$set(this.arg, value)
4503
+ } else if (this.vm.$data !== value) {
4504
+ this.vm.$data = value
4505
+ }
4506
+ }
4507
+ }
4508
+
4509
+ }
4510
+ });
4511
+ require.register("vue/src/directives/html.js", function(exports, require, module){
4512
+ var utils = require('../utils'),
4513
+ slice = [].slice
4514
+
4515
+ /**
4516
+ * Binding for innerHTML
4517
+ */
4518
+ module.exports = {
4519
+
4520
+ bind: function () {
4521
+ // a comment node means this is a binding for
4522
+ // {{{ inline unescaped html }}}
4523
+ if (this.el.nodeType === 8) {
4524
+ // hold nodes
4525
+ this.nodes = []
4526
+ }
4527
+ },
4528
+
4529
+ update: function (value) {
4530
+ value = utils.guard(value)
4531
+ if (this.nodes) {
4532
+ this.swap(value)
4533
+ } else {
4534
+ this.el.innerHTML = value
4535
+ }
4536
+ },
4537
+
4538
+ swap: function (value) {
4539
+ var parent = this.el.parentNode,
4540
+ nodes = this.nodes,
4541
+ i = nodes.length
4542
+ // remove old nodes
4543
+ while (i--) {
4544
+ parent.removeChild(nodes[i])
4545
+ }
4546
+ // convert new value to a fragment
4547
+ var frag = utils.toFragment(value)
4548
+ // save a reference to these nodes so we can remove later
4549
+ this.nodes = slice.call(frag.childNodes)
4550
+ parent.insertBefore(frag, this.el)
4551
+ }
4552
+ }
4553
+ });
4554
+ require.register("vue/src/directives/style.js", function(exports, require, module){
4555
+ var prefixes = ['-webkit-', '-moz-', '-ms-']
4556
+
4557
+ /**
4558
+ * Binding for CSS styles
4559
+ */
4560
+ module.exports = {
4561
+
4562
+ bind: function () {
4563
+ var prop = this.arg
4564
+ if (!prop) return
4565
+ if (prop.charAt(0) === '$') {
4566
+ // properties that start with $ will be auto-prefixed
4567
+ prop = prop.slice(1)
4568
+ this.prefixed = true
4569
+ }
4570
+ this.prop = prop
4571
+ },
4572
+
4573
+ update: function (value) {
4574
+ var prop = this.prop
4575
+ if (prop) {
4576
+ var isImportant = value.slice(-10) === '!important'
4577
+ ? 'important'
4578
+ : ''
4579
+ if (isImportant) {
4580
+ value = value.slice(0, -10).trim()
4581
+ }
4582
+ this.el.style.setProperty(prop, value, isImportant)
4583
+ if (this.prefixed) {
4584
+ var i = prefixes.length
4585
+ while (i--) {
4586
+ this.el.style.setProperty(prefixes[i] + prop, value, isImportant)
4587
+ }
4588
+ }
4589
+ } else {
4590
+ this.el.style.cssText = value
4591
+ }
4592
+ }
4593
+
4594
+ }
4595
+ });
4596
+ require.register("vue/src/directives/partial.js", function(exports, require, module){
4597
+ var utils = require('../utils')
4598
+
4599
+ /**
4600
+ * Binding for partials
4601
+ */
4602
+ module.exports = {
4603
+
4604
+ isLiteral: true,
4605
+
4606
+ bind: function () {
4607
+
4608
+ var id = this.expression
4609
+ if (!id) return
4610
+
4611
+ var el = this.el,
4612
+ compiler = this.compiler,
4613
+ partial = compiler.getOption('partials', id)
4614
+
4615
+ if (!partial) {
4616
+ if (id === 'yield') {
4617
+ utils.warn('{{>yield}} syntax has been deprecated. Use <content> tag instead.')
4618
+ }
4619
+ return
4620
+ }
4621
+
4622
+ partial = partial.cloneNode(true)
4623
+
4624
+ // comment ref node means inline partial
4625
+ if (el.nodeType === 8) {
4626
+
4627
+ // keep a ref for the partial's content nodes
4628
+ var nodes = [].slice.call(partial.childNodes),
4629
+ parent = el.parentNode
4630
+ parent.insertBefore(partial, el)
4631
+ parent.removeChild(el)
4632
+ // compile partial after appending, because its children's parentNode
4633
+ // will change from the fragment to the correct parentNode.
4634
+ // This could affect directives that need access to its element's parentNode.
4635
+ nodes.forEach(compiler.compile, compiler)
4636
+
4637
+ } else {
4638
+
4639
+ // just set innerHTML...
4640
+ el.innerHTML = ''
4641
+ el.appendChild(partial)
4642
+
4643
+ }
4644
+ }
4645
+
4646
+ }
4647
+ });
4648
+ require.register("vue/src/directives/view.js", function(exports, require, module){
4649
+ /**
4650
+ * Manages a conditional child VM using the
4651
+ * binding's value as the component ID.
4652
+ */
4653
+ module.exports = {
4654
+
4655
+ bind: function () {
4656
+
4657
+ // track position in DOM with a ref node
4658
+ var el = this.raw = this.el,
4659
+ parent = el.parentNode,
4660
+ ref = this.ref = document.createComment('v-view')
4661
+ parent.insertBefore(ref, el)
4662
+ parent.removeChild(el)
4663
+
4664
+ // cache original content
4665
+ /* jshint boss: true */
4666
+ var node,
4667
+ frag = this.inner = document.createElement('div')
4668
+ while (node = el.firstChild) {
4669
+ frag.appendChild(node)
4670
+ }
4671
+
4672
+ },
4673
+
4674
+ update: function(value) {
4675
+
4676
+ this.unbind()
4677
+
4678
+ var Ctor = this.compiler.getOption('components', value)
4679
+ if (!Ctor) return
4680
+
4681
+ this.childVM = new Ctor({
4682
+ el: this.raw.cloneNode(true),
4683
+ parent: this.vm,
4684
+ compilerOptions: {
4685
+ rawContent: this.inner.cloneNode(true)
4686
+ }
4687
+ })
4688
+
4689
+ this.el = this.childVM.$el
4690
+ if (this.compiler.init) {
4691
+ this.ref.parentNode.insertBefore(this.el, this.ref)
4692
+ } else {
4693
+ this.childVM.$before(this.ref)
4694
+ }
4695
+
4696
+ },
4697
+
4698
+ unbind: function() {
4699
+ if (this.childVM) {
4700
+ this.childVM.$destroy()
4701
+ }
4702
+ }
4703
+
4704
+ }
4705
+ });
4706
+ require.alias("vue/src/main.js", "vue/index.js");
4707
+ if (typeof exports == 'object') {
4708
+ module.exports = require('vue');
4709
+ } else if (typeof define == 'function' && define.amd) {
4710
+ define(function(){ return require('vue'); });
4711
+ } else {
4712
+ window['Vue'] = require('vue');
4713
+ }})();